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

BGP AS_PATH属性

目次

AS_PATHとは

AS_PATH(Type code 2)は、その経路がどのASを通ってきたかをAS番号の並びで表すパス属性です。BGPパス属性とベストパス選択で解説したとおりwell-known mandatoryに分類され、UPDATEには必ず含まれます。

BGPが「パスベクター型」と呼ばれるのは、この属性があるためです。距離やコストといった数値ではなく、通過したASの並びそのものを経路の識別子として持ち回ります。

AS_PATHは2つの役割を兼ねています。

役割内容
ループ検出受け取った経路のAS_PATHに自ASの番号が含まれていれば、その経路は一度自ASを通っているのでループと判断して破棄する
経路長の比較ベストパス選択で、AS_PATHに含まれるAS番号の個数が少ない経路を優先する

eBGPとiBGPでの付き方

AS_PATHが伸びるのはeBGPピアへ広告するときだけです。iBGPピアへ広告するときは何も足しません。

広告先動作
eBGPピア自ASの番号をAS_PATH先頭に追加して送る
iBGPピアAS_PATHをそのまま送る(自ASの番号は追加しない)

同じAS内のルータどうしで番号を足してしまうと、AS内をいくつのルータが経由したかで長さが変わり、AS単位の距離という意味が壊れてしまうためです。

自分がnetworkで広告を始めた経路は、AS内ではAS_PATHが空のまま流れます。show bgpのPath欄が空欄で末尾のOrigin codeだけが見えるのはこのためです。

R1で自分が広告している経路(AS_PATH は空)
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.168.1.0/24     0.0.0.0                  0         32768 i

セグメントの型

AS_PATHは「セグメント」の並びとして符号化されます。セグメントには型があり、通常見るのはAS_SEQUENCEです。

意味
AS_SET1順序を持たないASの集合。経路集約(aggregate-address)で複数経路をまとめたとき、元の経路が通ってきたASを重複なく列挙するために使う
AS_SEQUENCE2順序を持つASの並び。通常の経路伝播で作られるのはこちら

tshark -Vではセグメント型と要素数まで展開されるので、値の内訳がそのまま読めます。

tshark -V での AS_PATH の展開
        Path Attribute - AS_PATH: 65002 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 10
            AS Path segment: 65002 65001
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 2
                AS4: 65002
                AS4: 65001

AS_SETは長さの計算上「何個入っていても1」として数えられます。集約した経路のAS_PATHが不自然に短くならないようにするための決まりです。

ループ検出

eBGPで受け取った経路のAS_PATHに自ASの番号があれば、その経路は破棄されます。距離ベクター型プロトコルのようにホップ数の上限で止めるのではなく、経路自身が持つ情報だけでループを判定できるのがパスベクター型の利点です。

この破棄が受信のどの段階で起きるか、allowas-inで意図的に無効化すると何が見えるかは、BGP(Border Gateway Protocol)の実機検証で扱っています。

ベストパス選択での位置づけ

AS_PATHの長さは、ベストパス選択4番目に比較されます。WEIGHTLOCAL_PREF・自身が生成した経路かどうか、の3つで決着がつかなかったときに効きます。

重要なのはMULTI_EXIT_DISC(6番目)よりに評価される点です。両方を設定した場合、AS_PATHの長さで差がついた時点で比較が終わるため、MEDは見られません。

なお、比較されるのは長さだけで、中身のAS番号が何であるかは問われません。AS_PATH長を無視させたい場合はbgp bestpath as-path ignoreを使いますが、ループ検出は無効になりません。

AS_PATHプリペンドによる流入制御

自ASへ入ってくるトラフィックの経路を選ばせたいとき、eBGP出方向のポリシーで自ASの番号を余分に付ける手法をAS_PATHプリペンドと呼びます。相手から見た経路が長くなるので、そのリンクは選ばれにくくなります。

IOS XRではRPL(Routing Policy Language)のprepend as-path own-as <回数>で書きます。

自ASの番号を1回余分に付ける(IOS XR、show running-config より)
route-policy PREPEND-1
  prepend as-path own-as 1
  pass
