Weight は、Cisco ルータがベストパスを選ぶときに最初に比べる値です。設定したルータの中だけで使われるので、そのルータがどの出口を使うかを手軽に決められます。
この記事では、Weight の特徴を整理したあと、Cisco ルータで neighbor weight によるネイバー単位の設定と、route-map による経路単位の設定を試します。route-map の最後にある暗黙の deny で経路が消える例も確認します。
- Weight の特徴(Cisco 独自、設定したルータの中だけで有効、大きい方を優先)
neighbor weightで、ネイバーから受け取るすべての経路に Weight を設定する方法- route-map で特定の経路だけに Weight を設定する方法と、暗黙の deny の注意点
Weight属性とは
Weight は Cisco 独自の値で、BGP のパス属性ではありません。UPDATE メッセージには載らず、設定したルータの中だけで使われ、他の BGP ルータには伝わりません。同じプレフィックスに複数の経路があるとき、Weight が大きい経路を優先します。
| 項目 | 内容 |
|---|---|
| 値の範囲 | 0〜65535 |
| 既定値 | 他のルータから受け取った経路は 0、自分で生成した経路(network コマンドなど)は 32768 |
| 優先する経路 | 大きい方 |
| 有効な範囲 | 設定したルータの中だけ(他のルータには伝わらない) |
| ベストパス選択での順番 | 1番目(LOCAL_PREF や AS_PATH より先に比べる) |
よく比べられる LOCAL_PREF との違いは次のとおりです。どちらも出口となる経路を選ぶための値ですが、効く範囲が違います。
| 項目 | Weight | LOCAL_PREF |
|---|---|---|
| 種類 | Cisco 独自の値(パス属性ではない) | BGP のパス属性 |
| 効く範囲 | 設定したルータだけ | 同じ AS 内の iBGP ピアに伝わる |
| 既定値 | 0(自分で生成した経路は 32768) | 100 |
| 優先する経路 | 大きい方 | 大きい方 |
検証の構成
AS23 の R2 と R3 の両方から、同じプレフィックス 23.23.23.23/32 を AS6 の R6 へ広告します。初期状態を確認したあと、R6 で Weight を設定し、R3 からの経路が選ばれるようにします。後半では、R2 と R3 に 32.32.32.32/32 を追加し、route-map で 23.23.23.23/32 だけを R3 優先にします。
初期状態の確認
eBGP を設定する
まず Weight を設定せずに、R2・R3 と R6 の間で eBGP を設定します。R2 と R3 は、Loopback23 の 23.23.23.23/32 を network コマンドで広告します。
R2
R2(config)#int loopback23
R2(config-if)#ip add 23.23.23.23 255.255.255.255
R2(config)#router bgp 23
R2(config-router)#network 23.23.23.23 mask 255.255.255.255
R2(config-router)#neighbor 192.168.26.6 remote-as 6
R3
R3(config)#int loopback23
R3(config-if)#ip add 23.23.23.23 255.255.255.255
R3(config)#router bgp 23
R3(config-router)#network 23.23.23.23 mask 255.255.255.255
R3(config-router)#neighbor 192.168.36.6 remote-as 6
R6
R6(config)#router bgp 6 R6(config-router)#neighbor 192.168.26.2 remote-as 23 R6(config-router)#neighbor 192.168.36.3 remote-as 23
R6 の BGP テーブルを確認する
R6
R6#sh ip bgp
BGP table version is 2, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* 23.23.23.23/32 192.168.36.3 0 0 23 i
*> 192.168.26.2 0 0 23 i
R6 は R2 と R3 の両方から 23.23.23.23/32 を受け取り、R2(Next Hop 192.168.26.2)からの経路をベストパスにしています。Weight 列はどちらも 0 です。
経路の詳細も確認します。
R6
R6#sh ip bgp 23.23.23.23 BGP routing table entry for 23.23.23.23/32, version 2 Paths: (2 available, best #2, table default) Advertised to update-groups: 2 23 192.168.36.3 from 192.168.36.3 (3.3.3.3) Origin IGP, metric 0, localpref 100, valid, external 23 192.168.26.2 from 192.168.26.2 (2.2.2.2) Origin IGP, metric 0, localpref 100, valid, external, best
| 表示 | 意味 |
|---|---|
| 2 available, best #2 | 経路が2つあり、2番目に表示されている R2 からの経路がベストパス |
| from 192.168.26.2 (2.2.2.2) | ピアのアドレスと、そのピアのルータID |
| Origin IGP, metric 0, localpref 100 | Origin、MED、LOCAL_PREF は2つの経路で同じ。AS_PATH もどちらも 23 |
Weight、LOCAL_PREF、AS_PATH などがすべて同じなので、比較はベストパス選択の最後のほうまで進みます。Cisco ルータは、どちらも eBGP の経路であれば、ルータIDを比べる前に先に受信した(古い)経路を優先します。そのため、この結果は「ルータIDが小さい R2 が選ばれた」とも「R2 の経路を先に受信した」とも考えられ、この出力だけではどちらで決まったかは判断できません。
neighbor で Weight を設定する
R6 で neighbor weight を設定する
R3 からの経路を優先するように、R6 で R3 のネイバーに Weight を設定します。
R6
R6(config)#router bgp 6
R6(config-router)#neighbor 192.168.36.3 weight 100
neighbor 192.168.36.3 weight 100 は、R3 から受け取るすべての経路の Weight を 100 にします。R2 から受け取る経路は既定値の 0 のままです。
BGP セッションをクリアする
Weight の設定は、設定後に受け取った経路から適用されます。すでに受け取っている経路に反映するため、BGP セッションをクリアします。
R6
R6#clear ip bgp * *Apr 27 14:44:27.595: %BGP-5-ADJCHANGE: neighbor 192.168.26.2 Down User reset *Apr 27 14:44:27.595: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.26.2 IPv4 Unicast topology base removed from session User reset *Apr 27 14:44:27.607: %BGP-5-ADJCHANGE: neighbor 192.168.36.3 Down User reset *Apr 27 14:44:27.611: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.36.3 IPv4 Unicast topology base removed from session User reset *Apr 27 14:44:28.583: %BGP-5-ADJCHANGE: neighbor 192.168.36.3 Up *Apr 27 14:44:28.583: %BGP-5-ADJCHANGE: neighbor 192.168.26.2 Up
clear ip bgp * は、すべての BGP セッションを切断して張り直します(ログの Down User reset と Up)。本番環境では、セッションを切らずに経路を受け取り直す clear ip bgp 192.168.36.3 soft in を使います。
ベストパスが R3 に変わったことを確認する
R6
R6#sh ip bgp
BGP table version is 2, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* 23.23.23.23/32 192.168.26.2 0 0 23 i
*> 192.168.36.3 0 100 23 i
R3(Next Hop 192.168.36.3)からの経路の Weight が 100 になり、ベストパスに変わりました。
R6
R6#sh ip bgp 23.23.23.23
BGP routing table entry for 23.23.23.23/32, version 2
Paths: (2 available, best #2, table default)
Advertised to update-groups:
3
23
192.168.26.2 from 192.168.26.2 (2.2.2.2)
Origin IGP, metric 0, localpref 100, valid, external
23
192.168.36.3 from 192.168.36.3 (3.3.3.3)
Origin IGP, metric 0, localpref 100, weight 100, valid, external, best
| 表示 | 意味 |
|---|---|
| weight 100 | R3 から受け取った経路の Weight。既定値の 0 のときは表示されない |
| external, best | R3 からの経路がベストパスになった。Weight はベストパス選択で最初に比べるので、他の値に関係なく決まる |
route-map で特定の経路だけ Weight を設定する
neighbor weight は、そのネイバーから受け取るすべての経路に効きます。特定の経路だけ Weight を変えたい場合は、route-map を使います。
32.32.32.32/32 を追加する
R2 と R3 に Loopback32(32.32.32.32/32)を追加し、BGP で広告します。
R2
R2(config)#int lo 32
R2(config-if)#ip add 32.32.32.32 255.255.255.255
R2(config)#router bgp 23
R2(config-router)#network 32.32.32.32 mask 255.255.255.255
R3
R3(config)#int lo32
R3(config-if)#ip add 32.32.32.32 255.255.255.255
R3(config)#router bgp 23
R3(config-router)#network 32.32.32.32 mask 255.255.255.255
R6
R6#sh ip bgp
BGP table version is 5, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* 23.23.23.23/32 192.168.26.2 0 0 23 i
*> 192.168.36.3 0 100 23 i
*> 32.32.32.32/32 192.168.36.3 0 100 23 i
* 192.168.26.2 0 0 23 I
STEP 3 の neighbor weight が残っているので、32.32.32.32/32 も R3 からの経路が Weight 100 でベストパスになっています。
neighbor weight を消して route-map を作る
いったん R6 の neighbor weight を削除します。
R6
R6(config)#router bgp 6 R6(config-router)#no neighbor 192.168.36.3 weight 100
次に、23.23.23.23/32 だけ Weight を 100 にする route-map を作ります。
R6
R6(config)#access-list 1 permit 23.23.23.23 0.0.0.0 ! R6(config)#route-map SETWEIGHT permit 10 R6(config-route-map)#match ip address 1 R6(config-route-map)#set weight 100 R6(config-route-map)#route-map SETWEIGHT permit 1000
| 設定 | 意味 |
|---|---|
| access-list 1 permit 23.23.23.23 0.0.0.0 | 23.23.23.23 に一致する ACL。0.0.0.0 はワイルドカードマスクで、1つのアドレスだけを指す |
| route-map SETWEIGHT permit 10 | シーケンス 10。match ip address 1 に一致した経路に set weight 100 を適用する |
| route-map SETWEIGHT permit 1000 | シーケンス 1000。match も set もないので、ここまで来たすべての経路を何も変えずに許可する |
BGP の経路を選ぶときは、ACL の代わりに prefix-list(ip prefix-list)を使うこともよくあります。prefix-list はプレフィックス長まで指定して一致させられます。
route-map を R3 のネイバーに適用する
R6
R6(config)#router bgp 6
R6(config-router)#neighbor 192.168.36.3 route-map SETWEIGHT in
R3 から受け取る(in 方向の)経路に route-map を適用します。適用後は、STEP 4 と同じように BGP セッションをクリアします。
23.23.23.23/32 だけ R3 優先になったことを確認する
R6
R6#sh ip bgp
BGP table version is 3, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 23.23.23.23/32 192.168.36.3 0 100 23 i
* 192.168.26.2 0 0 23 i
* 32.32.32.32/32 192.168.36.3 0 0 23 i
*> 192.168.26.2 0 0 23 i
| プレフィックス | R3 からの経路の Weight | ベストパス |
|---|---|---|
| 23.23.23.23/32 | 100(permit 10 に一致) | R3(192.168.36.3) |
| 32.32.32.32/32 | 0(permit 1000 でそのまま許可) | R2(192.168.26.2) |
route-map SETWEIGHT permit 1000を忘れた場合
route-map のシーケンス 1000 を設定しなかった場合、R6 の BGP テーブルがどうなるかを確認します。
R6
R6(config)#no route-map SETWEIGHT permit 1000
BGP セッションをクリアしたあと、R6 の BGP テーブルを確認します。
R6
R6#sh ip bgp
BGP table version is 3, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* 23.23.23.23/32 192.168.26.2 0 0 23 i
*> 192.168.36.3 0 100 23 i
*> 32.32.32.32/32 192.168.26.2 0 0 23 I
32.32.32.32/32 は R2 からの経路だけになり、R3 からは受け取らなくなりました。route-map の最後には暗黙の deny があり、どのシーケンスにも一致しなかった経路は捨てられます。32.32.32.32/32 はシーケンス 10 の ACL に一致しないので、シーケンス 1000 がないと暗黙の deny で捨てられます。
route-map を Weight の変更のような「値を変えるだけ」の目的で使うときも、最後に match のない permit を入れておかないと、対象外の経路がフィルタされます。経路が届かなくなったときは、ネイバーに適用している route-map の最後に permit があるかを確認します。
まとめ
| 設定 | 対象 | 23.23.23.23/32 | 32.32.32.32/32 |
|---|---|---|---|
neighbor 192.168.36.3 weight 100 | R3 から受け取るすべての経路 | R3 優先 | R3 優先 |
| route-map(permit 10 と permit 1000) | ACL に一致した経路だけ | R3 優先 | R2 からの経路がベストパス(Weight は同じ) |
| route-map(permit 1000 なし) | ACL に一致した経路だけ。それ以外は捨てる | R3 優先 | R3 からは受け取らない |
Weight は Cisco 独自の値で、設定したルータの中だけで有効です。ベストパス選択で最初に比べるため、そのルータが使う出口を確実に決められます。route-map で設定するときは、最後に match のない permit を入れることを忘れないようにします。
コメント