↓ メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. BGP記事一覧/

BGP LOCAL_PREF属性

目次

LOCAL_PREFとは

LOCAL_PREF(Type code 5)は、自AS内でどの出口を使うかを揃えるためのパス属性です(BGPパス属性とベストパス選択)。RFC 4271 4.3 e)は「4バイトの符号なし整数のwell-known属性」と定義し、広告する側が自分の選好度(degree of preference)を他の内部ピアに伝えるために使うものだとしています。

項目内容
Type code5
分類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へ広告するときに再び外れます。

LOCAL_PREFが伝わる範囲。AS 65003のR5からR2へのeBGPではLOCAL_PREFが付いておらず、R2が入方向ポリシーで200を付ける。R2からR1・R3へのiBGPにはLOCAL_PREF 200が載るが、R1からAS 65002のR4へのeBGPでは再び外れる

属性ごとの伝わる範囲です。

属性伝わる範囲
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番目)より前です。

順位比較項目
1WEIGHT(大きいほう。シスコ独自)
2LOCAL_PREF(大きいほう)
3自ASで生成した経路
4AS_PATH長(短いほう)
5ORIGIN(IGP < EGP < incomplete)
6MED(小さいほう)

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を使います。

IOS XR LOCAL_PREF の設定(入方向ポリシー)
route-policy <ポリシー名>
  set local-preference <値>
  pass
end-policy
!
router bgp <AS番号>
 neighbor <eBGPピアのアドレス>
  address-family ipv4 unicast
   route-policy <ポリシー名> in

ルータ全体の既定値を変えるコマンドもあります。

IOS XR LOCAL_PREF の既定値変更
router bgp <AS番号>
 bgp default local-preference <値>

ただし既定値の変更は、そのルータの判断だけを即座に変えます。 BGPが経路を広告し直すのはベストパスが入れ替わったときなので、値が変わるだけではiBGPピアへUPDATEが出ません。AS内へ伝えるにはclear bgp ipv4 unicast <ピア> soft outで広告し直させます。撤去したときも同じで、自分は戻ってもピア側には古い値が残ります。どちらも検証で確かめます。

実機での検証

XRd 26.1.1を5台使い、2本のラボで次を確認します。

  1. LOCAL_PREFがAS_PATH長より優先される
  2. 付けた値がiBGPで伝わり、AS内のすべてのルータが同じ出口を向く
  3. 同点なら次の比較項目(AS_PATH長)で決まる
  4. eBGPピアへは載らない(出方向ポリシーで設定しても無視される)
  5. 既定値(100)より小さい値を付けると、その経路が負ける
  6. ルータ全体の既定値を変えても、そのままではAS内に伝わらない。出方向のリフレッシュで伝わり、撤去しても古い値が残る
LOCAL_PREFの検証トポロジ。AS 65001はR1・R2がAS境界でR3が内部、iBGPフルメッシュとOSPF area 0で接続。AS 65002のR4はR1とR5に、AS 65003のR5はR2とR4にeBGPで接続している
  • 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役割広告するネットワーク
R165001AS境界(R4とeBGP)192.168.1.0/24
R265001AS境界(R5とeBGP)192.168.2.0/24
R365001内部(iBGPのみ)192.168.3.0/24
R465002R1・R5とeBGP192.168.4.0/24
R565003R2・R4とeBGP192.168.5.0/24

設定を変えるのはR1とR2だけです。

STEP操作確かめること
0初期状態(ポリシーはpassのみ)AS_PATHが短いR1経由が選ばれ、R3もR1を向く
1R2のR5向け入方向にLOCAL_PREF 200AS_PATHが長いR2経由に変わる。R3もR2を向く=AS全体に効く
2R1のR4向け入方向にもLOCAL_PREF 200同点なら次の比較項目(AS_PATH長)で決まる=R1経由に戻る
3R1のR4向け出方向にset local-preference 200eBGPへは載らない(警告のsyslogが出る。pcapにも属性が無い)
4すべて撤去STEP 0の状態に戻る。iBGPのUPDATEの値も100に戻る
5R2のR5向け入方向をLOCAL_PREF 50既定値100より小さい値を付けた側が負ける
6R1にbgp default local-preference 150R1だけが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です。

R3(AS 65001内部): show bgp(STEP 0)
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