end-policy
!
<snip>
 neighbor 10.1.3.3
  remote-as 65002
  description eBGP to R3
  address-family ipv4 unicast
   route-policy PASS-ALL in
   route-policy PREPEND-1 out
   soft-reconfiguration inbound always
  !
 !

設定コマンドの詳細は IOS XR BGPルートポリシーで解説します。

MEDとの違い

流入制御の手段としてはMEDもあり、隣接ASの入口を選ばせるだけなら両方とも同じ結果になります。決定的に違うのは影響が届く範囲です。

観点MEDAS_PATHプリペンド
届く範囲隣接ASまで。受け取ったASは他ASへ伝播しないAS_PATHごと伝わるので、離れたASまで届く
比較の条件同じ隣接ASから学習した経路どうしでのみ比較条件なし。すべての経路の長さを比較する
選択順序6番目4番目
副作用隣接ASの中で閉じる経路が通るすべてのASの選択に影響しうる

MEDは「AS_PATHの長さもORIGINも同じ経路が、同じ隣接ASから複数届いたとき」にだけ効く、条件の厳しい属性です。一方プリペンドはAS_PATHという伝播する属性そのものを書き換えるため、意図した相手より先のASまで効いてしまいます。この違いを実機で確かめます。

実機での検証

XRd(IOS XR 26.1.1)5台のラボで、次の4点を確認します。

  1. MEDで隣接ASの入口を変えたとき、その先のASには影響しないこと
  2. AS_PATHプリペンドで同じことをすると、隣接ASの入口も同じように変わること
  3. 出口を両方とも延ばすと、2つ先のASの選択まで変わること
  4. ポリシーを外してもベストパスは自動では戻らず、セッションのリセットが要ること
AS_PATHの検証トポロジ。AS 65001(R1・R2、iBGPとOSPF area 0)から AS 65002(R3)へは R1・R2 の2本、AS 65003(R4)へは R2 から1本が出ている。AS 65004(R5)は AS 65002 と AS 65003 の両方に接続している

構成の要点は次のとおりです。

  • R1が192.168.1.0/24を広告します。この経路が他のASからどう見えるかを追いかけます
  • AS 65002(R3)はAS 65001と2本のリンクで接続しています(R1経由とR2経由)。同じ隣接ASからの2経路なのでMEDの比較が成立します
  • AS 65004(R5)はAS 65001と直接つながっていません。AS 65002経由とAS 65003経由の2つの選択肢があり、どちらもAS_PATH長は2です。ここが「離れたAS」にあたります

各STEPで変更する内容です。

STEP操作
0ポリシーなし(初期状態)
1R1→R3にMED 200、R2→R3にMED 50
2MEDを撤去し、R1→R3にプリペンド×1
3R2→R3にもプリペンド×1(両方の出口を延ばす)
4プリペンドを撤去(設定はSTEP 0と同一に戻る)
5BGPセッションをリセット

R1 - R3間とR3 - R5間のリンクでパケットキャプチャーを取得しています(tcp port 179)。

STEP 0:初期状態

R3から見た192.168.1.0/24です。R1経由(10.1.3.1)とR2経由(10.2.3.2)の2つのパスがあり、どちらもAS_PATH65001の1個です。

R3(AS 65002): show bgp 192.168.1.0/24
BGP routing table entry for 192.168.1.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  7            7
Last Modified: Sep  6 21:55:55.774 for 00:10:38
Paths: (2 available, best #1)
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  65001, (received & used)
    10.1.3.1 from 10.1.3.1 (10.0.0.1)
      Origin IGP, metric 0, localpref 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
  65001, (received & used)
    10.2.3.2 from 10.2.3.2 (10.0.0.2)
      Origin IGP, localpref 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)

AS_PATH長・ORIGIN・MEDのいずれでも差がつかず、eBGPどうしでIGPメトリックも比較対象外なので、9番目の「経路の学習時期」まで下りてR1経由が選ばれています。

