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

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

目次

パス属性とは

パス属性(Path Attribute)は、BGPが経路とセットで運ぶ付加情報です。BGPメッセージで解説したUPDATEメッセージのPath Attributesフィールドに入り、そのUPDATEが運ぶすべてのNLRI(宛先プレフィックス)に共通して適用されます。

経路がどのASを通ってきたか(AS_PATH)、次にどこへ転送すればよいか(NEXT_HOP)、どの経路を優先すべきか(LOCAL_PREFMED)といった情報がここに入ります。BGPが「パスベクター型」と呼ばれるのは、距離(メトリック)ではなくこうした属性の集合で経路を評価するためです。

1つのパス属性は、フラグ・種別・長さ・値の4つで構成されます。

属性の4分類

Attribute Flagsの上位2ビット(Optional と Transitive)の組み合わせで、属性は4つに分類されます。この分類は「実装が必ず対応しなければならないか」と「知らない属性を隣のASへ転送してよいか」を決めます。

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

well-known属性は「すべてのBGP実装が理解できる」前提なので、Transitiveビットは常に1です。分類を分けているのは主にoptional属性のためで、知らない属性に出会ったときの振る舞いが transitive か non-transitive かで変わります。

Partialビットは optional transitive 属性でのみ使われます。属性を理解できないルータがそのまま転送するときに1を立て、「経路上のどこかに、この属性を認識しなかったルータがある」ことを示します。

パス属性の一覧

主なパス属性とType codeは次のとおりです。番号の割り当ては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 discretionaryAS内でどの出口を優先するかを示す。iBGPピアにのみ広告する。LOCAL_PREFで解説します。
6ATOMIC_AGGREGATEWell-known discretionaryより詳細な経路を含む集約経路であることを示す。経路集約の記事で解説します。
7AGGREGATOROptional transitive経路を集約したルータのAS番号とRouter ID。経路集約の記事で解説します。
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メッセージにあります。

WEIGHTはパス属性ではない

CiscoルータにはWEIGHTという値があり、ベストパス選択で最初に評価されます。ただしこれはCisco独自のローカル値で、UPDATEメッセージには載りません。設定したルータの中でのみ有効で、隣のルータには伝わりません。

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

WEIGHTで解説します。

ベストパス選択の順序

同じプレフィックスに複数の経路を学習した場合、BGPはそのうち1つだけをベストパスとして選び、ルーティングテーブルに入れて、さらにピアへ広告します。

前提として、NEXT_HOPに到達できない経路は候補から外れますNEXT_HOPが解決できているかどうかが最初の関門で、ここで落ちる例はnext-hop-selfで扱っています。

到達可能な経路が複数ある場合、次の順序で比較し、決着がついた時点で選択を終えます。以下はIOS XRでの順序です。IOS XEの列は、同じ段でIOS XEの挙動が一致するかを示しています。

順序比較項目優先IOS XE
1WEIGHT大きいほう同じ
2LOCAL_PREF大きいほう同じ
3自身が生成した経路network / redistribute / 集約で生成したもの同じ
4AS_PATHの長さ短いほう同じ
5ORIGINIGP < EGP < Incomplete同じ
6MULTI_EXIT_DISC小さいほう(同じ隣接ASから学習した経路同士のみ比較)同じ
7eBGPとiBGPeBGPで学習した経路同じ
8NEXT_HOPまでのIGPメトリック小さいほう同じ
9経路の学習時期古いほう(eBGP経路同士の場合)同じ
10BGP Router ID小さいほう(ORIGINATOR_IDがあればその値)同じ
11CLUSTER_LISTの長さ短いほう同じ
12ネイバーのIPアドレス小さいほう同じ

IOS XRと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

実機での検証

IOS XR(XRd)のルータ5台を使い、UPDATEメッセージの中でパス属性がどのフラグを持つかを確認します。トポロジはルートリフレクタと同じで、AS 65001内はR2をルートリフレクタとするiBGP、AS間はeBGPです。

