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

BGPパス属性とベストパス選択

目次

パス属性とは

パス属性は、BGPが経路とセットで運ぶ付加情報です。UPDATEのPath Attributesフィールドに入り、そのUPDATEが運ぶすべてのNLRIに共通して適用されます(BGPメッセージ)。 通過したAS(AS_PATH)、次の転送先(NEXT_HOP)、優先度(LOCAL_PREF、MED)などがここに入り、BGPはメトリックではなくこの属性の集合で経路を評価します。1つの属性はフラグ・種別・長さ・値で構成されます。

属性の4分類

Attribute Flagsの上位2ビット(Optional・Transitive)で4つに分類されます(RFC 4271 5)。「実装が必ず対応するか」と「知らない属性を転送してよいか」が決まります。

分類OptionalTransitive意味
Well-known mandatory01すべての実装が対応必須。UPDATEに必ず含めなければならない。
Well-known discretionary01すべての実装が対応必須だが、UPDATEに含めるかは任意。
Optional transitive11対応は任意。知らない属性でもPartialビットを立てて隣へ転送する。
Optional non-transitive10対応は任意。知らない属性は破棄し、隣へ転送しない。

well-known属性はTransitiveビットが常に1です。Partialビットはoptional transitive属性だけで使われ、属性を理解できないルータが転送するときに1を立てます。 RFC 4271がwell-known discretionaryと明記しているのはATOMIC_AGGREGATEだけです(5.1.6)。LOCAL_PREFもwell-known属性ですが、5節の属性一覧表ではiBGPへはrequired(必須)とされています。詳しくはLOCAL_PREFで解説しています。

パス属性の一覧

主なパス属性です(番号はIANAのBGP Parameters)。

Type code属性分類概要
1ORIGINWell-known mandatory経路がBGPに入った経緯(IGP / EGP / Incomplete)。ORIGINで解説しています。
2AS_PATHWell-known mandatory経路が通過したAS番号の並び。ループ検出と経路長の比較に使う。AS_PATHで解説しています。
3NEXT_HOPWell-known mandatory経路の次ホップIPアドレス。NEXT_HOPおよびnext-hop-selfを参照してください。
4MULTI_EXIT_DISC(MED)Optional non-transitive隣接ASに対して、自AS内のどの入口を使ってほしいかを示す。MEDを参照してください。
5LOCAL_PREFWell-known(iBGPピアへは必ず含め、eBGPピアへは送らない)AS内でどの出口を優先するかを示す。LOCAL_PREFを参照してください。
6ATOMIC_AGGREGATEWell-known discretionaryより詳細な経路を含む集約経路であることを示す。BGP経路集約(aggregate-address)で解説しています。
7AGGREGATOROptional transitive経路を集約したルータのAS番号とRouter ID。BGP経路集約(aggregate-address)で解説しています。
8COMMUNITYOptional transitive経路にタグを付け、ポリシーの適用対象をまとめて指定する。COMMUNITYを参照してください。
9ORIGINATOR_IDOptional non-transitiveルートリフレクタが反射する際に付ける、経路をAS内に持ち込んだルータのRouter ID。ルートリフレクタで解説しています。
10CLUSTER_LISTOptional non-transitive経路が通過したクラスタIDのリスト。ルートリフレクタで解説しています。
14MP_REACH_NLRIOptional non-transitiveIPv4ユニキャスト以外のアドレスファミリーの経路を運ぶ(RFC 4760)。
15MP_UNREACH_NLRIOptional non-transitive同じくマルチプロトコル拡張での経路の取り消し。
16EXTENDED COMMUNITIESOptional transitive8バイトに拡張されたコミュニティ(RFC 4360)。
17AS4_PATHOptional transitive4バイトAS番号に非対応のルータを経由する際にAS_PATHを補完する(RFC 6793)。
18AS4_AGGREGATOROptional transitive同じくAGGREGATORを補完する。
32LARGE_COMMUNITYOptional transitive12バイトのコミュニティ(RFC 8092)。
IOS XRはIPv4ユニキャストの経路もUPDATE本体のNLRIフィールドではなくMP_REACH_NLRI属性に入れて広告します(BGPメッセージ)。

壊れた属性の扱い(RFC 7606)