2つ先のAS 65004(R5)です。192.168.1.0/24はAS 65002経由(65002 65001)とAS 65003経由(65003 65001)の2つがあり、長さは同じ2です。

R5(AS 65004): show bgp
Status codes: s suppressed, d damped, h history, * valid, > best
              i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.168.1.0/24     10.3.5.3                               0 65002 65001 i
*                     10.4.5.4                               0 65003 65001 i
*  192.168.2.0/24     10.3.5.3                               0 65002 65001 i
*>                    10.4.5.4                               0 65003 65001 i
*> 192.168.3.0/24     10.3.5.3                 0             0 65002 i
*                     10.4.5.4                               0 65003 65001 65002 i
*  192.168.4.0/24     10.3.5.3                               0 65002 65001 65003 i
*>                    10.4.5.4                 0             0 65003 i
*> 192.168.5.0/24     0.0.0.0                  0         32768 i

Processed 5 prefixes, 9 paths

R5からのtracerouteです。AS 65002(10.3.5.3 = R3)へ入り、そこからR1(10.1.3.1)へ直接抜けています。

R5: traceroute 192.168.1.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.1.1

 1  10.3.5.3 9 msec  6 msec  5 msec 
 2  10.1.3.1 9 msec  *  9 msec

STEP 1:MEDで隣接ASの入口を変える

比較の基準として、まずMEDで同じことをやってみます。R1からR3へ広告する経路にMED 200を、R2からR3へ広告する経路にMED 50を付けます。

R1: show running-config(R2側は set med 50 の MED-50 が同じ形で入る)
route-policy MED-200
  set med 200
  pass
end-policy
!
<snip>
 neighbor 10.1.3.3
  remote-as 65002
  description eBGP to R3
  address-family ipv4 unicast
   route-policy PASS-ALL in
   route-policy MED-200 out
   soft-reconfiguration inbound always
  !
 !

R3のベストパスがR2経由(10.2.3.2)に変わりました。AS_PATHはどちらも65001のまま同点で、6番目のMEDで決着しています。

