LOCAL_PREFとは
LOCAL_PREF(Type code 5)は、自AS内でどの出口を使うかを揃えるためのパス属性です(BGPパス属性とベストパス選択)。RFC 4271 4.3 e)は「4バイトの符号なし整数のwell-known属性」と定義し、広告する側が自分の選好度(degree of preference)を他の内部ピアに伝えるために使うものだとしています。
| 項目 | 内容 |
|---|---|
| Type code | 5 |
| 分類 | Well-known。iBGPへは必須(required)、eBGPへは禁止 |
| 値 | 4バイトの符号なし整数。大きいほうが優先 |
| 既定値 | 100(RFCの規定ではなく、IOS XRを含む多くの実装の値) |
| 伝わる範囲 | 自AS内のみ(iBGPには載る、eBGPには載らない) |
| 定義 | RFC 4271 4.3 e)・5.1.5・9.1.1 |
LOCAL_PREFは「well-known discretionary」と分類されることが多いのですが、RFC 4271自身はそう書いていません。5節の属性一覧表はLOCAL_PREFを「eBGPは5.1.5を参照、iBGPはrequired」とし、discretionaryの語はMULTI_EXIT_DISCとAGGREGATOR(どちらもoptional属性)に当てています。RFC 4271が「well-known discretionary」と呼んでいるのはATOMIC_AGGREGATEだけです(4.3 f)・5.1.6)。
discretionaryは「付けても付けなくてもよい」と読めますが、LOCAL_PREFの規定はiBGPでは必須・eBGPでは禁止という非対称なものです。この非対称さが属性の性質そのものなので、分類の語ではなく規定で覚えるほうが確実です。
iBGPには必ず載せ、eBGPへは載せない
RFC 4271 5.1.5は次の3点を定めています(コンフェデレーション内は例外)。
| 場面 | 規定 |
|---|---|
| iBGPピアへ広告するとき | LOCAL_PREFを必ず含める(SHALL be included in all UPDATE messages) |
| eBGPピアへ広告するとき | LOCAL_PREFを含めてはならない(MUST NOT include) |
| eBGPピアから受け取ったとき | 含まれていても無視する(MUST be ignored) |
LOCAL_PREFは自ASの中だけで通用する値です。AS境界のルータが外から受け取った経路に値を付けてiBGPで配ることで、AS内のすべてのルータが同じ出口を選びます。隣接ASに入口を選ばせる手段ではありません(それはMED)。
検証ラボでは、R5から届いたUPDATEにLOCAL_PREFが無く、AS境界のR2が入方向ポリシーで200を付け、iBGPでR1・R3に伝わり、R1がR4へ広告するときに再び外れます。
属性ごとの伝わる範囲です。
| 属性 | 伝わる範囲 |
|---|---|
| WEIGHT | そのルータの中だけ(広告に載らない。シスコ独自でRFCの属性ではない) |
LOCAL_PREF | 自AS内だけ(iBGPには載る、eBGPには載らない) |
MULTI_EXIT_DISC(MED) | 隣接ASまで(その先のASへ伝えてはならない) |
AS_PATH | 経路が通るすべてのAS |
入方向ポリシーで設定する理由
RFC 4271 9.1.1は、受け取った経路の選好度をどう決めるかを、学んだ相手で分けています。
| 経路を学んだ相手 | 選好度の決め方 |
|---|---|
| 外部ピア | 設定済みのポリシーから計算する。その戻り値をiBGP再広告のLOCAL_PREFに使わなければならない(MUST be used as the LOCAL_PREF value in any IBGP readvertisement) |
| 内部ピア | LOCAL_PREFの値をそのまま選好度とする。またはローカルのポリシーで計算してもよいが、それは持続的なルーティングループを作りうるとRFCが注記している |
前者が、LOCAL_PREFをeBGPネイバーの入方向ポリシーで設定する根拠です。入方向で決めた値がそのままiBGPのLOCAL_PREFになると規定されています。
後者は、AS内で値を揃えることの意味づけです。内部ピアから来た値を各ルータが勝手に計算し直すと、出口の判断が食い違ってループになりえます。
ベストパス選択での位置づけ
LOCAL_PREFはベストパス選択の2番目で、WEIGHT(シスコ独自)の次、AS_PATH長(4番目)より前です。
| 順位 | 比較項目 |
|---|---|
| 1 | WEIGHT(大きいほう。シスコ独自) |
| 2 | LOCAL_PREF(大きいほう) |
| 3 | 自ASで生成した経路 |
| 4 | AS_PATH長(短いほう) |
| 5 | ORIGIN(IGP < EGP < incomplete) |
| 6 | MED(小さいほう) |
AS_PATHより前なので、AS_PATHが長い経路を意図的に選ばせられます。「遠回りだがこちらの回線のほうが安い/太い」という要求を表現できます。
既定値100と比較の向き
既定値は100です(RFCに規定はなく、IOS XRを含む多くの実装の値)。eBGPから受け取った経路には付いていないので、show bgpのlocalpref 100は受信側が自分で付けた値です。比較の向きはMEDと逆で、大きいほうが優先されます。
| 属性 | 向き | 誰に対する意思表示か |
|---|---|---|
LOCAL_PREF | 大きいほうを選ぶ | 自AS内のルータに「この出口を使え」 |
| MED | 小さいほうを選ぶ | 隣接ASに「この入口を使ってほしい」 |
設定方法
IOS XRでは通常、eBGPネイバーの入方向ポリシーでset local-preferenceを使います。
route-policy <ポリシー名>
set local-preference <値>
pass
end-policy
!
router bgp <AS番号>
neighbor <eBGPピアのアドレス>
address-family ipv4 unicast
route-policy <ポリシー名> inルータ全体の既定値を変えるコマンドもあります。
router bgp <AS番号>
bgp default local-preference <値>ただし既定値の変更は、そのルータの判断だけを即座に変えます。 BGPが経路を広告し直すのはベストパスが入れ替わったときなので、値が変わるだけではiBGPピアへUPDATEが出ません。AS内へ伝えるにはclear bgp ipv4 unicast <ピア> soft outで広告し直させます。撤去したときも同じで、自分は戻ってもピア側には古い値が残ります。どちらも検証で確かめます。
実機での検証
XRd 26.1.1を5台使い、2本のラボで次を確認します。
LOCAL_PREFがAS_PATH長より優先される- 付けた値がiBGPで伝わり、AS内のすべてのルータが同じ出口を向く
- 同点なら次の比較項目(
AS_PATH長)で決まる - eBGPピアへは載らない(出方向ポリシーで設定しても無視される)
- 既定値(100)より小さい値を付けると、その経路が負ける
- ルータ全体の既定値を変えても、そのままではAS内に伝わらない。出方向のリフレッシュで伝わり、撤去しても古い値が残る
- R4(AS 65002)が
192.168.4.0/24を広告し、AS 65001がどちらの出口から取るかを追います - AS 65001から見た経路は2つ。R1から直接出る
65002(短い)と、R2からAS 65003を経由する65003 65002(長い) - R3はAS境界ではなく、内部のルータがどちらを向くかが
LOCAL_PREFがAS全体に効く指標です - iBGPはLoopback0どうしのフルメッシュで
next-hop-self付き
| ルータ | AS | 役割 | 広告するネットワーク |
|---|---|---|---|
| R1 | 65001 | AS境界(R4とeBGP) | 192.168.1.0/24 |
| R2 | 65001 | AS境界(R5とeBGP) | 192.168.2.0/24 |
| R3 | 65001 | 内部(iBGPのみ) | 192.168.3.0/24 |
| R4 | 65002 | R1・R5とeBGP | 192.168.4.0/24 |
| R5 | 65003 | R2・R4とeBGP | 192.168.5.0/24 |
設定を変えるのはR1とR2だけです。
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 初期状態(ポリシーはpassのみ) | AS_PATHが短いR1経由が選ばれ、R3もR1を向く |
| 1 | R2のR5向け入方向にLOCAL_PREF 200 | AS_PATHが長いR2経由に変わる。R3もR2を向く=AS全体に効く |
| 2 | R1のR4向け入方向にもLOCAL_PREF 200 | 同点なら次の比較項目(AS_PATH長)で決まる=R1経由に戻る |
| 3 | R1のR4向け出方向にset local-preference 200 | eBGPへは載らない(警告のsyslogが出る。pcapにも属性が無い) |
| 4 | すべて撤去 | STEP 0の状態に戻る。iBGPのUPDATEの値も100に戻る |
| 5 | R2のR5向け入方向をLOCAL_PREF 50 | 既定値100より小さい値を付けた側が負ける |
| 6 | R1にbgp default local-preference 150 | R1だけが150になり、R2・R3には伝わらない |
各STEPでR1 - R3間・R2 - R3間(iBGP)、R1 - R4間・R2 - R5間(eBGP)の4区間のキャプチャーを取っています。
STEP 0:AS_PATHが短いR1経由が選ばれる
内部のR3では、192.168.4.0/24は10.0.0.1(R1)経由でLocPrfは100です。
RP/0/RP0/CPU0:R3#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 100 0 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*>i192.168.4.0/24 10.0.0.1 0 100 0 65002 i
*>i192.168.5.0/24 10.0.0.2 0 100 0 65003 i
<snip>
Processed 5 prefixes, 5 pathsR3が持つ192.168.4.0/24は1経路だけです。 R2も同じ経路をiBGPで受け取っていますが、iBGPで学んだ経路は他のiBGPピアへ再広告されないため、R2はR1・R3へ何も渡しません。R3の1経路がどちらを向いているかが、AS全体の判断を表します。
2経路を持つのはR2だけです。自分のeBGP(65003 65002)とR1から来たiBGP(65002)で、LOCAL_PREFが同点なのでAS_PATH長で決まります。R2は目の前の回線を使わず、短いR1経由を選んでいます。
RP/0/RP0/CPU0:R2#show bgp 192.168.4.0/24
<snip>
Paths: (2 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.0.0.1 (metric 3) from 10.0.0.1 (10.0.0.1)
Origin IGP, metric 0, localpref 100, valid, internal, best, group-best
<snip>
Path #2: Received by speaker 0
<snip>
65003 65002, (received & used)
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 100, valid, external, group-bestR3からのtracerouteはR1経由の2ホップです。
RP/0/RP0/CPU0:R3#traceroute 192.168.4.1 source 192.168.3.1 probe 3 timeout 1 maxttl 5
<snip>
Type escape sequence to abort.
Tracing the route to 192.168.4.1
<snip>
1 10.1.3.1 6 msec 4 msec 4 msec
2 10.1.4.4 38 msec * 10 msec STEP 1:AS_PATHが長いほうを選ばせる
R2がR5から受け取る経路にLOCAL_PREF 200を付けます。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Mon Oct 5 23:14:12.626 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
route-policy FROM-R5
set local-preference 200
pass
end-policy
!
endR2のベストパスが自分のeBGP経路(65003 65002、localpref 200)に入れ替わります。同じ経路が2つ並んでいるのは、入方向ポリシーの適用後(Path #1)と、soft-reconfiguration inbound alwaysが保持している受信したままの状態(Path #2の(received-only)、localpref 100)が別々に数えられるためです。届いた時点ではLOCAL_PREFが無く、R2が既定値100を付けていたことが分かります。
RP/0/RP0/CPU0:R2#show bgp 192.168.4.0/24
<snip>
Paths: (2 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65003 65002
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 200, valid, external, best, group-best
<snip>
Path #2: Received by speaker 0
<snip>
65003 65002, (received-only)
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 100, valid, external設定していないR3もこの値に従います。 R3の経路はR2経由に変わり、AS_PATHは長いほうの65003 65002です。
RP/0/RP0/CPU0:R3#show bgp 192.168.4.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65003 65002, (received & used)
10.0.0.2 (metric 2) from 10.0.0.2 (10.0.0.2)
Origin IGP, localpref 200, valid, internal, best, group-best転送も変わります。R3は3ホップ(R2 → R5 → R4)になり、R4と直接つながっているR1でさえ目の前の回線を使わず、AS内を逆走してR2から出ていきます(4ホップ)。
RP/0/RP0/CPU0:R3#traceroute 192.168.4.1 source 192.168.3.1 probe 3 timeout 1 maxttl 5
<snip>
Type escape sequence to abort.
Tracing the route to 192.168.4.1
<snip>
1 10.2.3.2 6 msec 5 msec 5 msec
2 10.2.5.5 32 msec 8 msec 8 msec
3 10.4.5.4 11 msec * 11 msec RP/0/RP0/CPU0:R1#traceroute 192.168.4.1 source 192.168.1.1 probe 3 timeout 1 maxttl 5
<snip>
Type escape sequence to abort.
Tracing the route to 192.168.4.1
<snip>
1 10.1.3.3 7 msec 5 msec 5 msec
2 10.2.3.2 9 msec 53 msec 8 msec
3 10.2.5.5 14 msec 11 msec 11 msec
4 10.4.5.4 43 msec * 11 msec AS内のiBGPには値が載っています。R2 - R3間のNo.11はR2がR3へ送ったUPDATEで、LOCAL_PREF: 200が入っています。
Border Gateway Protocol - UPDATE Message
<snip>
Path Attribute - MP_REACH_NLRI
<snip>
Next hop: 10.0.0.2
<snip>
MP Reach NLRI IPv4 prefix: 192.168.4.0
Path Attribute - ORIGIN: IGP
<snip>
Origin: IGP (0)
Path Attribute - AS_PATH: 65003 65002
<snip>
AS Path segment: 65003 65002
<snip>
Path Attribute - LOCAL_PREF: 200
<snip>
Local preference: 200一方、隣接ASのR4には何も伝わっていません。 R4が持つAS 65001由来の経路はlocalpref 100(R4自身が付けた値)のままです。
RP/0/RP0/CPU0:R4#show bgp 192.168.1.0/24
<snip>
Paths: (2 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65001, (received & used)
10.1.4.1 from 10.1.4.1 (10.0.0.1)
Origin IGP, metric 0, localpref 100, valid, external, best, group-best
<snip>
Path #2: Received by speaker 0
<snip>
65003 65001, (received & used)
10.4.5.5 from 10.4.5.5 (10.0.0.5)
Origin IGP, localpref 100, valid, external, group-bestSTEP 2:同点にすると次の比較項目で決まる
R1のR4向け入方向にもLOCAL_PREF 200を入れて同点にします。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Oct 5 23:21:00.163 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
route-policy FROM-R4
set local-preference 200
pass
end-policy
!
endR2のPath #1(R1からのiBGP、65002)とPath #2(自分のeBGP、65003 65002)がどちらもlocalpref 200になり、次のAS_PATH長で短いPath #1がベストになります。
RP/0/RP0/CPU0:R2#show bgp 192.168.4.0/24
<snip>
Paths: (3 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.0.0.1 (metric 3) from 10.0.0.1 (10.0.0.1)
Origin IGP, metric 0, localpref 200, valid, internal, best, group-best
<snip>
Path #2: Received by speaker 0
<snip>
65003 65002
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 200, valid, external, group-best
<snip>
Path #3: Received by speaker 0
<snip>
65003 65002, (received-only)
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 100, valid, externalPaths: (3 available)の3は経路の本数ではありません。 使っている経路が2つ(R1からのiBGPと自分のeBGP)で、残り1つは入方向ポリシー適用前の(received-only)です。soft-reconfiguration inbound alwaysを入れているルータで入方向ポリシーを使うと、この数が1つ増えます。
R3もR1経由に戻り、localpref 200、AS_PATHは65002です。
RP/0/RP0/CPU0:R3#show bgp 192.168.4.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.0.0.1 (metric 2) from 10.0.0.1 (10.0.0.1)
Origin IGP, metric 0, localpref 200, valid, internal, best, group-bestSTEP 3:出方向ポリシーで設定してもeBGPへは載らない
R1のR4向け出方向にset local-preference 200を適用します。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Oct 5 23:27:42.872 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
route-policy TO-R4
set local-preference 200
pass
end-policy
!
endIOS XRはcommitを通しますが、適用した瞬間に警告のsyslogを出します。
RP/0/RP0/CPU0:R1#show logging start Oct 5 23:23:48
<snip>
RP/0/RP0/CPU0:Oct 5 23:27:42.066 UTC: bgp[1084]: %ROUTING-BGP-4-POLICY_EBGP : Local-preference modification operations in Outbound IPv4 Unicast policy "TO-R4" will be ignored for external neighbor/update-group default/0:0.4 「外部ネイバー向け出方向ポリシーのLOCAL_PREF変更は無視される」と明示されています。
pcapでも同じです。R1 - R4間のNo.1は適用直後にR1がR4へ送ったUPDATEで、ORIGIN / AS_PATH / MULTI_EXIT_DISCは入っていますが、LOCAL_PREFはありません。
Border Gateway Protocol - UPDATE Message
<snip>
Path Attribute - MP_REACH_NLRI
<snip>
Next hop: 10.1.4.1
<snip>
MP Reach NLRI IPv4 prefix: 192.168.1.0
Path Attribute - ORIGIN: IGP
<snip>
Origin: IGP (0)
Path Attribute - AS_PATH: 65001
<snip>
AS Path segment: 65001
<snip>
Path Attribute - MULTI_EXIT_DISC: 0全STEPを通して数えると、iBGPの2区間は経路を広告したUPDATEすべてにLOCAL_PREFが入り、eBGPの2区間は1つも入っていません。
| キャプチャーした区間 | 経路を広告したUPDATE | うちLOCAL_PREFを含む |
|---|---|---|
| R1 - R3間(iBGP) | 12 | 12 |
| R2 - R3間(iBGP) | 12 | 12 |
| R1 - R4間(eBGP) | 3 | 0 |
| R2 - R5間(eBGP) | 3 | 0 |
STEP 4:ポリシーを撤去する
R1・R2からポリシーを撤去します。running-configの内容は(変更時刻の行を除いて)STEP 0と同じに戻ります。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Oct 5 23:34:24.175 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
route-policy TO-R4
pass
end-policy
!
route-policy FROM-R4
pass
end-policy
!
endRP/0/RP0/CPU0:R2#show configuration commit changes last 1
Mon Oct 5 23:34:31.769 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
route-policy FROM-R5
pass
end-policy
!
endR3の192.168.4.0/24はR1経由の65002に戻り、LocPrfも100です。
RP/0/RP0/CPU0:R3#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 100 0 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*>i192.168.4.0/24 10.0.0.1 0 100 0 65002 i
*>i192.168.5.0/24 10.0.0.2 0 100 0 65003 i
<snip>
Processed 5 prefixes, 5 paths撤去でベストパスが入れ替わるので、R1は経路を配り直します。R1 - R3間のNo.6でLOCAL_PREFが100に戻っています。既定値100はこのようにAS境界のルータが付けた値です。
Border Gateway Protocol - UPDATE Message
<snip>
Path Attribute - MP_REACH_NLRI
<snip>
Next hop: 10.0.0.1
<snip>
MP Reach NLRI IPv4 prefix: 192.168.4.0
Path Attribute - ORIGIN: IGP
<snip>
Origin: IGP (0)
Path Attribute - AS_PATH: 65002
<snip>
AS Path segment: 65002
<snip>
Path Attribute - MULTI_EXIT_DISC: 0
<snip>
Path Attribute - LOCAL_PREF: 100
<snip>
Local preference: 100BGP AS_PATH属性では同点のeBGP経路で既存のベストパスが維持されて戻りませんでしたが、ここは上位の比較項目そのものが変わるので撤去した時点で戻ります。
STEP 5:既定値より小さい値を付けると負ける
R2のR5向け入方向をLOCAL_PREF 50にします。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Mon Oct 5 23:41:12.642 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
route-policy FROM-R5
set local-preference 50
pass
end-policy
!
end主題の192.168.4.0/24ではR2の経路がもともと負けているので表示は変わりません。効果が出るのはR5自身の192.168.5.0/24です。 STEP 4までは3台ともR2経由(65003、1ホップのAS)でしたが、R2の経路が50になったことで、R1がR4から受け取った遠回りの経路(65002 65003、localpref 100)がAS全体で勝ちます。
RP/0/RP0/CPU0:R1#show bgp 192.168.5.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002 65003, (received & used)
10.1.4.4 from 10.1.4.4 (10.0.0.4)
Origin IGP, localpref 100, valid, external, best, group-bestRP/0/RP0/CPU0:R2#show bgp 192.168.5.0/24
<snip>
Paths: (3 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002 65003, (received & used)
10.0.0.1 (metric 3) from 10.0.0.1 (10.0.0.1)
Origin IGP, localpref 100, valid, internal, best, group-best
<snip>
Path #2: Received by speaker 0
<snip>
65003
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, metric 0, localpref 50, valid, external, group-best
<snip>
Path #3: Received by speaker 0
<snip>
65003, (received-only)
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, metric 0, localpref 100, valid, externalRP/0/RP0/CPU0:R3#show bgp 192.168.5.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002 65003, (received & used)
10.0.0.1 (metric 2) from 10.0.0.1 (10.0.0.1)
Origin IGP, localpref 100, valid, internal, best, group-bestR2は自分の目の前にR5がいるのに、R1 → R4 → R5と回り込んで届けます。LOCAL_PREFは「大きいほうが優先」なので、小さい値を付けることは「この出口を使うな」という指示になります。疎通は保たれています。
RP/0/RP0/CPU0:R3#ping 192.168.5.1 source 192.168.3.1 count 50 timeout 1
<snip>
Sending 50, 100-byte ICMP Echos to 192.168.5.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 10/13/63 msSTEP 6:ルータ全体の既定値を変えてもAS内には伝わらない
R1にbgp default local-preference 150を入れます。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Mon Oct 5 23:47:52.294 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65001
bgp default local-preference 150
!
endR1自身の判断はすぐ変わり、192.168.4.0/24はlocalpref 150になります。ところがR2・R3は100のままです。
RP/0/RP0/CPU0:R1#show bgp 192.168.4.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.1.4.4 from 10.1.4.4 (10.0.0.4)
Origin IGP, metric 0, localpref 150, valid, external, best, group-bestRP/0/RP0/CPU0:R2#show bgp 192.168.4.0/24
<snip>
Paths: (3 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.0.0.1 (metric 3) from 10.0.0.1 (10.0.0.1)
Origin IGP, metric 0, localpref 100, valid, internal, best, group-best
<snip>
Path #2: Received by speaker 0
<snip>
65003 65002
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 50, valid, external, group-best
<snip>
Path #3: Received by speaker 0
<snip>
65003 65002, (received-only)
10.2.5.5 from 10.2.5.5 (10.0.0.5)
Origin IGP, localpref 100, valid, externalRP/0/RP0/CPU0:R3#show bgp 192.168.4.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.0.0.1 (metric 2) from 10.0.0.1 (10.0.0.1)
Origin IGP, metric 0, localpref 100, valid, internal, best, group-bestpcapでも、このSTEPでR1がiBGPピアへ出した経路広告のUPDATEは0件です。ベストパスが入れ替わらなかったので、R1は経路を配り直していません。 次の追試でこの続きを確かめます。
追試:既定値の変更をAS内へ伝える
同じトポロジ・同じアドレスでラボを組み直し、既定値を変えたあとに出方向のリフレッシュを入れるとどうなるかを4STEPで確かめます。
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 初期状態 | 3台ともlocalpref 100 |
| 1 | R1にbgp default local-preference 150 | R1は150になる。iBGPへのUPDATEは、ベストパスが入れ替わった経路の分だけ出る |
| 2 | R1から2つのiBGPピアへclear bgp ipv4 unicast <ピア> soft out | 全経路が配り直され、R2・R3も150になる |
| 3 | 既定値を撤去 | R1は100に戻るが、R2・R3には150が残る |
追試STEP 1:値が変わるだけではUPDATEが出ない
R1に既定値150を入れます。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Sun Oct 11 15:24:30.542 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65001
bgp default local-preference 150
!
endR1ではeBGPで学んだ経路に150が効き、192.168.5.0/24のベストパスがR2経由のiBGP(100)から自分のeBGP経路(150)に入れ替わりました。R2・R3に届いたのは、この192.168.5.0/24だけです。
RP/0/RP0/CPU0:R1#show bgp 192.168.5.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002 65003, (received & used)
10.1.4.4 from 10.1.4.4 (10.0.0.4)
Origin IGP, localpref 150, valid, external, best, group-bestRP/0/RP0/CPU0:R2#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 100 0 i
*> 192.168.2.0/24 0.0.0.0 0 32768 i
*>i192.168.3.0/24 10.0.0.3 0 100 0 i
*>i192.168.4.0/24 10.0.0.1 0 100 0 65002 i
* 10.2.5.5 0 65003 65002 i
*>i192.168.5.0/24 10.0.0.1 150 0 65002 65003 i
* 10.2.5.5 0 0 65003 i
<snip>
Processed 5 prefixes, 7 pathsRP/0/RP0/CPU0:R3#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 100 0 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*>i192.168.4.0/24 10.0.0.1 0 100 0 65002 i
*>i192.168.5.0/24 10.0.0.1 150 0 65002 65003 i
<snip>
Processed 5 prefixes, 5 paths差が出た理由は、広告し直されるのが「ベストパスが入れ替わったとき」だけだからです。
| プレフィックス | R1のSTEP 0でのベストパス | 150を入れた後 | UPDATE |
|---|---|---|---|
192.168.5.0/24 | R2から来たiBGP(65003、100) | 自分のeBGP経路(65002 65003)が150で勝つ | 出る |
192.168.4.0/24 | 自分のeBGP経路(65002) | 同じ経路のまま。値が100から150に変わるだけ | 出ない |
192.168.1.0/24 | 自分が生成した経路 | 変わらない | 出ない |
R1 - R3間のNo.5がその唯一のUPDATEで、192.168.5.0/24だけがLOCAL_PREF: 150で載っています。
Border Gateway Protocol - UPDATE Message
<snip>
Path Attribute - MP_REACH_NLRI
<snip>
Next hop: 10.0.0.1
<snip>
MP Reach NLRI IPv4 prefix: 192.168.5.0
Path Attribute - ORIGIN: IGP
<snip>
Origin: IGP (0)
Path Attribute - AS_PATH: 65002 65003
<snip>
AS Path segment: 65002 65003
<snip>
Path Attribute - LOCAL_PREF: 150
<snip>
Local preference: 150追試STEP 2:出方向のリフレッシュで伝わる
R1から2つのiBGPピアへsoft outを打ちます。設定は変えていないので、記録はexecの出力です。
RP/0/RP0/CPU0:R1#clear bgp ipv4 unicast 10.0.0.2 soft out
<snip>
RP/0/RP0/CPU0:R1#clear bgp ipv4 unicast 10.0.0.3 soft out
<snip>
RP/0/RP0/CPU0:R1#show clock
<snip>
15:31:09.159 UTC Sun Oct 11 2026R2・R3の3経路すべてが150になりました。
RP/0/RP0/CPU0:R2#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 150 0 i
*> 192.168.2.0/24 0.0.0.0 0 32768 i
*>i192.168.3.0/24 10.0.0.3 0 100 0 i
*>i192.168.4.0/24 10.0.0.1 0 150 0 65002 i
* 10.2.5.5 0 65003 65002 i
*>i192.168.5.0/24 10.0.0.1 150 0 65002 65003 i
* 10.2.5.5 0 0 65003 i
<snip>
Processed 5 prefixes, 7 pathsRP/0/RP0/CPU0:R3#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 150 0 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*>i192.168.4.0/24 10.0.0.1 0 150 0 65002 i
*>i192.168.5.0/24 10.0.0.1 150 0 65002 65003 i
<snip>
Processed 5 prefixes, 5 pathsR1 - R3間のNo.3は1つのTCPセグメントに3つのUPDATEが入ったもので、192.168.4.0/24の分にはLOCAL_PREF: 150が載っています。
Border Gateway Protocol - UPDATE Message
<snip>
Path Attribute - MP_REACH_NLRI
<snip>
Next hop: 10.0.0.1
<snip>
MP Reach NLRI IPv4 prefix: 192.168.4.0
Path Attribute - ORIGIN: IGP
<snip>
Origin: IGP (0)
Path Attribute - AS_PATH: 65002
<snip>
AS Path segment: 65002
<snip>
Path Attribute - MULTI_EXIT_DISC: 0
<snip>
Path Attribute - LOCAL_PREF: 150
<snip>
Local preference: 150追試STEP 3:撤去すると古い値が残る
既定値を撤去します。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Sun Oct 11 15:37:44.261 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65001
no bgp default local-preference 150
!
endR1は100に戻りますが、R2・R3は150のままです。入れたときと同じ理由で、ベストパスが入れ替わらないのでUPDATEが出ません。
RP/0/RP0/CPU0:R1#show bgp 192.168.4.0/24
<snip>
Paths: (1 available, best #1)
<snip>
Path #1: Received by speaker 0
<snip>
65002, (received & used)
10.1.4.4 from 10.1.4.4 (10.0.0.4)
Origin IGP, metric 0, localpref 100, valid, external, best, group-bestRP/0/RP0/CPU0:R2#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 150 0 i
*> 192.168.2.0/24 0.0.0.0 0 32768 i
*>i192.168.3.0/24 10.0.0.3 0 100 0 i
*>i192.168.4.0/24 10.0.0.1 0 150 0 65002 i
* 10.2.5.5 0 65003 65002 i
*>i192.168.5.0/24 10.0.0.1 150 0 65002 65003 i
* 10.2.5.5 0 0 65003 i
<snip>
Processed 5 prefixes, 7 pathsRP/0/RP0/CPU0:R3#show bgp
<snip>
Network Next Hop Metric LocPrf Weight Path
*>i192.168.1.0/24 10.0.0.1 0 150 0 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*> 192.168.3.0/24 0.0.0.0 0 32768 i
*>i192.168.4.0/24 10.0.0.1 0 150 0 65002 i
*>i192.168.5.0/24 10.0.0.1 150 0 65002 65003 i
<snip>
Processed 5 prefixes, 5 pathsAS内で値が食い違った状態が残ります(R1は100、R2・R3は150と思っている)。bgp default local-preferenceは「設定したのに伝わらない」「外したのに古い値が残る」の両方が起きるので、変更のたびに出方向のリフレッシュを入れるのが前提の運用になります。
| 操作 | そのルータ | iBGPピア |
|---|---|---|
| 既定値を入れる | すぐ変わる | ベストパスが入れ替わった経路だけ伝わる |
soft out | — | 全経路が伝わる |
| 既定値を外す | すぐ戻る | 何も伝わらない(古い値が残る) |
結果のまとめ
本試験(STEP 0〜6)で、192.168.4.0/24のベストパスとR3からのtracerouteの1ホップ目です。
| STEP | R1 | R2 | R3 | R3の1ホップ目 |
|---|---|---|---|---|
| 0 | 65002 lp100 | 65002 lp100 | 65002 lp100 | 10.1.3.1 |
| 1 | 65003 65002 lp200 | 65003 65002 lp200 | 65003 65002 lp200 | 10.2.3.2 |
| 2 | 65002 lp200 | 65002 lp200 | 65002 lp200 | 10.1.3.1 |
| 3 | 65002 lp200 | 65002 lp200 | 65002 lp200 | 10.1.3.1 |
| 4 | 65002 lp100 | 65002 lp100 | 65002 lp100 | 10.1.3.1 |
| 5 | 65002 lp100 | 65002 lp100 | 65002 lp100 | 10.1.3.1 |
| 6 | 65002 lp150 | 65002 lp100 | 65002 lp100 | 10.1.3.1 |
追試(STEP 0〜3)で、192.168.4.0/24のLOCAL_PREFです。
| STEP | R1 | R2 | R3 | R1が出したiBGPのUPDATE |
|---|---|---|---|---|
| 0 | lp100 | lp100 | lp100 | 0件 |
| 1 | lp150 | lp100 | lp100 | 2件 |
| 2 | lp150 | lp150 | lp150 | 2件 |
| 3 | lp100 | lp150 | lp150 | 0件 |
検証Configおよびshow結果
各STEPで5台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show routeと、BGP・OSPFの状態一式(ネイバーごとのadvertised-routes / routes / received routes、show bgp <プレフィックス>、show rpl route-policyを含む) |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._ping.txt | そのSTEPのpingとtracerouteの結果(R1・R3・R4) |
..._trace.txt | show bgp trace neighbor / show bgp trace error |
..._commit.cfg | そのSTEPで実際にcommitされた設定だけ(設定を変えたルータのみ) |
..._exec.txt | そのSTEPで実行したexecコマンド(追試のSTEP 2のclear) |
本試験(STEP 0〜6)
STEP 0:初期状態(ポリシーはpassのみ)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | — |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 1:R2のR5向け入方向にLOCAL_PREF 200
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | — |
| R2 | show | log | run | — | trace | commit |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 2:R1のR4向け入方向にもLOCAL_PREF 200(同点にする)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | commit |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 3:R1のR4向け出方向にset local-preference 200
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | commit |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 4:すべて撤去(設定はSTEP 0と同一に戻る)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | commit |
| R2 | show | log | run | — | trace | commit |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 5:R2のR5向け入方向をLOCAL_PREF 50(既定値より小さい値)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | — |
| R2 | show | log | run | — | trace | commit |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 6:R1にbgp default local-preference 150(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | commit |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
パケットキャプチャーはSTEPごとに4区間で取得しています(本試験)。
| STEP | R1 - R3間(iBGP) | R2 - R3間(iBGP) | R1 - R4間(eBGP) | R2 - R5間(eBGP) |
|---|---|---|---|---|
| 0 | pcap | pcap | pcap | pcap |
| 1 | pcap | pcap | pcap | pcap |
| 2 | pcap | pcap | pcap | pcap |
| 3 | pcap | pcap | pcap | pcap |
| 4 | pcap | pcap | pcap | pcap |
| 5 | pcap | pcap | pcap | pcap |
| 6 | pcap | pcap | pcap | pcap |
追試(STEP 0〜3)
STEP 0:初期状態(3台ともlocalpref 100)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | — |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 1:R1にbgp default local-preference 150
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | commit |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 2:R1から2つのiBGPピアへclear bgp ipv4 unicast <ピア> soft out
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | exec |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
STEP 3:既定値を撤去(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | commit |
| R2 | show | log | run | — | trace | — |
| R3 | show | log | run | ping | trace | — |
| R4 | show | log | run | ping | trace | — |
| R5 | show | log | run | — | trace | — |
パケットキャプチャーはSTEPごとに4区間で取得しています(追試)。
| STEP | R1 - R3間(iBGP) | R2 - R3間(iBGP) | R1 - R4間(eBGP) | R2 - R5間(eBGP) |
|---|---|---|---|---|
| 0 | pcap | pcap | pcap | pcap |
| 1 | pcap | pcap | pcap | pcap |
| 2 | pcap | pcap | pcap | pcap |
| 3 | pcap | pcap | pcap | pcap |
参考
| 資料 | タイトル | 概要 |
|---|---|---|
| RFC 4271 | A Border Gateway Protocol 4 (BGP-4) | 4.3 e)でLOCAL_PREFを「4バイトの符号なし整数のwell-known属性」と定義し、5節の表でiBGPへはrequiredとしている。5.1.5がiBGPへは必ず含める・eBGPへは含めてはならない・外部から受け取ったら無視することを規定し、9.1.1が選好度の計算(外部ピアからの経路はポリシーの戻り値をiBGP再広告のLOCAL_PREFに使う、内部ピアからの経路をローカルで計算するとループを作りうる)を定義している。 |
| RFC 4451 | BGP MULTI_EXIT_DISC (MED) Considerations | MEDの比較条件を整理した文書。LOCAL_PREFとの役割の違いを理解するうえで対になる。 |
| RFC 7454 | BGP Operations and Security | 運用上の推奨事項。LOCAL_PREFを使った経路の優先度制御を含む。 |
| IANA | Border Gateway Protocol (BGP) Parameters | パス属性のType codeの割り当て一覧。 |
関連記事
- BGP(Border Gateway Protocol)
- BGPメッセージ
- BGPネイバーの状態遷移
- iBGPとeBGPの違い
- BGP next-hop-self
- BGPルートリフレクタ
- BGPパス属性とベストパス選択
- BGP ORIGIN属性
- BGP AS_PATH属性
- BGP NEXT_HOP属性
- BGP LOCAL_PREF属性
- BGP MED属性
- BGP WEIGHT属性
- BGP COMMUNITY属性
- BGP経路集約(aggregate-address)
- MP-BGP(マルチプロトコル拡張)
- BGP Extended Community(拡張コミュニティ)
- BGPマルチパス(maximum-paths)
- BGPの4バイトAS番号(RFC 6793)
- BGPのプライベートAS番号の除去(remove-private-AS)
- BGPのADD-PATH(RFC 7911)
- BGP PIC(Prefix Independent Convergence)
- BGP Best External(ベストでない外部経路の広告)