RFC 4271は、必須属性が無い・長さが合わないといったUPDATEを受け取ったらNOTIFICATIONを送ってセッションを落とす、と定めていました。 1つの経路の誤りで全経路が落ちるため、RFC 7606がこれを改め、属性ごとに次の扱いを割り当てています。

扱い内容
Attribute discardその属性だけを捨てて経路は残す(COMMUNITYなどのoptional属性)
Treat-as-withdrawそのUPDATEが運ぶNLRIを取り消しとして扱う(AS_PATH・NEXT_HOP・LOCAL_PREFなど)
Session resetセッションを落とす(属性の長さの整合が取れず、UPDATEの境界が分からない場合)

WEIGHTはパス属性ではない

CiscoルータのWEIGHTはベストパス選択で最初に評価されますが、Cisco独自のローカル値でUPDATEには載りません。

項目LOCAL_PREFWEIGHT
パス属性かはい(Type code 5)いいえ(Cisco独自のローカル値)
伝わる範囲iBGPピア全体(AS内)設定したルータのみ
既定値1000(自身が生成した経路は32768)
大小大きいほど優先大きいほど優先

ベストパス選択の順序

同じプレフィックスに複数の経路があるとき、BGPは1つだけをベストパスに選び、ルーティングテーブルへ入れてピアへ広告します。 NEXT_HOPに到達できない経路は候補から外れます(next-hop-self)。残った経路を次の順に比較し、決着した時点で終えます。

順序比較項目優先根拠
1WEIGHT大きいほうCisco独自
2LOCAL_PREF大きいほうRFC 4271 9.1.1(degree of preference)
3自身が生成した経路network / redistribute / 集約で生成したものCisco独自
4AS_PATHの長さ短いほうRFC 4271 9.1.2.2 a
5ORIGINIGP < EGP < IncompleteRFC 4271 9.1.2.2 b
6MULTI_EXIT_DISC小さいほう(同じ隣接ASから学習した経路同士のみ比較)RFC 4271 9.1.2.2 c
7eBGPとiBGPeBGPで学習した経路RFC 4271 9.1.2.2 d
8NEXT_HOPまでのIGPメトリック小さいほうRFC 4271 9.1.2.2 e
—マルチパスの判定条件を満たす経路を複数インストールするCisco独自(マルチパス)
9既存のベストパスの維持eBGP経路同士で8まで同点なら、すでに選ばれているベストパスを維持する(bgp bestpath compare-routeridで無効化)Cisco独自
10BGP Router ID小さいほう(ORIGINATOR_IDがあればその値)RFC 4271 9.1.2.2 f、RFC 4456 9
11CLUSTER_LISTの長さ短いほうRFC 4456 9
12ネイバーのIPアドレス小さいほうRFC 4271 9.1.2.2 g

WEIGHT・自身が生成した経路・既存のベストパスの維持はCisco独自で、RFCには規定がありません。順序はIOS XEも同じで、差が出るのは比較の挙動を変えるコマンド名です。

挙動IOS XRIOS XE
異なる隣接ASの経路同士でもMEDを比較するbgp bestpath med alwaysbgp always-compare-med
AS_PATH長を比較しないbgp bestpath as-path ignorebgp bestpath as-path ignore
同点時にRouter IDまで必ず比較するbgp bestpath compare-routeridbgp bestpath compare-routerid

実機での検証

XRd 26.1.1を7台使い、同じプレフィックスが2経路で届くR1を観測点にします。

ルータAS役割
R165001観測点。R2・R3の両方とiBGP(R2 - R3間は張らない)
R265001境界。AS 65002のR4・R5と2本のeBGP
R365001境界。AS 65004のR6とeBGP
R465002192.168.100.0/24をredistribute staticで生成(ORIGINは?)
R565002同じ192.168.100.0/24をnetworkで生成(ORIGINはi)。実体はLoopback100
R665004トランジット。R5から受けてR3へ渡す(R1から見たAS_PATHが1つ長い)
R765003COMMUNITYがASを2つ越えることの確認用

AS 65001内はOSPFエリア0で、iBGPはLoopback0どうしです。R2・R3のeBGP側リンクはOSPFのpassiveインタフェースとして広告しています。