このままでは optional transitive の属性が現れないため、R3のeBGP向けルートポリシーでCOMMUNITYを付けます。

R3 COMMUNITYを付ける設定
route-policy SET-COMM
  set community (65001:100)
  pass
end-policy
!
router bgp 65001
 neighbor 10.3.4.4
  remote-as 65002
  address-family ipv4 unicast
   send-community-ebgp
   route-policy PASS-ALL in
   route-policy SET-COMM out
  !
 !
!
IOS XRでは、eBGPピアへCOMMUNITYを送るためにsend-community-ebgpが必要です(IOS XEではneighbor <address> send-community)。設定を忘れると、ルートポリシーでコミュニティを付けても相手には届きません。これは属性の推移性とは別の、実装側の送信制御です。

iBGPのUPDATEで観測できる属性

R1 - R2間(iBGP)をキャプチャーし、R2がR1へ192.168.3.0/24を広告するUPDATEを見ます。添付のiBGPキャプチャー(bgp-path-attributes-ibgp.pcap)のNo.22にあたるTCPセグメントで、この中に3つのUPDATEが入っています。以下はそのうち192.168.3.0/24を広告する1つ分です。フラグのビット内訳は<snip>で省略しています。

このNo.22だけを抜き出したもの(bgp-path-attributes-ibgp-no22.pcap) をダウンロード
R2 → R1 UPDATE(192.168.3.0/24、iBGP)
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 75
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 52
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.0.0.3
                IPv4 Address: 10.0.0.3
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                192.168.3.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 192.168.3.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        Path Attribute - AS_PATH: empty
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 0
        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
        Path Attribute - LOCAL_PREF: 100
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: LOCAL_PREF (5)
            Length: 4
            Local preference: 100
        Path Attribute - CLUSTER_LIST: 10.0.0.2
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Type Code: CLUSTER_LIST (10)
            Length: 4
            Cluster List: 10.0.0.2
                Cluster ID: 10.0.0.2
        Path Attribute - ORIGINATOR_ID: 10.0.0.3
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Type Code: ORIGINATOR_ID (9)
            Length: 4
            Originator identifier: 10.0.0.3

well-known属性は0x40(Transitive, Well-known)、optional non-transitiveの属性は0x80(Optional, Non-transitive)です。LOCAL_PREFはwell-known discretionaryなのでフラグ上はwell-known属性と同じ0x40ですが、iBGPピアにのみ広告される点がORIGINAS_PATHと異なります。

eBGPのUPDATEで観測できる属性

R3 - R4間(eBGP)をキャプチャーし、R3がR4へ192.168.3.0/24を広告するUPDATEを見ます。eBGPキャプチャー(bgp-path-attributes-ebgp.pcap)のNo.21にあたるTCPセグメントで、この中に4つのUPDATEが入っています。

このNo.21だけを抜き出したもの(bgp-path-attributes-ebgp-no21.pcap) をダウンロード
R3 → R4 UPDATE(192.168.3.0/24、eBGP)
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 67
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 44
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.3.4.3
                IPv4 Address: 10.3.4.3
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                192.168.3.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 192.168.3.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        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: 0
            Flags: 0x80, Optional, Non-transitive, Complete
<snip>
            Type Code: MULTI_EXIT_DISC (4)
            Length: 4
            Multiple exit discriminator: 0
        Path Attribute - COMMUNITIES: 65001:100
            Flags: 0xc0, Optional, Transitive, Complete
<snip>
            Type Code: COMMUNITIES (8)
            Length: 4
            Communities: 65001:100
                Community: 65001:100
                    Community AS: 65001
                    Community value: 100

COMMUNITIESのフラグが0xc0(Optional, Transitive)になっています。同じUPDATEにLOCAL_PREFが入っていないことにも注目してください。well-known discretionaryのLOCAL_PREFはAS内でのみ有効なため、eBGPピアへは送られません。同様にORIGINATOR_IDCLUSTER_LISTもASを越えません。

