はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
今回は、BGPを学ぶ上で非常に重要となるAttribute(属性)について説明していきたいと思います。
BGP記事一覧
そもそもAttribute(属性)とは?
Attribute(属性)とは「BGP経路を制御するための機能」です。
これは、迂回やベストパス(最適経路)の制御、経路集約、経路選択などで利用されることが多い機能となります。
Attribute(属性)には、「Weight(Cisco独自)」や「Local_Preference」、「Origin」、「AS path」、「MED」の5つがあります。
それぞれのAttirbute(属性)についてはこの後説明したいと思います。
Cisco独自で最も優先度の高い「Weight」
このWeight値は「Cisco独自であり一番優先度が高いAttribute(属性)」となります。
この値は、AS内部から他AS向けへの経路を制御するために利用するAttribute(属性)となります。
このAttribute(属性)は、値が大きいほど優先度が高く隣接ルータと情報を交換しません。
では、どんな時に利用するのか?
それは、あるASに属する1つのルータから同一の宛先に対し、複数の経路がある場合に利用します。
このAttribute(属性)を設定するコマンドは以下の通りとなります。
・パターン①
router bgp <AS番号>
neighbor <iPアドレス> weight <weight値>
!
・パターン②(Route-mapを利用)
ip prefix-list <Prefix List名> permit <IPアドレス>/<prefix>
route-map <route-map名> permit 10
match ip address prefix-list <Prefix List名>
set weight <weight値>
!
route-map <route-map名> permit 20
router bgp <AS番号>
neighbor <IPアドレス> route-map <route-map名> in
!
下記の図で、AS10→AS40への経路が「AS30経由とAS20経由」の2つが存在するとします。
そこで、AS30経由をベストパスとして利用したい場合、AS30を経由する経路のWeight値を大きく設定することでベストパスとして選択されます。
BGP共通で一番優先度の高い「Local Preference」
このLocal Preferenceは「各ベンダー独自のAttribute(属性)を除いた共通の中で最も優先度の高いAttribute(属性)」になります。
これは「値が大きいほど優先度が高く、iBGPピアに広報されるAttribute(属性)」となります。
このAttribute(属性)は、Weight値と同様にAS内部から他ASへの経路に対しよく利用されます。
Local Preferenceの一般的な設定方法は、ACLやPrefix-List、Route-mapを作成しネイバーに適用します。
ip prefix-list <prefix list名> <ネットワークアドレス>/<prefix長>
route-map <route-map名> permit 10
match ip address prefix-list <prefix list名>
set local-preference <local pref値>
!
route-map <route-map名> permit 20
router bgp <AS番号>
neighbor <IPアドレス> route-map <route-map名> [in|out]
!
以下の例では、AS40宛経路はAS20とAS30からそれぞれ受信している場合を想定します。
その際、AS20向けのネイバーにLocal Preference値を333とし、AS30向けのネイバーに対しLocal Preference値を222と設定するRoute-mapを適用しています。
この場合、「10.1.0.1」を持つルータからはAS20経由の経路がベストパスとして選択されます。
では、実際の動作を実機で確認していきましょう。
上記の図でも説明した通り、Local Preferenceの設定は「ACL設定→Route-Mapの設定→ネイバーへの適用」の順で実施します。
また、動作確認を実施した構成は以下の通りとなります。
上記の構成で、AS10からAS20向けの経路のベストパスをRouter8/Router4側になるように設定します。
具体的には、Router4上でRouter8から受信する経路に対し、Local Preference値を「200」に設定します。
Local Preferenceの変更前の状態は、Router7/Router2側がベストパスとなっています。
Router1の事前確認(Router2側がベストパス想定)
Router1で「show ip bgp」による状態確認を行いました。
その結果は、「10.0.1.2」を持つRouter2がベストパスとなっていることがわかります。
また、Local Preference値がデフォルトの「100」になっていることがわかります。
Router1#show ip bgp
BGP table version is 82, local router ID is 10.0.1.1
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,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.1.1/32 0.0.0.0 0 32768 i
r>i 10.0.1.2/32 10.0.1.2 0 100 0 i
r>i 10.0.1.3/32 10.0.1.3 0 100 0 i
r>i 10.0.1.4/32 10.0.1.4 0 100 0 i
r>i 10.0.1.5/32 10.0.1.5 0 100 0 i
r>i 10.0.1.6/32 10.0.1.6 0 100 0 i
*>i 10.0.2.7/32 10.0.1.2 0 100 0 20 i ※Router2経由がベストパス
* i 10.0.2.8 0 100 0 20 i
*>i 10.0.2.8/32 10.0.1.2 0 100 0 20 i ※Router2経由がベストパス
* i 10.0.2.8 0 100 0 20 i
*>i 10.0.2.9/32 10.0.1.2 0 100 0 20 i ※Router2経由がベストパス
* i 10.0.2.8 0 100 0 20 i
Router4上でLocal Preference値の設定
ここで、Router4のLocal Preference値を変更していきます。
設定方法は「ACL設定、Route-map設定、ネイバーに対するRoute-mapの反映」を実施します。
今回は「AS20のループバック経路全てを対象」とします。
#ACL設定
Router4(config)#access-list 1 permit 10.0.2.0 0.0.0.255
#Route-Map設定
Router4(config)#route-map local_pref permit 10
Router4(config-route-map)#match ip address 1
Router4(config-route-map)#set local-preference 200
#ネイバーへの適用
Router4(config)#router bgp 10
Router4(config-router)#neighbor 10.0.2.8 route-map local_pref in
上記設定の適用後のデバッグログを見ると、Router4(10.0.1.4)からUPDATEメッセージを受信し、Router8をNexthopとした経路のLocal Preferenceが「200」になっていることがわかります。
また、UPDATEメッセージ受信後、NexthopをRouter2(10.0.1.2)とした経路は削除(Withdraw)されていることがわかります。
Router1#
*Apr 23 06:56:31.444: BGP(0): 10.0.1.4 rcvd UPDATE w/ attr: nexthop 10.0.2.8, origin i, localpref 200, metric 0, merged path 20, AS_PATH
*Apr 23 06:56:31.444: BGP(0): 10.0.1.4 rcvd 10.0.2.7/32
*Apr 23 06:56:31.444: BGP(0): 10.0.1.4 rcvd UPDATE w/ attr: nexthop 10.0.2.8, origin i, localpref 200, metric 0, merged path 20, AS_PATH
*Apr 23 06:56:31.444: BGP(0): 10.0.1.4 rcvd 10.0.2.8/32
*Apr 23 06:56:31.444: BGP(0): 10.0.1.4 rcvd UPDATE w/ attr: nexthop 10.0.2.8, origin i, localpref 200, metric 0, merged path 20, AS_PATH
*Apr 23 06:56:31.444: BGP(0): 10.0.1.4 rcvd 10.0.2.9/32
*Apr 23 06:56:31.444: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.7/32 -> 10.0.2.8(global) to main IP table
*Apr 23 06:56:31.444: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.8/32 -> 10.0.2.8(global) to main IP table
*Apr 23 06:56:31.444: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.9/32 -> 10.0.2.8(global) to main IP table
*Apr 23 06:56:31.447: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.7/32 -- withdrawn
*Apr 23 06:56:31.447: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.8/32 -- withdrawn
*Apr 23 06:56:31.447: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.9/32 -- withdrawn
また、パケットキャプチャによるパケットの中身を見ると、Debugログ通りの結果となっています。
また、各経路の削除(withdraw)もDebug Log通り受信していることがわかります。
Local Preference変更後のRouter1の状態は?
Router4でのLocal Preference値を変更したので、Router1の状態を確認してみましょう。
確認結果は想定通り「Router8(10.0.2.8)」をNexthopとし、Local Prefが200になっていることがわかります。
Router1#show ip bgp
BGP table version is 85, local router ID is 10.0.1.1
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,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.1.1/32 0.0.0.0 0 32768 i
r>i 10.0.1.2/32 10.0.1.2 0 100 0 i
r>i 10.0.1.3/32 10.0.1.3 0 100 0 i
r>i 10.0.1.4/32 10.0.1.4 0 100 0 i
r>i 10.0.1.5/32 10.0.1.5 0 100 0 i
r>i 10.0.1.6/32 10.0.1.6 0 100 0 i
*>i 10.0.2.7/32 10.0.2.8 0 200 0 20 i
*>i 10.0.2.8/32 10.0.2.8 0 200 0 20 i
*>i 10.0.2.9/32 10.0.2.8 0 200 0 20 i
生成元を示す「ORIGIN」
ORIGINは「BGP経路の生成元を示すAttribute(属性)」です。
このAttribute(属性)は、主に「IGP」、「EGP」、「生成元不明」の3つに分けられます。
これらは、基本、デフォルトでどれかに分別されますが、意図的に生成元の情報を変更することも可能となります。
生成元 | 詳細 |
IGP(表記:i) | AS内部でIGPにより生成された経路(BGPでは自己生成や集約経路が該当) |
EGP(表記:e) | AS外部からの経路 |
Incomplete(表記:?) | 生成元が不明な経路(IGPからBGPへRedistributeされた経路等) |
意図的に生成元を変更する場合は、以下のコマンドで実行します
(config)# route-map <map名>
(config-route-map)# match <条件>
(config-route-map)# set origin ( igp | egp | incomplete )
生成元の差によるベストパスの選択を変更したい場合等に利用します。
通過するASを示す「AS PATH」
AS PATHは「通過するASを示すAttirbute(属性)」となります。
このAttribute(属性)は、AS数が少ない経路ほど優先度が高くなります。
また、このAS PATHに自分のAS番号が含まれているかどうかで「ループの有無」を確認しています。
もし、自分のAS番号が含まれている場合、ループしていると判断し他ASに経路広報しない仕様になっています。
また、AS PATH長を意図的に長くしたい場合は、「AS PATH prepends」という機能を利用します。
この機能を利用することで、意図的にベストパスを変更することが可能となります。
設定コマンドは以下の通りとなります。
#ACL設定
access-list <ACL番号> permit 10.0.2.0 0.0.0.255
#Route-Map設定
route-map <Route-Map名> permit 10
match ip address <ACL番号>
set as-path prepend <AS番号>・・・・<AS番号>
!
route-map <Route-Map名> permit 20
#BGP設定
router bgp <AS番号>
neighbor <IPアドレス> route-map <Route-Map名> out
!
上記設定により、AS_PATHのAttribute(属性)にAS番号が追加されます。
実際にPrependを実機で確認してみよう!
Prepend機能を実機で確認するために利用した構成は、以下の図となっています。
Router1のBGPテーブルを確認すると「Router7経由」がベストパスとなっていることがわかります。
また、この時、Pathは「AS 20」のみとなっています。
Router1#show ip bgp
BGP table version is 91, local router ID is 10.0.1.1
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,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.1.1/32 0.0.0.0 0 32768 i
r>i 10.0.1.2/32 10.0.1.2 0 100 0 i
r>i 10.0.1.3/32 10.0.1.3 0 100 0 i
r>i 10.0.1.4/32 10.0.1.4 0 100 0 i
r>i 10.0.1.5/32 10.0.1.5 0 100 0 i
r>i 10.0.1.6/32 10.0.1.6 0 100 0 i
*>i 10.0.2.7/32 10.0.1.2 0 100 0 20 i
* i 10.0.2.8 0 100 0 20 i
*>i 10.0.2.8/32 10.0.1.2 0 100 0 20 i
* i 10.0.2.8 0 100 0 20 i
*>i 10.0.2.9/32 10.0.1.2 0 100 0 20 i
* i 10.0.2.8 0 100 0 20 i
上記の事前確認が終わったところで、以下のコマンドを用いて設定を投入します。
Router7(config)#access-list 1 permit 10.0.2.0 0.0.0.255
Router7(config)#route-map AS_PATH permit 10
Router7(config-route-map)#match ip address 1
Router7(config-route-map)#set as-path prepend 20 20 20
Router7(config)#route-map AS_PATH permit 20
Router7(config)#router bgp 20
Router7(config-router)#neighbor 192.168.1.2 route-map AS_PATH out
Router7(config-router)#end
投入を終えた後のBGPテーブルを確認すると、今度はRouter8経由がベストパスに変更されました。
Router1#show ip bgp
BGP table version is 100, local router ID is 10.0.1.1
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,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.1.1/32 0.0.0.0 0 32768 i
r>i 10.0.1.2/32 10.0.1.2 0 100 0 i
r>i 10.0.1.3/32 10.0.1.3 0 100 0 i
r>i 10.0.1.4/32 10.0.1.4 0 100 0 i
r>i 10.0.1.5/32 10.0.1.5 0 100 0 i
r>i 10.0.1.6/32 10.0.1.6 0 100 0 i
*>i 10.0.2.7/32 10.0.2.8 0 100 0 20 i
*>i 10.0.2.8/32 10.0.2.8 0 100 0 20 i
*>i 10.0.2.9/32 10.0.2.8 0 100 0 20 i
この時のDebug Logを見るとRouter7経由の経路が削除されていることがわかります。
*Apr 23 07:11:01.698: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.7/32 -- withdrawn
*Apr 23 07:11:01.698: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.8/32 -- withdrawn
*Apr 23 07:11:01.698: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.9/32 -- withdrawn
*Apr 23 07:11:01.698: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.7/32 -> 10.0.2.8(global) to main IP table
*Apr 23 07:11:01.698: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.8/32 -> 10.0.2.8(global) to main IP table
*Apr 23 07:11:01.699: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.9/32 -> 10.0.2.8(global) to main IP table
また、設定直後のBGP UPDATEメッセージのパケットを見てみると、Router7→Router2のUPDATE メッセージにPrependの「20 20 20 20」情報が載っていることがわかります。
このように、AS Prependを利用することで意図的にベストパスを制御することが可能となります。
経路制御でよく利用されるイメージの「MED」
MEDは、「下りトラフィック(外部ASから自ASへのトラフィック)を制御するために利用するAttribute(属性)」となります。
このMEDは、値が小さい程優先度が高く、直接接続されているAS間のみで効果を発揮します。
一般的な設定方法は、「Route-map」か「BGP配下に直接設定」のどちらかになります。
主な設定コマンドを以下に記載します。
#Route-Mapでの指定
access-list <ACL番号> permit <IPアドレス>/<サブネット>
route-map <Route-Map名> permit <番号>
match ip address <ACL番号>
set metric <MED値>
!
router bgp <AS番号>
neighbor <IPアドレス> route-map <Route-Map名> out
!
#BGP配下の設定
route bgp <AS番号>
default-metric <MED値>
!
それでは、実機確認をしていきましょう。
今回の確認で利用した構成は以下の図の通りです。
MEDのデフォルト値は「0」のため、設定変更前の状態は「0」になっています。
その上で、Router1ではベストパスがRouter2(Nexthop「10.0.1.2」)となっていることがわかります。
Router1# show ip bgp
BGP table version is 109, local router ID is 10.0.1.1
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,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.1.1/32 0.0.0.0 0 32768 i
r>i 10.0.1.2/32 10.0.1.2 0 100 0 i
r>i 10.0.1.3/32 10.0.1.3 0 100 0 i
r>i 10.0.1.4/32 10.0.1.4 0 100 0 i
r>i 10.0.1.5/32 10.0.1.5 0 100 0 i
r>i 10.0.1.6/32 10.0.1.6 0 100 0 i
*>i 10.0.2.7/32 10.0.1.2 0 100 0 20 i
* i 10.0.2.8 0 100 0 20 i
*>i 10.0.2.8/32 10.0.1.2 0 100 0 20 i
* i 10.0.2.8 0 100 0 20 i
*>i 10.0.2.9/32 10.0.1.2 0 100 0 20 i
* i 10.0.2.8 0 100 0 20 i
以下のコマンドでRouter7にMED値変更の設定を投入していきます。
Router7#conf t
Router7(config)#route-map MED permit 10
Router7(config-route-map)#match ip address 1
Router7(config-route-map)#set metric 100
Router7(config)#router bgp 20
Router7(config-router)#neighbor 192.168.1.2 route-map MED out
Router7(config-router)#end
MEDは直接接続されているルータでのみ確認が可能のため、Router2での確認となります。
BGPテーブルを確認してみると、MED値がRouter7経由の経路(Nexthopが192.168.1.7)が100になっていることがわかります。
Router2#show ip bgp
BGP table version is 129, local router ID is 10.0.1.2
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,
t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
r>i 10.0.1.1/32 10.0.1.1 0 100 0 i
*> 10.0.1.2/32 0.0.0.0 0 32768 i
r>i 10.0.1.3/32 10.0.1.3 0 100 0 i
r>i 10.0.1.4/32 10.0.1.4 0 100 0 i
r>i 10.0.1.5/32 10.0.1.5 0 100 0 i
r>i 10.0.1.6/32 10.0.1.6 0 100 0 i
r 10.0.2.7/32 192.168.1.7 100 0 20 i
r>i 10.0.2.8 0 100 0 20 i
* 10.0.2.8/32 192.168.1.7 100 0 20 i
*>i 10.0.2.8 0 100 0 20 i
* 10.0.2.9/32 192.168.1.7 100 0 20 i
*>i 10.0.2.8 0 100 0 20 i
Debug Logでも以下の出力があり、ベストパスに変化があったことがわかります。
Router2#
*Apr 23 07:28:06.915: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.7/32 -- withdrawn
*Apr 23 07:28:06.915: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.8/32 -- withdrawn
*Apr 23 07:28:06.915: BGP(0): 10.0.1.2 rcv UPDATE about 10.0.2.9/32 -- withdrawn
*Apr 23 07:28:06.915: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.7/32 -> 10.0.2.8(global) to main IP table
*Apr 23 07:28:06.915: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.8/32 -> 10.0.2.8(global) to main IP table
*Apr 23 07:28:06.915: BGP(0): Revise route installing 1 of 1 routes for 10.0.2.9/32 -> 10.0.2.8(global) to main IP table
そして、いつも通りパケットの中身も見てみましょう。
UPDATEメッセージのMED値が100に変わっており、NLRIにも乗っていることがわかります。
最後に
ここまで、BGPの基本的な部分について記事をまとめてきました。個人的にもBGPについてより詳細を理解できてきたなと感じております。
次回は、コミュニティ値をまとめ、その後にMP-BGPやNHT、NHR、BGP-PICといった少し応用編的な部分を投稿していきたいと思います。
コメント