R1には192.168.100.0/24が2経路届きます。R2経由(AS_PATH 65002)とR3経由(AS_PATH 65004 65002)です。 day-0で上位の判定条件を入れておき、STEPごとに下位と同じ値に揃えて、決め手が1つずつ下へ移る様子を追います。

条件を「外す」のではなく「揃える」のは、IOS XR 26.1.1ではいったん経路に付いたWEIGHTがno weightでもソフトリフレッシュでもハードクリアでも消えなかったためです。値を足す方向の変更は即座に反映されます。
STEP操作R1(またはR2)での決め手
0なし(初期状態)(1) WEIGHT(R2経由だけ100)
1R1のR3ネイバーにもweight 100(2) LOCAL_PREF(R3経由が200)
2R1のFROM-R2にもset local-preference 200(4) AS_PATHの長さ(R2経由が短い)
3R1にbgp bestpath as-path ignore(5) ORIGIN(R3経由がIGP、R2経由がIncomplete)
4R4の生成をnetworkに変えてORIGINを揃える(8) IGPメトリック(R1ではMEDは比較されない)
5R1 - R2のOSPFコストも100にして揃える(10) BGP Router ID
6R2のR5ネイバーにもweight 100(R2側)(6) MED
7R5のTO-R2のMEDも100にして揃える(R2側)(9) / (10) の段へ
8R2でclear bgp ipv4 unicast 10.2.4.4構文が通らず実行されなかった
9R2にbgp bestpath compare-routerid変化なし
10R4にsend-community-ebgp(R7向け)COMMUNITYがASを2つ越える
11R2のsend-community-ebgpを外す(最終状態)送信制御と推移性は別物

各STEPでR1から192.168.100.1(R5のLoopback100)へping 50発とtracerouteを取り、転送がベストパスに追従していることも確認しています。

UPDATEで4分類を確認する

R1 - R2間(iBGP)とR2 - R4間(eBGP)で、同じ192.168.100.0/24のUPDATEを比べます。STEP 4でR4が生成方法を変えたときに流れたものです。

STEP 4 R1 - R2間 No.9 UPDATE(R2 → R1)tshark -V(抜粋)
Border Gateway Protocol - UPDATE Message
<snip>
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Next hop: 10.2.4.4
<snip>
                192.168.100.0/24
<snip>
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
                AS4: 65002
        Path Attribute - MULTI_EXIT_DISC: 100
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Multiple exit discriminator: 100
        Path Attribute - LOCAL_PREF: 100
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Local preference: 100
STEP 4 R2 - R4間 No.3 UPDATE(R4 → R2)tshark -V(抜粋)
Border Gateway Protocol - UPDATE Message
<snip>
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Next hop: 10.2.4.4
<snip>
                192.168.100.0/24
<snip>
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
                AS4: 65002
        Path Attribute - MULTI_EXIT_DISC: 100
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Multiple exit discriminator: 100

上のtshark出力のパケット(STEP 4 iBGPのUPDATE)のpcapをダウンロード

上のtshark出力のパケット(STEP 4 eBGPのUPDATE)のpcapをダウンロード

well-known属性は0x40、optional non-transitiveは0x80です。LOCAL_PREF(well-known。iBGPへは必ず含め、eBGPへは送らない)はiBGP側にだけ入り、eBGP側には入っていません。

optional transitive(0xc0)はCOMMUNITYで確認できます。R4がAS 65003のR7へ広告したUPDATEです(STEP 10)。

STEP 10 R4 - R7間 No.1 UPDATE(R4 → R7、COMMUNITY付き)tshark -V(抜粋)
Border Gateway Protocol - UPDATE Message
<snip>
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Next hop: 10.4.7.4
<snip>
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
                AS4: 65002
                AS4: 65001
        Path Attribute - COMMUNITIES: 65001:100 
            Flags: 0xc0, Optional, Transitive, Complete
<snip>
            Communities: 65001:100 
