■BGP経路制御
BGPでマルチホーミング接続をする際、普通に接続するだけなら大して難しくはないのですがその組織によって2つあるうちのどちらかにトラフィックを寄せたいなどの要望がでてくるでしょう。そういった場合にBGPで経路制御を行うことによりトラフィックをある程度コントロールすることができます。
ただし、グローバルASでBGPで完全にトラフィックをコントロールは不可能に近いです。というのも自ASでいくら制御を行ったとしても他ASでそれを上書きする設定などが可能ですし自ASのみならず他ASと連携して動くので、あくまである程度しかコントロールすることはできません。
本来は異なるASに対してそれぞれBGP接続を行うのが一般的ですがわかりやすくするためにここでは以下の構成を前提とします。
■iBGPのネクストホップ
経路制御とは直接関係ないのですが、iBGP経由で受け取った経路はネクストホップアドレスを書き換えません。上の構成でいうとR1のループバックアドレス( 1.1.1.1 )をR2にeBGPでアドバタイズします。この経路をR2はiBGP経由でR3にアドバタイズするのですが、R3にアドバタズしてもネクストホップアドレスは10.10.10.1のままです。R3からみると10.10.10.0/30宛の経路情報は持っていないのでルーティングテーブルにインストールされないという結果になります。
BGPのnext-hop-selfを設定することによりこれを回避することができます。R2で以下のような設定になっています。この場合、BGP経由の経路は一切ルーティングテーブルにインストールされません。上で述べたようにネクストホップアドレスが書き換わらず宛先に対する到達性が確保できていないからです。
【 R2 】 router bgp 200 no synchronization bgp log-neighbor-changes redistribute ospf 110 neighbor 3.3.3.3 remote-as 200 neighbor 3.3.3.3 update-source Loopback0 neighbor 10.10.10.1 remote-as 100 neighbor 10.10.10.1 password cisco 【 R3 】 R3# show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set 2.0.0.0/32 is subnetted, 1 subnets O 2.2.2.2 [110/11] via 192.168.0.1, 02:19:36, FastEthernet0/0 3.0.0.0/32 is subnetted, 1 subnets C 3.3.3.3 is directly connected, Loopback0 4.0.0.0/32 is subnetted, 1 subnets O 4.4.4.4 [110/11] via 192.168.1.1, 02:19:36, FastEthernet0/1 C 192.168.0.0/24 is directly connected, FastEthernet0/0 C 192.168.1.0/24 is directly connected, FastEthernet0/1 |
R2で以下のように設定を加えることでR3はBGP経由の経路を受け取ることができるようになります。もちろんR4にも同等の設定を入れることでR4経由でも経路を受け取ることが可能となります。
【 R2 】 router bgp 200 neighbor 3.3.3.3 next-hop-self 【 R3 】 R3#show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set 1.0.0.0/32 is subnetted, 1 subnets B 1.1.1.1 [200/0] via 2.2.2.2, 00:42:28 2.0.0.0/32 is subnetted, 1 subnets O 2.2.2.2 [110/11] via 192.168.0.1, 03:04:01, FastEthernet0/0 3.0.0.0/32 is subnetted, 1 subnets C 3.3.3.3 is directly connected, Loopback0 4.0.0.0/32 is subnetted, 1 subnets O 4.4.4.4 [110/11] via 192.168.1.1, 03:04:01, FastEthernet0/1 20.0.0.0/30 is subnetted, 1 subnets B 20.20.20.0 [200/0] via 2.2.2.2, 00:42:28 5.0.0.0/32 is subnetted, 1 subnets B 5.5.5.5 [200/0] via 4.4.4.4, 00:14:54 172.16.0.0/24 is subnetted, 1 subnets B 172.16.0.0 [200/0] via 2.2.2.2, 00:42:30 10.0.0.0/30 is subnetted, 1 subnets B 10.10.10.0 [200/0] via 2.2.2.2, 00:42:30 C 192.168.0.0/24 is directly connected, FastEthernet0/0 C 192.168.1.0/24 is directly connected, FastEthernet0/1 |
■経路制御の属性
BGPで経路の重み付けなどの制御を行う場合、主に以下のパラメータを用いることが多いです。
- as-path prepend ( 下り )
- multi exit discriminator( 下り )
- local preference ( 上り )
- weight ( 上り )
- community
ここではas-path / med / local preferenceについて触れていきます。weightは上りトラフィックを制御する属性ですが、そのルータ単体で有効な属性であり実務で使うことはあまりありません。communityでトラフィックを制御することも可能ですが、遠く離れたASを制御することもでき設定はかなり複雑で私もその経験がないため割愛します。
■AS-PATH prepend
BGPで宛先のASに到達するために指標となるのはデフォルトで経由するASの数になり、経由する数が少ない経路が優先して選択されます。ですので経路を広報する際にネイバーに対して遠くにいるように見せかければ、そのネイバーからの下りトラフィックが少なくなることが期待できます。
上の構成でR2からAS100に対して意図的にASを足し、遠くにいるように見せかけることでAS100からのトラフィックはR4経由になります。下記ではAS200を3つ足してAS100のR1に対して遠くにいるように見せかけています。
【 R2 】 route-map prepend permit 10 set as-path prepend 200 200 200 router bgp 200 neighbor 10.10.10.1 route-map prepend out |
この状態でR1のBGPテーブルとルーティングテーブルを確認すると以下のようになります。経由するASの数がR1よりR5のほうが少ないので、AS100の全ての経路に対してR5経由に切り替わります。その結果、AS100からの全ての下りトラフィックはR4経由に切り替わります。
【 R1 】 R1# show ip bgp BGP table version is 20, local router ID is 1.1.1.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path * i1.1.1.1/32 5.5.5.5 11 100 0 ? *> 0.0.0.0 0 32768 ? *>i2.2.2.2/32 5.5.5.5 21 100 0 200 ? * 10.10.10.2 0 0 200 200 200 200 ? *>i3.3.3.3/32 5.5.5.5 11 100 0 200 ? * 10.10.10.2 11 0 200 200 200 200 ? *>i4.4.4.4/32 5.5.5.5 0 100 0 200 ? * 10.10.10.2 21 0 200 200 200 200 ? *> 5.5.5.5/32 172.16.0.2 11 32768 ? * i 5.5.5.5 0 100 0 ? *> 10.10.10.0/30 0.0.0.0 0 32768 ? *>i20.20.20.0/30 5.5.5.5 0 100 0 ? * i172.16.0.0/24 5.5.5.5 0 100 0 ? *> 0.0.0.0 0 32768 ? *>i192.168.0.0 5.5.5.5 20 100 0 200 ? * 10.10.10.2 0 0 200 200 200 200 ? *>i192.168.1.0 5.5.5.5 0 100 0 200 ? Network Next Hop Metric LocPrf Weight Path * 10.10.10.2 20 0 200 200 200 200 ? R1# show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set 1.0.0.0/32 is subnetted, 1 subnets C 1.1.1.1 is directly connected, Loopback0 2.0.0.0/32 is subnetted, 1 subnets B 2.2.2.2 [200/21] via 5.5.5.5, 00:03:32 3.0.0.0/32 is subnetted, 1 subnets B 3.3.3.3 [200/11] via 5.5.5.5, 00:03:32 4.0.0.0/32 is subnetted, 1 subnets B 4.4.4.4 [200/0] via 5.5.5.5, 01:11:00 20.0.0.0/30 is subnetted, 1 subnets B 20.20.20.0 [200/0] via 5.5.5.5, 00:47:02 5.0.0.0/32 is subnetted, 1 subnets O 5.5.5.5 [110/11] via 172.16.0.2, 01:13:42, FastEthernet0/1 172.16.0.0/24 is subnetted, 1 subnets C 172.16.0.0 is directly connected, FastEthernet0/1 10.0.0.0/30 is subnetted, 1 subnets C 10.10.10.0 is directly connected, FastEthernet0/0 B 192.168.0.0/24 [200/20] via 5.5.5.5, 00:03:34 B 192.168.1.0/24 [200/0] via 5.5.5.5, 01:11:02 |
上の例ではroute-mapで全ての経路に対してprependを設定していますが、preifx-listやaccess-listを設定して特定経路のみ設定を行うことも可能です。トラフィックをバランスさせたい場合は自経路を複数の細かいサブネットに分割して上記のような処理をかけることである程度コントロールできます。
■MED ( multi exit discriminator )
略してMED、メッドと呼びます。これはグローバルASのマルチホーム環境ではまず使うことはありません。なぜなら異なるASに対してMEDの属性付をしたところでそれは比較されないからです。MEDが有効なのは同一ASに対してのみ有効です。
MEDが主に使われるのはプライベートASを使った同一ASに2本以上のアップリンクを持つ構成の場合です。そのMEDの設定例が下記です。R2とR4でMED値( set metric )で重み付けをします。MEDは値が低いほうが優先されますのでR2のほうが優先されるということになります。
[ R2 ] route-map med permit 10 set metric 100 router bgp 200 neighbor 10.10.10.1 route-map med out [ R3 ] route-map med permit 10 set metric 200 router bgp 200 neighbor 20.20.20.1 route-map med out |
上記の設定を適用した時、R5のBGPテーブルとルーティングテーブルは以下のようになります。
[ R5 ] R5# show ip bgp BGP table version is 43, local router ID is 5.5.5.5 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 1.1.1.1/32 172.16.0.1 11 32768 ? * i 1.1.1.1 0 100 0 ? *>i2.2.2.2/32 1.1.1.1 100 100 0 200 ? * 20.20.20.2 200 0 200 ? *>i3.3.3.3/32 1.1.1.1 100 100 0 200 ? * 20.20.20.2 200 0 200 ? *>i4.4.4.4/32 1.1.1.1 100 100 0 200 ? * 20.20.20.2 200 0 200 ? * i5.5.5.5/32 1.1.1.1 11 100 0 ? *> 0.0.0.0 0 32768 ? *>i10.10.10.0/30 1.1.1.1 0 100 0 ? *> 20.20.20.0/30 0.0.0.0 0 32768 ? *> 172.16.0.0/24 0.0.0.0 0 32768 ? * i 1.1.1.1 0 100 0 ? *>i192.168.0.0 1.1.1.1 100 100 0 200 ? * 20.20.20.2 200 0 200 ? *>i192.168.1.0 1.1.1.1 100 100 0 200 ? R5# show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set 1.0.0.0/32 is subnetted, 1 subnets O 1.1.1.1 [110/11] via 172.16.0.1, 02:13:44, FastEthernet0/1 2.0.0.0/32 is subnetted, 1 subnets B 2.2.2.2 [200/100] via 1.1.1.1, 00:01:13 3.0.0.0/32 is subnetted, 1 subnets B 3.3.3.3 [200/100] via 1.1.1.1, 00:01:13 4.0.0.0/32 is subnetted, 1 subnets B 4.4.4.4 [200/100] via 1.1.1.1, 00:01:13 20.0.0.0/30 is subnetted, 1 subnets C 20.20.20.0 is directly connected, FastEthernet0/0 5.0.0.0/32 is subnetted, 1 subnets C 5.5.5.5 is directly connected, Loopback0 172.16.0.0/24 is subnetted, 1 subnets C 172.16.0.0 is directly connected, FastEthernet0/1 10.0.0.0/30 is subnetted, 1 subnets B 10.10.10.0 [200/0] via 1.1.1.1, 01:47:18 B 192.168.0.0/24 [200/100] via 1.1.1.1, 00:01:15 B 192.168.1.0/24 [200/100] via 1.1.1.1, 00:01:15 |
AS100からAS200への全ての通信は全てR1を経由して通信することが確認できます。これによりMEDを使って下りトラフィックを制御することが可能となります。また、as-pathと同様に経路ごとにmed値を設定可能なのでバランシングなどの設定を行うことも可能です。
■local preference
local preferenceは上りトラフィックを制御する属性です。weightは機器単体で有効なものであるのに対しlocal-preferenceはAS全体で有効な属性であるため、実務ではこれで上りトラフィックを制御することが多いです。AS200においてAS100に対する上りトラフィックを制御し、全ての上りをR2経由に設定してみます。R2とR4にて次の設定を行います。
[ R2 ] route-map lp permit 10 set local-preference 200 router bgp 200 neighbor 10.10.10.1 route-map lp in [ R4 ] route-map lp permit 10 set local-preference 100 router bgp 200 neighbor 20.20.20.1 route-map lp in |
local preferenceは値が高いほうが優先されます。上記ではR2でネイバーから受け取る経路全てに対してlocal preferenceを200に設定しR1では100と設定することでR2のほうが優先されるように設定しています。このときのR3のBGPとルーティングテーブルは次のようになります。
[ R3 ] R3# show ip bgp BGP table version is 45, local router ID is 3.3.3.3 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *>i1.1.1.1/32 2.2.2.2 0 200 0 100 ? r i2.2.2.2/32 4.4.4.4 21 100 0 ? r>i 2.2.2.2 0 100 0 ? r i3.3.3.3/32 4.4.4.4 11 100 0 ? r>i 2.2.2.2 11 100 0 ? r i4.4.4.4/32 2.2.2.2 21 100 0 ? r>i 4.4.4.4 0 100 0 ? *>i5.5.5.5/32 2.2.2.2 11 200 0 100 ? *>i10.10.10.0/30 2.2.2.2 0 200 0 100 ? *>i20.20.20.0/30 2.2.2.2 0 200 0 100 ? *>i172.16.0.0/24 2.2.2.2 0 200 0 100 ? r i192.168.0.0 4.4.4.4 20 100 0 ? r>i 2.2.2.2 0 100 0 ? r i192.168.1.0 2.2.2.2 20 100 0 ? r>i 4.4.4.4 0 100 0 ? R3# show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set 1.0.0.0/32 is subnetted, 1 subnets B 1.1.1.1 [200/0] via 2.2.2.2, 02:31:02 2.0.0.0/32 is subnetted, 1 subnets O 2.2.2.2 [110/11] via 192.168.0.1, 04:52:34, FastEthernet0/0 3.0.0.0/32 is subnetted, 1 subnets C 3.3.3.3 is directly connected, Loopback0 4.0.0.0/32 is subnetted, 1 subnets O 4.4.4.4 [110/11] via 192.168.1.1, 04:52:34, FastEthernet0/1 20.0.0.0/30 is subnetted, 1 subnets B 20.20.20.0 [200/0] via 2.2.2.2, 02:31:02 5.0.0.0/32 is subnetted, 1 subnets B 5.5.5.5 [200/11] via 2.2.2.2, 00:00:42 172.16.0.0/24 is subnetted, 1 subnets B 172.16.0.0 [200/0] via 2.2.2.2, 02:31:03 10.0.0.0/30 is subnetted, 1 subnets B 10.10.10.0 [200/0] via 2.2.2.2, 02:31:03 C 192.168.0.0/24 is directly connected, FastEthernet0/0 C 192.168.1.0/24 is directly connected, FastEthernet0/1 |
■属性変更時の注意点
上記で紹介したように属性は基本的にroute-mapを使って値をセットします。この設定変更を行なっても即座にそれらは反映されるわけではなく、しばらくして反映されます。即座に反映させたい場合は以下のコマンドを実行する必要があります。
# clear ip bgp [peer ip] soft |
また、上記ではroute-mapでmatch addressなどの条件指定を行なっていませんので全ての経路に適用されます。例えば条件指定 (IP指定) で以下のようにlocal preferenceを設定した場合、192.168.0.0/24に対してlocal preferenceが200に設定されます。
access-list 100 permit ip access-list 10 permit 192.168.0.0 0.0.0.255 route-map lp permit 10 match ip address 10 set local-preference 200 router bgp 200 neighbor 10.10.10.1 route-map lp in |
192.168.0.0/24以外の経路に関してはどうなるのでしょうか?local preferenceはデフォルトのままでネイバーから経路が受信される、というのは間違いです。192.168.0.0/24の経路しか受け取らなくなります。つまりその他の経路はフィルタされてしまうという結果になります。
192.168.0.0/24以外の経路は受け取り、何も設定しないという場合には以下の設定が必要です。
access-list 100 permit ip access-list 10 permit 192.168.0.0 0.0.0.255 route-map lp permit 10 match ip address 10 set local-preference 200 route-map lp perimit 20 router bgp 200 neighbor 10.10.10.1 route-map lp in |
上記のように設定しておくことでフィルタは回避されます。BGPの経路フィルタでprefix-listやas-path listを紹介しましたが、厳密にいうとroute-mapでもフィルタは可能です。