パス属性とは
パス属性(Path Attribute)は、BGPが経路とセットで運ぶ付加情報です。BGPメッセージで解説したUPDATEメッセージのPath Attributesフィールドに入り、そのUPDATEが運ぶすべてのNLRI(宛先プレフィックス)に共通して適用されます。
経路がどのASを通ってきたか(AS_PATH)、次にどこへ転送すればよいか(NEXT_HOP)、どの経路を優先すべきか(LOCAL_PREF、MED)といった情報がここに入ります。BGPが「パスベクター型」と呼ばれるのは、距離(メトリック)ではなくこうした属性の集合で経路を評価するためです。
1つのパス属性は、フラグ・種別・長さ・値の4つで構成されます。
属性の4分類
Attribute Flagsの上位2ビット(Optional と Transitive)の組み合わせで、属性は4つに分類されます。この分類は「実装が必ず対応しなければならないか」と「知らない属性を隣のASへ転送してよいか」を決めます。
| 分類 | Optional | Transitive | 意味 |
|---|---|---|---|
| Well-known mandatory | 0 | 1 | すべての実装が対応必須。UPDATEに必ず含めなければならない。 |
| Well-known discretionary | 0 | 1 | すべての実装が対応必須だが、UPDATEに含めるかは任意。 |
| Optional transitive | 1 | 1 | 対応は任意。知らない属性でもPartialビットを立てて隣へ転送する。 |
| Optional non-transitive | 1 | 0 | 対応は任意。知らない属性は破棄し、隣へ転送しない。 |
well-known属性は「すべてのBGP実装が理解できる」前提なので、Transitiveビットは常に1です。分類を分けているのは主にoptional属性のためで、知らない属性に出会ったときの振る舞いが transitive か non-transitive かで変わります。
Partialビットは optional transitive 属性でのみ使われます。属性を理解できないルータがそのまま転送するときに1を立て、「経路上のどこかに、この属性を認識しなかったルータがある」ことを示します。パス属性の一覧
主なパス属性とType codeは次のとおりです。番号の割り当てはIANAのBGP Parametersで管理されています。
| Type code | 属性 | 分類 | 概要 |
|---|---|---|---|
| 1 | ORIGIN | Well-known mandatory | 経路がBGPに入った経緯(IGP / EGP / Incomplete)。ORIGINで解説します。 |
| 2 | AS_PATH | Well-known mandatory | 経路が通過したAS番号の並び。ループ検出と経路長の比較に使う。AS_PATHで解説します。 |
| 3 | NEXT_HOP | Well-known mandatory | 経路の次ホップIPアドレス。NEXT_HOPおよびnext-hop-selfで解説します。 |
| 4 | MULTI_EXIT_DISC(MED) | Optional non-transitive | 隣接ASに対して、自AS内のどの入口を使ってほしいかを示す。MEDで解説します。 |
| 5 | LOCAL_PREF | Well-known discretionary | AS内でどの出口を優先するかを示す。iBGPピアにのみ広告する。LOCAL_PREFで解説します。 |
| 6 | ATOMIC_AGGREGATE | Well-known discretionary | より詳細な経路を含む集約経路であることを示す。経路集約の記事で解説します。 |
| 7 | AGGREGATOR | Optional transitive | 経路を集約したルータのAS番号とRouter ID。経路集約の記事で解説します。 |
| 8 | COMMUNITY | Optional transitive | 経路にタグを付け、ポリシーの適用対象をまとめて指定する。COMMUNITYで解説します。 |
| 9 | ORIGINATOR_ID | Optional non-transitive | ルートリフレクタが反射する際に付ける、経路をAS内に持ち込んだルータのRouter ID。ルートリフレクタで解説しています。 |
| 10 | CLUSTER_LIST | Optional non-transitive | 経路が通過したクラスタIDのリスト。ルートリフレクタで解説しています。 |
| 14 | MP_REACH_NLRI | Optional non-transitive | IPv4ユニキャスト以外のアドレスファミリーの経路を運ぶ(RFC 4760)。 |
| 15 | MP_UNREACH_NLRI | Optional non-transitive | 同じくマルチプロトコル拡張での経路の取り消し。 |
| 16 | EXTENDED COMMUNITIES | Optional transitive | 8バイトに拡張されたコミュニティ(RFC 4360)。 |
| 17 | AS4_PATH | Optional transitive | 4バイトAS番号に非対応のルータを経由する際にAS_PATHを補完する(RFC 6793)。 |
| 18 | AS4_AGGREGATOR | Optional transitive | 同じくAGGREGATORを補完する。 |
| 32 | LARGE_COMMUNITY | Optional transitive | 12バイトのコミュニティ(RFC 8092)。 |
MP_REACH_NLRI属性に入って広告されることがあります。実際の観測例はBGPメッセージにあります。WEIGHTはパス属性ではない
CiscoルータにはWEIGHTという値があり、ベストパス選択で最初に評価されます。ただしこれはCisco独自のローカル値で、UPDATEメッセージには載りません。設定したルータの中でのみ有効で、隣のルータには伝わりません。
| 項目 | LOCAL_PREF | WEIGHT |
|---|---|---|
| パス属性か | はい(Type code 5) | いいえ(Cisco独自のローカル値) |
| 伝わる範囲 | iBGPピア全体(AS内) | 設定したルータのみ |
| 既定値 | 100 | 0(自身が生成した経路は32768) |
| 大小 | 大きいほど優先 | 大きいほど優先 |
WEIGHTで解説します。
ベストパス選択の順序
同じプレフィックスに複数の経路を学習した場合、BGPはそのうち1つだけをベストパスとして選び、ルーティングテーブルに入れて、さらにピアへ広告します。
前提として、NEXT_HOPに到達できない経路は候補から外れます。NEXT_HOPが解決できているかどうかが最初の関門で、ここで落ちる例はnext-hop-selfで扱っています。
到達可能な経路が複数ある場合、次の順序で比較し、決着がついた時点で選択を終えます。以下はIOS XRでの順序です。IOS XEの列は、同じ段でIOS XEの挙動が一致するかを示しています。
| 順序 | 比較項目 | 優先 | IOS XE |
|---|---|---|---|
| 1 | WEIGHT | 大きいほう | 同じ |
| 2 | LOCAL_PREF | 大きいほう | 同じ |
| 3 | 自身が生成した経路 | network / redistribute / 集約で生成したもの | 同じ |
| 4 | AS_PATHの長さ | 短いほう | 同じ |
| 5 | ORIGIN | IGP < EGP < Incomplete | 同じ |
| 6 | MULTI_EXIT_DISC | 小さいほう(同じ隣接ASから学習した経路同士のみ比較) | 同じ |
| 7 | eBGPとiBGP | eBGPで学習した経路 | 同じ |
| 8 | NEXT_HOPまでのIGPメトリック | 小さいほう | 同じ |
| 9 | 経路の学習時期 | 古いほう(eBGP経路同士の場合) | 同じ |
| 10 | BGP Router ID | 小さいほう(ORIGINATOR_IDがあればその値) | 同じ |
| 11 | CLUSTER_LISTの長さ | 短いほう | 同じ |
| 12 | ネイバーのIPアドレス | 小さいほう | 同じ |
IOS XRとIOS XEでこの順序に違いはありません。差が出るのは、比較の挙動を変えるオプションのコマンド名です。
| 挙動 | IOS XR | IOS XE |
|---|---|---|
| 異なる隣接ASの経路同士でもMEDを比較する | bgp bestpath med always | bgp always-compare-med |
AS_PATH長を比較しない | bgp bestpath as-path ignore | bgp bestpath as-path ignore |
| 同点時にRouter IDまで必ず比較する | bgp bestpath compare-routerid | bgp bestpath compare-routerid |
実機での検証
IOS XR(XRd)のルータ5台を使い、UPDATEメッセージの中でパス属性がどのフラグを持つかを確認します。トポロジはルートリフレクタと同じで、AS 65001内はR2をルートリフレクタとするiBGP、AS間はeBGPです。
このままでは optional transitive の属性が現れないため、R3のeBGP向けルートポリシーで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
!
!
!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>で省略しています。
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.3well-known属性は0x40(Transitive, Well-known)、optional non-transitiveの属性は0x80(Optional, Non-transitive)です。LOCAL_PREFはwell-known discretionaryなのでフラグ上はwell-known属性と同じ0x40ですが、iBGPピアにのみ広告される点がORIGINやAS_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が入っています。
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: 100COMMUNITIESのフラグが0xc0(Optional, Transitive)になっています。同じUPDATEにLOCAL_PREFが入っていないことにも注目してください。well-known discretionaryのLOCAL_PREFはAS内でのみ有効なため、eBGPピアへは送られません。同様にORIGINATOR_IDとCLUSTER_LISTもASを越えません。
ここまでで、4分類すべてを実際のパケットで確認できました。
| 分類 | フラグ | この検証で観測した属性 | 観測したリンク |
|---|---|---|---|
| Well-known mandatory | 0x40 | ORIGIN、AS_PATH | iBGP / eBGP の両方 |
| Well-known discretionary | 0x40 | LOCAL_PREF | iBGPのみ |
| Optional transitive | 0xc0 | COMMUNITIES | eBGP |
| Optional non-transitive | 0x80 | MULTI_EXIT_DISC、ORIGINATOR_ID、CLUSTER_LIST | iBGP(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)での受信を確認します。
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まで同じ値が届きます。
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_IDとCLUSTER_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 4271 | A Border Gateway Protocol 4 (BGP-4) | パス属性の4分類、well-known属性の定義、経路選択の基本仕様。 |
| RFC 1997 | BGP Communities Attribute | COMMUNITY属性を定義。 |
| RFC 4360 | BGP Extended Communities Attribute | EXTENDED COMMUNITIES属性を定義。 |
| RFC 4456 | BGP Route Reflection | ORIGINATOR_IDとCLUSTER_LISTを定義。 |
| RFC 4760 | Multiprotocol Extensions for BGP-4 | MP_REACH_NLRIとMP_UNREACH_NLRIを定義。 |
| RFC 6793 | BGP Support for Four-Octet AS Number Space | AS4_PATHとAS4_AGGREGATORを定義。 |
| RFC 8092 | BGP Large Communities Attribute | LARGE_COMMUNITY属性を定義。 |
| IANA | Border Gateway Protocol (BGP) Parameters | パス属性のType codeなど、BGPで使われる番号の割り当て一覧。 |