R3が持つ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経由を選んでいます。

R2(AS境界): show bgp 192.168.4.0/24(STEP 0)
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-best

R3からのtracerouteはR1経由の2ホップです。

R3: traceroute 192.168.4.1(STEP 0)
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を付けます。

STEP 1 で R2 に入れた設定
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
!
end

R2のベストパスが自分のeBGP経路(65003 65002、localpref 200)に入れ替わります。同じ経路が2つ並んでいるのは、入方向ポリシーの適用後(Path #1)と、soft-reconfiguration inbound alwaysが保持している受信したままの状態(Path #2の(received-only)、localpref 100)が別々に数えられるためです。届いた時点ではLOCAL_PREFが無く、R2が既定値100を付けていたことが分かります。

R2: show bgp 192.168.4.0/24(STEP 1)
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です。

R3(AS 65001内部): show bgp 192.168.4.0/24(STEP 1)
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ホップ)。

R3: traceroute 192.168.4.1(STEP 1)
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 
R1: traceroute 192.168.4.1(STEP 1)
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が入っています。

No.11 R2 → R3 UPDATE(iBGP、192.168.4.0/24)tshark -V
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
上のtshark出力のパケット(No.11、iBGPでLOCAL_PREF 200が伝わる)のpcapをダウンロード

一方、隣接ASのR4には何も伝わっていません。 R4が持つAS 65001由来の経路はlocalpref 100(R4自身が付けた値)のままです。

R4(AS 65002): show bgp 192.168.1.0/24(STEP 1)
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-best

STEP 2:同点にすると次の比較項目で決まる

R1のR4向け入方向にもLOCAL_PREF 200を入れて同点にします。

STEP 2 で R1 に入れた設定
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
!
end

R2のPath #1(R1からのiBGP、65002)とPath #2(自分のeBGP、65003 65002)がどちらもlocalpref 200になり、次のAS_PATH長で短いPath #1がベストになります。

R2: show bgp 192.168.4.0/24(STEP 2)
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, external

Paths: (3 available)の3は経路の本数ではありません。 使っている経路が2つ(R1からのiBGPと自分のeBGP)で、残り1つは入方向ポリシー適用前の(received-only)です。soft-reconfiguration inbound alwaysを入れているルータで入方向ポリシーを使うと、この数が1つ増えます。

R3もR1経由に戻り、localpref 200、AS_PATHは65002です。

R3: show bgp 192.168.4.0/24(STEP 2)
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-best

STEP 3:出方向ポリシーで設定してもeBGPへは載らない

R1のR4向け出方向にset local-preference 200を適用します。

STEP 3 で R1 に入れた設定
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
!
end

IOS XRはcommitを通しますが、適用した瞬間に警告のsyslogを出します。

R1: show logging(STEP 3の範囲)
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はありません。

No.1 R1 → R4 UPDATE(eBGP、192.168.1.0/24、出方向にset local-preference適用後)tshark -V
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
上のtshark出力のパケット(No.1、eBGPのUPDATEにLOCAL_PREFが無い)のpcapをダウンロード

全STEPを通して数えると、iBGPの2区間は経路を広告したUPDATEすべてにLOCAL_PREFが入り、eBGPの2区間は1つも入っていません。

キャプチャーした区間経路を広告したUPDATEうちLOCAL_PREFを含む
R1 - R3間(iBGP)1212
R2 - R3間(iBGP)1212
R1 - R4間(eBGP)30
R2 - R5間(eBGP)30

STEP 4:ポリシーを撤去する

R1・R2からポリシーを撤去します。running-configの内容は(変更時刻の行を除いて)STEP 0と同じに戻ります。

STEP 4 で R1 に入れた設定
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
!
end
STEP 4 で R2 に入れた設定
RP/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
!
end

R3の192.168.4.0/24はR1経由の65002に戻り、LocPrfも100です。

R3: show bgp(STEP 4)
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境界のルータが付けた値です。

No.6 R1 → R3 UPDATE(iBGP、192.168.4.0/24、撤去後)tshark -V
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: 100
上のtshark出力のパケット(No.6、撤去後のLOCAL_PREF 100)のpcapをダウンロード

BGP AS_PATH属性では同点のeBGP経路で既存のベストパスが維持されて戻りませんでしたが、ここは上位の比較項目そのものが変わるので撤去した時点で戻ります。