上のtshark出力のパケット(STEP 10 COMMUNITY付きのUPDATE)のpcapをダウンロード
分類フラグこの検証で観測した属性
Well-known mandatory0x40ORIGIN、AS_PATH
Well-known(iBGPへは必須)0x40LOCAL_PREF(iBGPのみ)
Optional transitive0xc0COMMUNITIES
Optional non-transitive0x80MULTI_EXIT_DISC、MP_REACH_NLRI
MP_REACH_NLRIの0x90は0x80に0x10(Extended Length、長さフィールドが2バイト)が加わったものです。ORIGINATOR_IDとCLUSTER_LIST(どちらもoptional non-transitive)はルートリフレクタが付ける属性で、この検証にはRRがないため観測していません(ルートリフレクタのキャプチャーで確認できます)。

決め手が1段ずつ下へ移る

R1のshow bgp 192.168.100.0/24です。(received-only)の行はsoft-reconfiguration inbound alwaysが保持している入方向ポリシー適用前のコピーです。

R1 show bgp 192.168.100.0/24(STEP 0)
RP/0/RP0/CPU0:R1#show bgp 192.168.100.0/24
Wed Sep 23 12:10:27.708 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 34           34
Last Modified: Sep 23 12:00:35.023 for 00:09:52
Paths: (3 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002, (received & used)
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin incomplete, metric 100, localpref 100, weight 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 34
  Path #2: Received by speaker 0
  Not advertised to any peer
  65004 65002
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 200, valid, internal, group-best
      Received Path ID 0, Local Path ID 0, version 0
  Path #3: Received by speaker 0
  Not advertised to any peer
  65004 65002, (received-only)
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
R1 show bgp 192.168.100.0/24(STEP 1)
RP/0/RP0/CPU0:R1#show bgp 192.168.100.0/24
Wed Sep 23 12:17:25.011 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 39           39
Last Modified: Sep 23 12:15:13.023 for 00:02:12
Paths: (3 available, best #2)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002, (received & used)
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin incomplete, metric 100, localpref 100, weight 100, valid, internal, group-best
      Received Path ID 0, Local Path ID 0, version 0
  Path #2: Received by speaker 0
  Not advertised to any peer
  65004 65002
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 200, weight 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 39
  Path #3: Received by speaker 0
  Not advertised to any peer
  65004 65002, (received-only)
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
R1 show bgp 192.168.100.0/24(STEP 2)
RP/0/RP0/CPU0:R1#show bgp 192.168.100.0/24
Wed Sep 23 12:24:25.916 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 45           45
Last Modified: Sep 23 12:22:13.023 for 00:02:13
Paths: (4 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin incomplete, metric 100, localpref 200, weight 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 45
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002, (received-only)
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin incomplete, metric 100, localpref 100, weight 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
  Path #3: Received by speaker 0
  Not advertised to any peer
  65004 65002
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 200, weight 100, valid, internal, group-best
      Received Path ID 0, Local Path ID 0, version 0
  Path #4: Received by speaker 0
  Not advertised to any peer
  65004 65002, (received-only)
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
R1 show bgp 192.168.100.0/24(STEP 3)
RP/0/RP0/CPU0:R1#show bgp 192.168.100.0/24
Wed Sep 23 12:31:27.860 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 47           47
Last Modified: Sep 23 12:29:15.023 for 00:02:12
Paths: (4 available, best #3)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin incomplete, metric 100, localpref 200, weight 100, valid, internal, group-best
      Received Path ID 0, Local Path ID 0, version 0
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002, (received-only)
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin incomplete, metric 100, localpref 100, weight 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
  Path #3: Received by speaker 0
  Not advertised to any peer
  65004 65002
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 200, weight 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 47
  Path #4: Received by speaker 0
  Not advertised to any peer
  65004 65002, (received-only)
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
R1 show bgp 192.168.100.0/24(STEP 4)
RP/0/RP0/CPU0:R1#show bgp 192.168.100.0/24
Wed Sep 23 12:38:29.238 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 48           48
Last Modified: Sep 23 12:36:36.023 for 00:01:53
Paths: (4 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin IGP, metric 100, localpref 200, weight 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 48
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002, (received-only)
    10.2.4.4 (metric 2) from 10.0.0.2 (10.0.0.2)
      Origin IGP, metric 100, localpref 100, weight 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
  Path #3: Received by speaker 0
  Not advertised to any peer
  65004 65002
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 200, weight 100, valid, internal, group-best
      Received Path ID 0, Local Path ID 0, version 0
  Path #4: Received by speaker 0
  Not advertised to any peer
  65004 65002, (received-only)
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
R1 show bgp 192.168.100.0/24(STEP 5)
RP/0/RP0/CPU0:R1#show bgp 192.168.100.0/24
Wed Sep 23 12:45:27.510 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 48           48
Last Modified: Sep 23 12:36:36.023 for 00:08:51
Paths: (4 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002
    10.2.4.4 (metric 101) from 10.0.0.2 (10.0.0.2)
      Origin IGP, metric 100, localpref 200, weight 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 48
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002, (received-only)
    10.2.4.4 (metric 101) from 10.0.0.2 (10.0.0.2)
      Origin IGP, metric 100, localpref 100, weight 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0
  Path #3: Received by speaker 0
  Not advertised to any peer
  65004 65002
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 200, weight 100, valid, internal, group-best
      Received Path ID 0, Local Path ID 0, version 0
  Path #4: Received by speaker 0
  Not advertised to any peer
  65004 65002, (received-only)
    10.3.6.6 (metric 101) from 10.0.0.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, internal
      Received Path ID 0, Local Path ID 0, version 0

1段ずつ見ていきます。

STEP2経路の違いbestなぜそこで決まったか
0R2経由だけweight 100R2経由WEIGHTが最初に比較され、LOCAL_PREF(R3経由が200)は見られない
1両方weight 100、R3経由がlocalpref 200R3経由WEIGHTが同値になったのでLOCAL_PREFで決まる
2両方localpref 200R2経由AS_PATHが65002(1個)と65004 65002(2個)
3as-path ignoreで長さを比較しないR3経由ORIGINがIGP(R5がnetworkで生成)とIncomplete(R4がredistribute staticで生成)
4R4もnetworkに変えてORIGINを揃えるR2経由R1ではMEDは比較されない(隣接ASがR2経由は65002、R3経由は65004で異なる)。次のIGPメトリックが(metric 2)と(metric 101)
5R1 - R2のコストも100にして(metric 101)で揃えるR2経由Router IDが10.0.0.2 < 10.0.0.3

転送もベストパスに追従しています。STEP 0はR2から、STEP 1はR3から出ていきます。

R1 ping / traceroute(STEP 0)
RP/0/RP0/CPU0:R1#ping 192.168.100.1 source 192.168.1.1 count 50 timeout 1
Wed Sep 23 12:10:17.621 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.100.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 8/14/75 ms
RP/0/RP0/CPU0:R1#traceroute 192.168.100.1 source 192.168.1.1 probe 3 timeout 1 maxttl 6
Wed Sep 23 12:10:19.958 UTC

Type escape sequence to abort.
Tracing the route to 192.168.100.1

 1  10.1.2.2 7 msec  5 msec  5 msec 
 2  10.2.4.4 24 msec  10 msec  9 msec 
 3  10.4.5.5 11 msec  *  11 msec 
R1 ping / traceroute(STEP 1)
RP/0/RP0/CPU0:R1#ping 192.168.100.1 source 192.168.1.1 count 50 timeout 1
Wed Sep 23 12:17:14.977 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.100.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 7/10/23 ms
RP/0/RP0/CPU0:R1#traceroute 192.168.100.1 source 192.168.1.1 probe 3 timeout 1 maxttl 6
Wed Sep 23 12:17:16.475 UTC

Type escape sequence to abort.
Tracing the route to 192.168.100.1

 1  10.1.3.3 10 msec  4 msec  4 msec 
 2  10.3.6.6 11 msec  47 msec  8 msec 
 3  10.5.6.5 12 msec  *  18 msec 

同じ隣接ASから2経路を受けるR2ではMEDが効く

R2はAS 65002のR4・R5から同じプレフィックスを受け取ります。隣接ASが同じなのでMEDが比較されます。

R2 show bgp 192.168.100.0/24(STEP 0)
RP/0/RP0/CPU0:R2#show bgp 192.168.100.0/24
Wed Sep 23 12:11:09.060 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  7            7
Last Modified: Sep 23 11:33:33.023 for 00:37:36
Paths: (2 available, best #1)
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.1        
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.1        
  65002, (received & used)
    10.2.4.4 from 10.2.4.4 (10.0.0.4)
      Origin incomplete, metric 100, localpref 100, weight 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 7
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002, (received & used)
    10.2.5.5 from 10.2.5.5 (10.0.0.5)
      Origin IGP, metric 200, localpref 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)
R2 show bgp 192.168.100.0/24(STEP 6)
RP/0/RP0/CPU0:R2#show bgp 192.168.100.0/24
Wed Sep 23 12:53:08.026 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 16           16
Last Modified: Sep 23 12:50:16.023 for 00:02:52
Paths: (3 available, best #1)
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.1        
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.1        
  65002, (received & used)
    10.2.4.4 from 10.2.4.4 (10.0.0.4)
      Origin IGP, metric 100, localpref 100, weight 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 12
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002
    10.2.5.5 from 10.2.5.5 (10.0.0.5)
      Origin IGP, metric 200, localpref 100, weight 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)
  Path #3: Received by speaker 0
  Not advertised to any peer
  65002, (received-only)
    10.2.5.5 from 10.2.5.5 (10.0.0.5)
      Origin IGP, metric 200, localpref 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)
R2 show bgp 192.168.100.0/24(STEP 7)
RP/0/RP0/CPU0:R2#show bgp 192.168.100.0/24
Wed Sep 23 13:00:01.970 UTC
BGP routing table entry for 192.168.100.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 16           16
Last Modified: Sep 23 12:50:16.023 for 00:09:46
Paths: (2 available, best #1)
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.1        
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.1        
  65002, (received & used)
    10.2.4.4 from 10.2.4.4 (10.0.0.4)
      Origin IGP, metric 100, localpref 100, weight 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 12
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Not advertised to any peer
  65002, (received & used)
    10.2.5.5 from 10.2.5.5 (10.0.0.5)
      Origin IGP, metric 100, localpref 100, weight 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)

STEP 0はR4向けのweight 100で決まっており、MED(100と200)は見られていません。STEP 6でWEIGHTを揃えるとMEDが決め手になり、STEP 7でMEDも揃えると残るのは(9)以降です。

(9) 既存のベストパスの維持、(11) CLUSTER_LISTの長さ、(12) ネイバーのIPアドレスは、この検証では観測していません。 (9)を見るためにSTEP 8でR2のセッションを落とそうとしましたが、clear bgp ipv4 unicast 10.2.4.4はIOS XR 26.1.1で% Incomplete command.となり実行されませんでした。 仮に落とせても、この構成ではR4のRouter ID(10.0.0.4)がR5(10.0.0.5)より小さく、(9)と(10)のどちらで決まったかを区別できません。 (9)の実機での確認はBGP AS_PATH属性にあります(AS_PATHを伸ばして選び直させた後、元に戻してもベストパスが戻らないことをSTEPごとに追っています)。

COMMUNITYはASを2つ越える

COMMUNITYはoptional transitiveなので、対応するルータはASをまたいでも転送します。付けているのはAS 65001のR2だけです。

R7 show bgp 192.168.2.0/24(STEP 9)
RP/0/RP0/CPU0:R7#show bgp 192.168.2.0/24
Wed Sep 23 13:17:17.693 UTC
BGP routing table entry for 192.168.2.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  6            6
Last Modified: Sep 23 11:33:33.023 for 01:43:44
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002 65001, (received & used)
    10.4.7.4 from 10.4.7.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 6
      Origin-AS validity: (disabled)
R7 show bgp 192.168.2.0/24(STEP 10)
RP/0/RP0/CPU0:R7#show bgp 192.168.2.0/24
Wed Sep 23 13:24:19.299 UTC
BGP routing table entry for 192.168.2.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 10           10
Last Modified: Sep 23 13:17:56.023 for 00:06:23
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002 65001, (received & used)
    10.4.7.4 from 10.4.7.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 10
      Community: 65001:100
      Origin-AS validity: (disabled)
R7 show bgp 192.168.2.0/24(STEP 11)
RP/0/RP0/CPU0:R7#show bgp 192.168.2.0/24
Wed Sep 23 13:31:14.786 UTC
BGP routing table entry for 192.168.2.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 13           13
Last Modified: Sep 23 13:24:56.023 for 00:06:18
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002 65001, (received & used)
    10.4.7.4 from 10.4.7.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 13
      Origin-AS validity: (disabled)

STEP 9まで届かないのは、R4がR7向けにsend-community-ebgpを持たないためです。STEP 10で入れるとR7まで届き、STEP 11でR2が送信をやめると消えます。 属性が推移的であることと、実装がそれを送信するかどうかは別です。IOS XR / IOS XEはeBGPピアへのCOMMUNITY送信を既定で抑止しています(IOS XRはsend-community-ebgp、IOS XEはsend-community)。

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow version / show interface description / show route / show bgp / show bgp summary / show route bgp / show bgp 192.168.100.0/24・192.168.1.0/24・192.168.2.0/24 / show bgp neighbors / ピアごとのadvertised-routes・routes・received routes / show bgp update-group / show bgp process / show rpl route-policy。R1〜R3はshow ospf neighbor / show route ospf、R1はshow route 192.168.100.0/24 / show cef 192.168.100.0/24も含む
..._log.txtそのSTEPの範囲だけに絞ったshow logging
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._ping.txtR1から192.168.100.1へのping 50発とtraceroute、R7から192.168.1.1へのping
..._trace.txtshow bgp trace neighborとshow bgp trace error
..._commit.cfgそのSTEPで実際にコミットされた設定(設定を変えたルータのみ)
..._exec.txtそのSTEPで実行したclearコマンドと時刻(STEP 8のR2)

STEP 0:なし(初期状態)

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 1:R1のR3ネイバーにもweight 100

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 2:R1のFROM-R2にもset local-preference 200

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 3:R1にbgp bestpath as-path ignore

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 4:R4の生成をnetworkに変えてORIGINを揃える

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—tracecommit
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 5:R1 - R2のOSPFコストも100にして揃える

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtracecommit
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 6:R2のR5ネイバーにもweight 100

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—tracecommit
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 7:R5のTO-R2のMEDも100にして揃える

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—tracecommit
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 8:R2でclear bgp ipv4 unicast 10.2.4.4

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—traceexec
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 9:R2にbgp bestpath compare-routerid

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—tracecommit
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 10:R4にsend-community-ebgp(R7向け)

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—trace—
R3showlogrun—trace—
R4showlogrun—tracecommit
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

STEP 11:R2のsend-community-ebgpを外す(最終状態)

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrun—tracecommit
R3showlogrun—trace—
R4showlogrun—trace—
R5showlogrun—trace—
R6showlogrun—trace—
R7showlogrunpingtrace—

パケットキャプチャーはSTEPごとに取得しています。

STEPR1 - R2間(iBGP)R2 - R4間(eBGP)R4 - R7間(eBGP)
0pcappcappcap
1pcappcappcap
2pcappcappcap
3pcappcappcap
4pcappcappcap
5pcappcappcap
6pcappcappcap
7pcappcappcap
8pcappcappcap
9pcappcappcap
10pcappcappcap
11pcappcappcap

参考

資料タイトル概要
RFC 4271A Border Gateway Protocol 4 (BGP-4)パス属性の4分類(5)、LOCAL_PREFによるdegree of preference(9.1.1)、タイブレークの手順(9.1.2.2)を定義。
RFC 7606Revised Error Handling for BGP UPDATE Messages壊れた属性の扱いを属性ごとに定義(attribute discard / treat-as-withdraw / session reset)。
RFC 1997BGP Communities AttributeCOMMUNITY属性を定義。
RFC 4360BGP Extended Communities AttributeEXTENDED COMMUNITIES属性を定義。
RFC 4456BGP Route ReflectionORIGINATOR_IDとCLUSTER_LISTを定義し、経路選択への影響(9)も規定。
RFC 4760Multiprotocol Extensions for BGP-4MP_REACH_NLRIとMP_UNREACH_NLRIを定義。
RFC 6793BGP Support for Four-Octet AS Number SpaceAS4_PATHとAS4_AGGREGATORを定義。
RFC 8092BGP Large Communities AttributeLARGE_COMMUNITY属性を定義。
IANABorder Gateway Protocol (BGP) Parametersパス属性のType codeなど、BGPで使われる番号の割り当て一覧。

関連記事