R3: show bgp 192.168.1.0/24(MED適用後)
BGP routing table entry for 192.168.1.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 14           14
Last Modified: Sep  6 22:23:59.774 for 00:00:52
Paths: (2 available, best #2)
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  Path #1: Received by speaker 0
  Not advertised to any peer
  65001, (received & used)
    10.1.3.1 from 10.1.3.1 (10.0.0.1)
      Origin IGP, metric 200, localpref 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  65001, (received & used)
    10.2.3.2 from 10.2.3.2 (10.0.0.2)
      Origin IGP, metric 50, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 14
      Origin-AS validity: (disabled)

パケットの中でもMULTI_EXIT_DISCが200になっているのが見えます。AS_PATH65001の1個のままです。

No.99 R1 → R3 のUPDATE(tshark -V、192.168.1.0/24 の分)
        Path Attribute - AS_PATH: 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 6
            AS Path segment: 65001
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 1
                AS4: 65001
        Path Attribute - MULTI_EXIT_DISC: 200
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Type Code: MULTI_EXIT_DISC (4)
            Length: 4
            Multiple exit discriminator: 200
上のtshark出力のパケット(No.99 UPDATE)のpcapをダウンロード

一方、2つ先のR5では何も変わっていません。ベストパスはAS 65002経由のままで、Metric欄も空です。

R5: show bgp 192.168.1.0/24(MED適用後・変化なし)
BGP routing table entry for 192.168.1.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  7            7
Last Modified: Sep  6 21:56:23.774 for 00:28:55
Paths: (2 available, best #1)
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  65002 65001, (received & used)
    10.3.5.3 from 10.3.5.3 (10.0.0.3)
      Origin IGP, localpref 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
  65003 65001, (received & used)
    10.4.5.4 from 10.4.5.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, group-best
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)

Last ModifiedがSTEP 0のまま(21:56:23)で、AS 65001が設定を変えたこと自体がR5には届いていません。MEDはAS境界を越えないため、R3は受け取ったMEDをR5へ再送しません。

ただしトラフィックの経路は変わります。R5からのtracerouteは、1ホップ目(R3に入る)は同じですが、AS 65002の中での出口が10.2.3.2(R2)に変わりました。

R5: traceroute(MED適用後)
Type escape sequence to abort.
Tracing the route to 192.168.1.1

 1  10.3.5.3 6 msec  5 msec  5 msec 
 2  10.2.3.2 8 msec  8 msec  9 msec 
 3  10.1.2.1 23 msec  *  13 msec

BGPの経路選択は変わっていないのにパケットの通り道が変わるのは、AS 65002の中の判断が変わったからです。R5にとって「AS 65002を通る」ことに変わりはありません。

STEP 2:AS_PATHプリペンドで同じことをする

MEDを撤去し、代わりにR1からR3への出方向にプリペンドを1回入れます。

R1: show running-config(MED-200 は削除済み)
route-policy PREPEND-1
  prepend as-path own-as 1
  pass
end-policy
!
<snip>
 neighbor 10.1.3.3
  remote-as 65002
  description eBGP to R3
  address-family ipv4 unicast
   route-policy PASS-ALL in
   route-policy PREPEND-1 out
   soft-reconfiguration inbound always
  !
 !

R1がR3へ広告する経路のAS_PATH65001 65001になりました。自分が広告を始めた192.168.1.0/24も、R2から受け取って中継している192.168.2.0/24192.168.4.0/24も、区別なく全部延びています。

R1: show bgp neighbors 10.1.3.3 advertised-routes
Network            Next Hop        From            AS Path
192.168.1.0/24     10.1.3.1        Local           65001 65001i
192.168.2.0/24     10.1.3.1        10.0.0.2        65001 65001i
192.168.4.0/24     10.1.3.1        10.0.0.2        65001 65001 65003i

Processed 3 prefixes, 3 paths

パケットでもAS_PATHのセグメント長が2になり、AS4: 65001が2つ並んでいます。MEDは0に戻っています。

No.126 R1 → R3 のUPDATE(tshark -V、192.168.1.0/24 の分)
        Path Attribute - AS_PATH: 65001 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 10
            AS Path segment: 65001 65001
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 2
                AS4: 65001
                AS4: 65001
        Path Attribute - MULTI_EXIT_DISC: 0
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Type Code: MULTI_EXIT_DISC (4)
            Length: 4
            Multiple exit discriminator: 0
上のtshark出力のパケット(No.126 UPDATE)のpcapをダウンロード

R3のベストパスはR2経由に変わりました。STEP 1と同じ結果ですが、決着した段は違います。今回は4番目のAS_PATH長(2個 対 1個)で決まっており、MEDまで下りていません。

R3: show bgp 192.168.1.0/24(プリペンド適用後)
BGP routing table entry for 192.168.1.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 17           17
Last Modified: Sep  6 22:30:26.774 for 00:02:06
Paths: (2 available, best #2)
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  Path #1: Received by speaker 0
  Not advertised to any peer
  65001 65001, (received & used)
    10.1.3.1 from 10.1.3.1 (10.0.0.1)
      Origin IGP, metric 0, localpref 100, valid, external
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  65001, (received & used)
    10.2.3.2 from 10.2.3.2 (10.0.0.2)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 17
      Origin-AS validity: (disabled)

そしてR5は、STEP 1と同じく変化していません

R5: show bgp(プリペンド1本のみ・変化なし)
Status codes: s suppressed, d damped, h history, * valid, > best
              i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.168.1.0/24     10.3.5.3                               0 65002 65001 i
*                     10.4.5.4                               0 65003 65001 i
*  192.168.2.0/24     10.3.5.3                               0 65002 65001 i
*>                    10.4.5.4                               0 65003 65001 i
*> 192.168.3.0/24     10.3.5.3                 0             0 65002 i
*                     10.4.5.4                               0 65003 65001 65002 i
*  192.168.4.0/24     10.3.5.3                               0 65002 65001 65003 i
*>                    10.4.5.4                 0             0 65003 i
*> 192.168.5.0/24     0.0.0.0                  0         32768 i

Processed 5 prefixes, 9 paths

R5が受け取るAS_PATH65002 65001のままです。R3はR2経由(延びていないほう)をベストパスに選び、そのベストパスだけをR5へ広告しているためです。延びた65001 65001はR3の中で候補として残るだけで、外へは出ていきません。

ここまでは、MEDでもプリペンドでも「隣接ASの入口を変える」という同じ結果になりました。

STEP 3:出口を両方とも延ばして、2つ先のASを動かす

R2からR3への出方向にも同じプリペンドを入れます。これでAS 65001からAS 65002への出口が2本とも延びます。

R2: show running-config(PREPEND-1 はR1と同じ内容)
 neighbor 10.2.3.3
  remote-as 65002
  description eBGP to R3
  address-family ipv4 unicast
   route-policy PASS-ALL in
   route-policy PREPEND-1 out
   soft-reconfiguration inbound always
  !
 !

R3が持つ2つのパスは両方とも65001 65001になり、R3が選んだどちらをR5へ広告してもAS_PATHは3個になります。

R3: show bgp neighbors 10.3.5.5 advertised-routes
Network            Next Hop        From            AS Path
192.168.1.0/24     10.3.5.3        10.1.3.1        65002 65001 65001i
192.168.2.0/24     10.3.5.3        10.1.3.1        65002 65001 65001i
192.168.3.0/24     10.3.5.3        Local           65002i
192.168.4.0/24     10.3.5.3        10.3.5.5        65002 65004 65003i
192.168.5.0/24     10.3.5.3        10.3.5.5        65002 65004i

Processed 5 prefixes, 5 paths

AS 65004に届いたこのUPDATEでは、AS 65001が設定した1回のプリペンドが、AS 65002を越えてAS 65004まで運ばれています。

No.168 R3 → R5 のUPDATE(tshark -V、192.168.1.0/24 の分)
        Path Attribute - AS_PATH: 65002 65001 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 14
            AS Path segment: 65002 65001 65001
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 3
                AS4: 65002
                AS4: 65001
                AS4: 65001
上のtshark出力のパケット(No.168 UPDATE)のpcapをダウンロード

R5のベストパスがAS 65003経由(10.4.5.4)に切り替わりました。AS 65002経由は3個、AS 65003経由は2個なので、4番目のAS_PATH長で決着しています。

R5: show bgp(プリペンド2本)
Status codes: s suppressed, d damped, h history, * valid, > best
              i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
   Network            Next Hop            Metric LocPrf Weight Path
*  192.168.1.0/24     10.3.5.3                               0 65002 65001 65001 i
*>                    10.4.5.4                               0 65003 65001 i
*  192.168.2.0/24     10.3.5.3                               0 65002 65001 65001 i
*>                    10.4.5.4                               0 65003 65001 i
*> 192.168.3.0/24     10.3.5.3                 0             0 65002 i
*                     10.4.5.4                               0 65003 65001 65002 i
*> 192.168.4.0/24     10.4.5.4                 0             0 65003 i
*> 192.168.5.0/24     0.0.0.0                  0         32768 i

Processed 5 prefixes, 8 paths

tracerouteも1ホップ目から変わりました。AS 65001と直接つながっていないAS 65004が、AS 65001の設定によって隣接ASの選択そのものを変えています。

R5: traceroute(プリペンド2本)
Type escape sequence to abort.
Tracing the route to 192.168.1.1

 1  10.4.5.4 6 msec  8 msec  5 msec 
 2  10.2.4.2 8 msec  8 msec  8 msec 
 3  10.1.2.1 10 msec  *  12 msec

STEP 1のMEDでは、R5のtracerouteは1ホップ目が10.3.5.3のまま(AS 65002経由)でした。プリペンドはここが動きます。これがMEDとの決定的な違いです。

プリペンドは意図した相手より先まで効きます。 この検証ではAS 65004の経路が変わりましたが、実際のインターネットではAS_PATHが届く範囲すべてが影響を受けます。隣接ASの入口だけを調整したいなら、伝播しないMEDのほうが副作用は小さくなります。

副作用はこのプレフィックスだけに留まりません。R3(AS 65002)の192.168.4.0/24も、AS 65001経由が65001 65001 65003の3個に延びた結果、AS 65004経由の65004 65003(2個)に負けてベストパスが入れ替わっています。上のadvertised-routes192.168.4.0/24From10.3.5.5(R5)になっているのがそれです。AS 65001が自分の経路のために入れたプリペンドが、AS 65001とは無関係なプレフィックスの選択まで動かしています。

STEP 4:ポリシーを外してもベストパスは戻らない

R1・R2の両方からプリペンドを撤去し、route-policy PASS-ALL outに戻します。この時点で5台すべてのrunning-configはSTEP 0と完全に一致します。

R3がR5へ広告するAS_PATH65002 65001に戻りました。

R3: show bgp neighbors 10.3.5.5 advertised-routes(撤去後)
Network            Next Hop        From            AS Path
192.168.1.0/24     10.3.5.3        10.1.3.1        65002 65001i
192.168.2.0/24     10.3.5.3        10.1.3.1        65002 65001i
192.168.3.0/24     10.3.5.3        Local           65002i
192.168.4.0/24     10.3.5.3        10.3.5.5        65002 65004 65003i
192.168.5.0/24     10.3.5.3        10.3.5.5        65002 65004i

ところがR5のベストパスはAS 65003経由のままです。

R5: show bgp 192.168.1.0/24(撤去後・戻っていない)
BGP routing table entry for 192.168.1.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  8            8
Last Modified: Sep  6 22:34:24.774 for 00:08:05
Paths: (2 available, best #2)
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002 65001, (received & used)
    10.3.5.3 from 10.3.5.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, external, group-best
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  65003 65001, (received & used)
    10.4.5.4 from 10.4.5.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 8
      Origin-AS validity: (disabled)

AS_PATHは両方とも65002 6500165003 65001の2個で同点に戻っています。そのため4番目では決着せず、9番目の「経路の学習時期(古いほう)」まで下ります。AS 65003経由のパスはSTEP 3でベストパスになって以降そのまま保持されており、AS 65002経由のパスはSTEP 4で新しく入れ直されたため、古いAS 65003経由が勝ち続けます。

Last Modified22:34:24=STEP 3の時刻のままである点がその証拠です。

設定を元に戻してもベストパスは元に戻らないことになります。BGPは経路のフラップを避けるため、同点なら現状維持を選ぶよう設計されているためです。

STEP 5:セッションをリセットして初期状態に戻す

まずソフトリセットを試します。R5でclear bgp ipv4 unicast 10.4.5.4 soft inを実行しましたが、直後のshow bgp 192.168.1.0/24Last ModifiedSep 6 22:34:24.774Speakerのバージョンが8のままで、STEP 4の状態(上の出力)から何も動きませんでした。soft inは入方向ポリシーを再適用するだけで、タイブレークに使われる経路の「古さ」はリセットしません。

そこでセッションを落として張り直します。IOS XRのclear bgpには確認プロンプトが出るものがあるため、ここではネイバーのshutdownno shutdownを続けて投入しました。

R5に投入したコマンド(2回に分けてcommit)
router bgp 65004
 neighbor 10.4.5.4
  shutdown

router bgp 65004
 neighbor 10.4.5.4
  no shutdown

syslogにセッションの切断と再確立が残ります(間の行はno shutdownのcommitログです)。

R5: show logging(STEP 5の範囲)
RP/0/RP0/CPU0:Sep  6 23:09:19.795 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.4.5.4 Down - Admin. shutdown (CEASE notification sent - administrative shutdown) (VRF: default) (AS: 65003) 
<snip>
RP/0/RP0/CPU0:Sep  6 23:09:58.957 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.4.5.4 Up (VRF: default) (AS: 65003) 

再確立後、AS 65003経由のパスが「新しい」側になり、AS 65002経由がベストパスに戻りました。

R5: show bgp 192.168.1.0/24(セッションリセット後)
BGP routing table entry for 192.168.1.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 11           11
Last Modified: Sep  6 23:09:19.774 for 00:04:21
Paths: (2 available, best #1)
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to update-groups (with more than one peer):
    0.2 
  65002 65001, (received & used)
    10.3.5.3 from 10.3.5.3 (10.0.0.3)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 11
      Origin-AS validity: (disabled)
  Path #2: Received by speaker 0
  Not advertised to any peer
  65003 65001, (received & used)
    10.4.5.4 from 10.4.5.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, group-best
      Received Path ID 0, Local Path ID 0, version 0
      Origin-AS validity: (disabled)

tracerouteもSTEP 0と同じ経路に戻りました。

R5: traceroute(セッションリセット後)
Type escape sequence to abort.
Tracing the route to 192.168.1.1

 1  10.3.5.3 6 msec  4 msec  5 msec 
 2  10.1.3.1 8 msec  *  9 msec
リセットする順序で結果が変わります。 9番目の比較が「古いほう」である以上、後にリセットしたセッションの経路がいちばん新しくなり、タイブレークで負けます。 この検証ではR3 - R5を先に、R4 - R5を後にリセットしたためAS 65002経由が勝ちました。逆順にすれば逆の結果になります。同点の経路を意図した側に寄せたいなら、リセット順に頼らずLOCAL_PREFWEIGHTで明示的に差をつけるべきです。

なお、この順序依存のため、R2が広告する192.168.2.0/24だけはSTEP 0と逆の選択(AS 65002経由)で落ち着いています。STEP 0では偶然AS 65003経由が先に届いていたためで、設定は同一です。

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow version / show interface description / show route / show route bgp / show bgp / show bgp summary / show bgp <プレフィックス>(5プレフィックス分) / show bgp neighbor / show bgp neighbors <ピア> advertised-routes / show bgp neighbors <ピア> routes / show bgp neighbors <ピア> received routes / show bgp update-group / show rpl route-policy / show ospf neighbor(R1・R2のみ) / traceroute(R3・R4・R5のみ)
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)

最終状態(STEP 5)ではポリシーはPASS-ALLのみで、STEP 0のrunning-configと5台すべて一致しています。

STEP 0:初期状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun
R5showlogrun

STEP 1:R1→R3にMED 200、R2→R3にMED 50を適用した状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun
R5showlogrun

STEP 2:MEDを撤去し、R1→R3にプリペンド×1を適用した状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun
R5showlogrun

STEP 3:R2→R3にもプリペンド×1を適用した状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun
R5showlogrun

STEP 4:プリペンドを撤去した状態(設定はSTEP 0と同一)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun
R5showlogrun

STEP 5:BGPセッションをリセットした状態(最終状態)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun
R5showlogrun

キャプチャー全体は次のとおりです。STEP 0からSTEP 4までのポリシー変更にともなうUPDATEがすべて入っています(STEP 5のセッションリセットは取得範囲外です)。

R1 - R3間のキャプチャー全体をダウンロード

R3 - R5間のキャプチャー全体をダウンロード

プリペンド撤去後にR3が再送したUPDATE(No.183)のpcapをダウンロード

参考

資料タイトル概要
RFC 4271A Border Gateway Protocol 4 (BGP-4)4.3節でAS_PATHのセグメント型を、5.1.2節でeBGP/iBGPでの更新規則を、9.1.2.2節でベストパス選択における比較順序を定義。
RFC 6793BGP Support for Four-Octet Autonomous System (AS) Number Space4バイトAS番号への拡張。非対応ルータを跨ぐ際のAS4_PATHの扱いを定義。
RFC 7454BGP Operations and Security6.1節でAS_PATHの長さに上限を設けるなど、運用上の推奨事項を記載。
IANABorder Gateway Protocol (BGP) Parametersパス属性のType codeやAS_PATHのセグメント型など、BGPで使われる番号の割り当て一覧。

関連記事