vyattaでBGPを試してみた

OSPF, RIPと合わせてBGPも試してみた。
BGPは内部ルーターとの接続ではなく、外部との接続(インターネット接続など)に使用し、かつ普通の使い方だとISPルーターデフォルトゲートウェイに指定するだけでルーティングが出来てしまうため、使うことが無い。。

ただ、複数のISPと契約してWAN回線の冗長化を行うような時にはBGPを使うことがあるらしいため、そちらを意識して構成してみた。
vyattaでのBGPのマニュアルはこちらになる。
http://www.vyatta.com/downloads/documentation/VC6.1/Vyatta_BGPRef_R6.1_v02.pdf
構成図は次のようになる。

BGPではAS番号の異なる組織間で接続を行うのだが、ここではどちらもプライベートASである64600, 64601を使用している。
セグメントごとの用途としては、192.168.21.0/24 が接続元組織の内部セグメント(インターネット接続用のDMZセグメント??) であり、192.168.24.0/24 がISP側のセグメントという想定である。

なお、今回主にWAN側(192.168.22.0/24, 192.168.23.0/24)のセグメントを経由して、BGPの経路広報を行おうとしているのだが、BGPで広報を行う(eBGP)際には、事前に各ルーターが持っている経路の情報を同期しておく必要がある。
このうち、eBGPの情報はiBGP((内部のBGP、具体的にはvyatta1<=>vyatta2, vyatta3<=>vyatta4間で設定している)経由で同期出来るのだが、各ルーターが持っている内部セグメントのルーティング情報(例えば、vyatta1が192.168.21.0/24, 192.168.22.0/24に接続されているなど)の情報は同期出来無いため、この情報は別途同期する必要がある。マニュアルに合わせて、今回は内部のルーティングの同期にはOSPFを使用した。
※ なお この接続図では同じAS間のルーターは同セグメントで接続されているためOSPFは不要なのかもしれないのだが、、iBGPの接続にはeBGPで使用しているセグメント(192.168.22.0/24, 192.168.23.0/24)へのルーティング経路も必要らしいため、念のため設定している。

他に注意した設定として次の3点がある。

1. OSPF, BGP ではそれぞれIPアドレスと同じ形式でルーターIDを設定する必要がある。今回は192.168.21.0/24のセグメント, 192.168.24.0/24のセグメントの各IPを使用した(マニュアルではループバックに10.0.0.XのIPを振ってOSPFで接続している。。)
2. 冗長化の動作を見てみたかったため、192.168.22.0/24で指定されるWAN(vyatta1, vyatta3がつないである)を優先WANとしている。このため、vyatta1, vyatta3にlocal-pref 200(デフォルトが100で大きいほど優先度が高い)の設定を加えた。
3. BGPで接続を行うインターフェースについては、OSPFを使用する必要が無いため、passive-interfaceとして設定してある。

ルーターの設定ファイルは次のようになった。

vyatta1:
 interfaces {
     ethernet eth0 {
         address 192.168.1.191/24
     }
     ethernet eth2 {
         address 192.168.21.1/24
     }
     ethernet eth3 {
         address 192.168.22.1/24
     }
     loopback lo {
     }
 }
protocols{
 bgp 64600 {
     neighbor 192.168.21.2 {
         remote-as 64600
         update-source 192.168.21.1
     }
     neighbor 192.168.22.3 {
         remote-as 64601
     }
     network 192.168.21.0/24 {
     }
     parameters {
         default {
             local-pref 200
         }
         router-id 192.168.21.1
     }
 }
 ospf {
     area 0.0.0.0 {
         network 192.168.21.0/24
         network 192.168.22.0/24
     }
     parameters {
         abr-type cisco
         router-id 192.168.21.1
     }
     passive-interface eth3
 }
vyatta2:
 interfaces {
     ethernet eth0 {
         address 192.168.21.2/24
     }
     ethernet eth1 {
         address 192.168.23.2/24
     }
     loopback lo {
     }
 }
 protocols {
     bgp 64600 {
         neighbor 192.168.21.1 {
             remote-as 64600
             update-source 192.168.21.2
         }
         neighbor 192.168.23.4 {
             remote-as 64601
         }
         network 192.168.21.0/24 {
         }
         parameters {
             router-id 192.168.21.2
         }
     }
     ospf {
         area 0.0.0.0 {
             network 192.168.21.0/24
             network 192.168.23.0/24
         }
         parameters {
             abr-type cisco
             router-id 192.168.21.2
         }
         passive-interface eth1
     }
 }
vyatta3:
 interfaces {
     ethernet eth0 {
         address 192.168.22.3/24
     }
     ethernet eth1 {
         address 192.168.24.3/24
     }
     loopback lo {
     }
 }
 protocols {
     bgp 64601 {
         neighbor 192.168.22.1 {
             remote-as 64600
         }
         neighbor 192.168.24.4 {
             remote-as 64601
             update-source 192.168.24.3
         }
         network 192.168.24.0/24 {
         }
         parameters {
             default {
                 local-pref 200
             }
             router-id 192.168.24.3
         }
     }
     ospf {
         area 0.0.0.0 {
             network 192.168.22.0/24
             network 192.168.24.0/24
         }
         parameters {
             abr-type cisco
             router-id 192.168.24.3
         }
         passive-interface eth0
     }
 }
vyatta4:
 interfaces {
     ethernet eth0 {
         address 192.168.23.4/24
     }
     ethernet eth1 {
         address 192.168.24.4/24
     }
     loopback lo {
     }
 }
 protocols {
     bgp 64601 {
         neighbor 192.168.23.2 {
             remote-as 64600
         }
         neighbor 192.168.24.3 {
             remote-as 64601
             update-source 192.168.24.4
         }
         network 192.168.24.0/24 {
         }
         parameters {
             router-id 192.168.24.4
         }
     }
     ospf {
         area 0.0.0.0 {
             network 192.168.23.0/24
             network 192.168.24.0/24
         }
         parameters {
             abr-type cisco
             router-id 192.168.24.4
         }
         passive-interface eth0
     }
 }


この状態で、各ルーターの各IPにpingが飛ぶことが確認できた。また、vyatta2からvyatta4にtracerouteを打つと, vyatta1,vyatta3経由で通信が行われており、優先経路が定まっていることが確認できた。

vyatta@vyatta2:~$ traceroute 192.168.24.4
traceroute to 192.168.24.4 (192.168.24.4), 30 hops max, 40 byte packets
 1   (192.168.21.1)  2.897 ms  2.859 ms  2.849 ms
 2   (192.168.22.3)  5.644 ms  5.679 ms  5.672 ms
 3   (192.168.24.4)  7.694 ms  7.724 ms  7.716 ms
vyatta@vyatta2:~$ 

この状態で192.168.22.0/24のセグメント向けのブリッジ(br0x22)をホストOS側で停止してみたところ、およそ140秒後に192.168.23.0/24側のセグメントが優先になり、通信が復旧することが確認できた。(br0x22起動後の復旧には30-40秒程度かかるようだ。。)<<補足>>
1. ホストOS側でのブリッジ作成方法については、こちらを参照。 http://d.hatena.ne.jp/aaabbb_200904/20100130/1264869562
2. デバッグに役立ったコマンド:

show ip bgp
show ip bgp summary
show ip route
tail -f /var/log/messages