STEP 5:既定値より小さい値を付けると負ける

R2のR5向け入方向をLOCAL_PREF 50にします。

STEP 5 で R2 に入れた設定
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全体で勝ちます。

R1: show bgp 192.168.5.0/24(STEP 5)
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-best
R2: show bgp 192.168.5.0/24(STEP 5)
RP/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, external
R3: show bgp 192.168.5.0/24(STEP 5)
RP/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-best

R2は自分の目の前にR5がいるのに、R1 → R4 → R5と回り込んで届けます。LOCAL_PREFは「大きいほうが優先」なので、小さい値を付けることは「この出口を使うな」という指示になります。疎通は保たれています。

R3: ping 192.168.5.1(STEP 5)
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 ms

STEP 6:ルータ全体の既定値を変えてもAS内には伝わらない

R1にbgp default local-preference 150を入れます。

STEP 6 で R1 に入れた設定
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
!
end

R1自身の判断はすぐ変わり、192.168.4.0/24はlocalpref 150になります。ところがR2・R3は100のままです。

R1: show bgp 192.168.4.0/24(STEP 6)
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-best
R2: show bgp 192.168.4.0/24(STEP 6)
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 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, external
R3: show bgp 192.168.4.0/24(STEP 6)
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 100, valid, internal, best, group-best

pcapでも、このSTEPでR1がiBGPピアへ出した経路広告のUPDATEは0件です。ベストパスが入れ替わらなかったので、R1は経路を配り直していません。 次の追試でこの続きを確かめます。

追試:既定値の変更をAS内へ伝える

同じトポロジ・同じアドレスでラボを組み直し、既定値を変えたあとに出方向のリフレッシュを入れるとどうなるかを4STEPで確かめます。

STEP操作確かめること
0初期状態3台ともlocalpref 100
1R1にbgp default local-preference 150R1は150になる。iBGPへのUPDATEは、ベストパスが入れ替わった経路の分だけ出る
2R1から2つのiBGPピアへclear bgp ipv4 unicast <ピア> soft out全経路が配り直され、R2・R3も150になる
3既定値を撤去R1は100に戻るが、R2・R3には150が残る

追試STEP 1:値が変わるだけではUPDATEが出ない

R1に既定値150を入れます。

追試STEP 1 で R1 に入れた設定
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
!
end

R1ではeBGPで学んだ経路に150が効き、192.168.5.0/24のベストパスがR2経由のiBGP(100)から自分のeBGP経路(150)に入れ替わりました。R2・R3に届いたのは、この192.168.5.0/24だけです。

R1: show bgp 192.168.5.0/24(追試STEP 1)
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-best
R2: show bgp(追試STEP 1)
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    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 paths
R3: show bgp(追試STEP 1)
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.1                      150      0 65002 65003 i
<snip>
Processed 5 prefixes, 5 paths

差が出た理由は、広告し直されるのが「ベストパスが入れ替わったとき」だけだからです。

プレフィックスR1のSTEP 0でのベストパス150を入れた後UPDATE
192.168.5.0/24R2から来た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で載っています。

No.5 R1 → R3 UPDATE(iBGP、192.168.5.0/24)tshark -V
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
上のtshark出力のパケット(No.5、ベストパスが入れ替わった経路だけが広告される)のpcapをダウンロード

追試STEP 2:出方向のリフレッシュで伝わる

R1から2つのiBGPピアへsoft outを打ちます。設定は変えていないので、記録はexecの出力です。

追試STEP 2 で R1 に実行したコマンド
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 2026

R2・R3の3経路すべてが150になりました。

R2: show bgp(追試STEP 2)
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 paths
R3: show bgp(追試STEP 2)
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    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 paths

R1 - R3間のNo.3は1つのTCPセグメントに3つのUPDATEが入ったもので、192.168.4.0/24の分にはLOCAL_PREF: 150が載っています。

No.3 R1 → R3 UPDATE(iBGP、192.168.4.0/24、soft out 後)tshark -V
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
上のtshark出力のパケット(No.3、soft out で配り直された3経路)のpcapをダウンロード

追試STEP 3:撤去すると古い値が残る

既定値を撤去します。

追試STEP 3 で R1 に入れた設定
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
!
end