ここまでで、4分類すべてを実際のパケットで確認できました。

分類フラグこの検証で観測した属性観測したリンク
Well-known mandatory0x40ORIGINAS_PATHiBGP / eBGP の両方
Well-known discretionary0x40LOCAL_PREFiBGPのみ
Optional transitive0xc0COMMUNITIESeBGP
Optional non-transitive0x80MULTI_EXIT_DISCORIGINATOR_IDCLUSTER_LISTiBGP(MEDはeBGPでも観測)
MP_REACH_NLRIのフラグは0x90です。0x80(Optional, Non-transitive)に0x10(Extended Length)が加わったもので、属性長フィールドが2バイトであることを示しています。

推移性を実機で確認する

COMMUNITYが optional transitive であることを、ASを2つ越えさせて確認します。コミュニティを付けているのはAS 65001のR3だけです。

まずR4(AS 65002)での受信を確認します。

R4 show bgp 192.168.3.0/24
RP/0/RP0/CPU0:R4#show bgp 192.168.3.0/24

BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 14           14
Last Modified: Sep  5 08:09:28.774 for 00:02:53
Paths: (1 available, best #1)
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.4.5.5        10.3.4.3
  Path #1: Received by speaker 0
  65001
    10.3.4.3 from 10.3.4.3 (10.0.0.3)
      Origin IGP, metric 0, localpref 100, valid, external, best, group-best
      Community: 65001:100
      Origin-AS validity: (disabled)

次にR4でもR5向けにsend-community-ebgpを設定すると、さらに隣のAS 65003のR5まで同じ値が届きます。

R5 show bgp 192.168.3.0/24
RP/0/RP0/CPU0:R5#show bgp 192.168.3.0/24

BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 14           14
Last Modified: Sep  5 08:11:52.774 for 00:00:05
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  65002 65001
    10.4.5.4 from 10.4.5.4 (10.0.0.4)
      Origin IGP, localpref 100, valid, external, best, group-best
      Community: 65001:100
      Origin-AS validity: (disabled)

AS 65001で付けたCOMMUNITYが、AS 65002を経由してAS 65003まで運ばれています。一方、同じUPDATEに入っていたORIGINATOR_IDCLUSTER_LIST(optional non-transitive)はAS 65001の外には出ていません。これが transitive と non-transitive の違いです。

キャプチャー全体は次からダウンロードできます。

iBGPキャプチャー全体(bgp-path-attributes-ibgp.pcap) をダウンロード

eBGPキャプチャー全体(bgp-path-attributes-ebgp.pcap) をダウンロード

検証Config

COMMUNITYの設定を追加したR3とR4のコンフィグです。R1・R2・R5はルートリフレクタの検証Configと同じです。

R3 config(r3_bgp-path-attributes.cfg) をダウンロード

R4 config(r4_bgp-path-attributes.cfg) をダウンロード

参考

資料タイトル概要
RFC 4271A Border Gateway Protocol 4 (BGP-4)パス属性の4分類、well-known属性の定義、経路選択の基本仕様。
RFC 1997BGP Communities AttributeCOMMUNITY属性を定義。
RFC 4360BGP Extended Communities AttributeEXTENDED COMMUNITIES属性を定義。
RFC 4456BGP Route ReflectionORIGINATOR_IDCLUSTER_LISTを定義。
RFC 4760Multiprotocol Extensions for BGP-4MP_REACH_NLRIMP_UNREACH_NLRIを定義。
RFC 6793BGP Support for Four-Octet AS Number SpaceAS4_PATHAS4_AGGREGATORを定義。
RFC 8092BGP Large Communities AttributeLARGE_COMMUNITY属性を定義。
IANABorder Gateway Protocol (BGP) Parametersパス属性のType codeなど、BGPで使われる番号の割り当て一覧。

関連記事