R1は100に戻りますが、R2・R3は150のままです。入れたときと同じ理由で、ベストパスが入れ替わらないのでUPDATEが出ません。

R1: show bgp 192.168.4.0/24(追試STEP 3)
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-best
R2: show bgp(追試STEP 3)
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 paths
R3: show bgp(追試STEP 3)
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    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 paths

AS内で値が食い違った状態が残ります(R1は100、R2・R3は150と思っている)。bgp default local-preferenceは「設定したのに伝わらない」「外したのに古い値が残る」の両方が起きるので、変更のたびに出方向のリフレッシュを入れるのが前提の運用になります。

操作そのルータiBGPピア
既定値を入れるすぐ変わるベストパスが入れ替わった経路だけ伝わる
soft out—全経路が伝わる
既定値を外すすぐ戻る何も伝わらない(古い値が残る)

結果のまとめ

本試験(STEP 0〜6)で、192.168.4.0/24のベストパスとR3からのtracerouteの1ホップ目です。

STEPR1R2R3R3の1ホップ目
065002 lp10065002 lp10065002 lp10010.1.3.1
165003 65002 lp20065003 65002 lp20065003 65002 lp20010.2.3.2
265002 lp20065002 lp20065002 lp20010.1.3.1
365002 lp20065002 lp20065002 lp20010.1.3.1
465002 lp10065002 lp10065002 lp10010.1.3.1
565002 lp10065002 lp10065002 lp10010.1.3.1
665002 lp15065002 lp10065002 lp10010.1.3.1

追試(STEP 0〜3)で、192.168.4.0/24のLOCAL_PREFです。

STEPR1R2R3R1が出したiBGPのUPDATE
0lp100lp100lp1000件
1lp150lp100lp1002件
2lp150lp150lp1502件
3lp100lp150lp1500件

検証Configおよびshow結果

各STEPで5台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。

ファイル内容
..._show.txtshow 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.txtshow 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出力syslogrunning-configpingtracecommit
R1showlogrunpingtrace—
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 1:R2のR5向け入方向にLOCAL_PREF 200

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtrace—
R2showlogrun—tracecommit
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 2:R1のR4向け入方向にもLOCAL_PREF 200(同点にする)

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 3:R1のR4向け出方向にset local-preference 200

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 4:すべて撤去(設定はSTEP 0と同一に戻る)

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtracecommit
R2showlogrun—tracecommit
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 5:R2のR5向け入方向をLOCAL_PREF 50(既定値より小さい値)

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtrace—
R2showlogrun—tracecommit
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 6:R1にbgp default local-preference 150(最終状態)

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

パケットキャプチャーはSTEPごとに4区間で取得しています(本試験)。

STEPR1 - R3間(iBGP)R2 - R3間(iBGP)R1 - R4間(eBGP)R2 - R5間(eBGP)
0pcappcappcappcap
1pcappcappcappcap
2pcappcappcappcap
3pcappcappcappcap
4pcappcappcappcap
5pcappcappcappcap
6pcappcappcappcap

追試(STEP 0〜3)

STEP 0:初期状態(3台ともlocalpref 100)

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtrace—
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 1:R1にbgp default local-preference 150

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 2:R1から2つのiBGPピアへclear bgp ipv4 unicast <ピア> soft out

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtraceexec
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

STEP 3:既定値を撤去(最終状態)

ルータshow出力syslogrunning-configpingtracecommit
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrunpingtrace—
R4showlogrunpingtrace—
R5showlogrun—trace—

パケットキャプチャーはSTEPごとに4区間で取得しています(追試)。

STEPR1 - R3間(iBGP)R2 - R3間(iBGP)R1 - R4間(eBGP)R2 - R5間(eBGP)
0pcappcappcappcap
1pcappcappcappcap
2pcappcappcappcap
3pcappcappcappcap

参考

資料タイトル概要
RFC 4271A 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 4451BGP MULTI_EXIT_DISC (MED) ConsiderationsMEDの比較条件を整理した文書。LOCAL_PREFとの役割の違いを理解するうえで対になる。
RFC 7454BGP Operations and Security運用上の推奨事項。LOCAL_PREFを使った経路の優先度制御を含む。
IANABorder Gateway Protocol (BGP) Parametersパス属性のType codeの割り当て一覧。

関連記事