MP-BGPとは
BGPはもともとIPv4ユニキャストの経路だけを運ぶプロトコルでした。 MP-BGP(Multiprotocol Extensions for BGP-4、RFC 4760)は、 これをIPv6・VPN・L2VPNなどIPv4以外の経路情報にも使えるようにした拡張です。
仕組みは、UPDATEメッセージに次の2つのパス属性を足しただけです。
| 属性 | Type code | 役割 |
|---|---|---|
MP_REACH_NLRI | 14 | 「このアドレスファミリーの、この宛先へは、このネクストホップで行ける」 |
MP_UNREACH_NLRI | 15 | 「このアドレスファミリーの、この宛先は取り消す」 |
どちらもOptional non-transitiveで、対応していないルータは無視し、他へ渡しません。 メッセージの形式・状態遷移・ベストパス選択は変わらないので、1つのTCPセッション(ポート179)で複数のアドレスファミリーを同時に運べます。
アドレスファミリー(AFI / SAFI)
運ぶ経路の種類は、AFI(Address Family Identifier、2バイト)とSAFI(Subsequent AFI、1バイト)の組で表します。 AFIがネットワーク層プロトコル、SAFIがその使い方です。
| AFI / SAFI | 経路の種類 | 使う場面 |
|---|---|---|
| 1 / 1 | IPv4 unicast | 通常のIPv4 |
| 2 / 1 | IPv6 unicast | 通常のIPv6 |
| 1 / 2、2 / 2 | IPv4 / IPv6 multicast | マルチキャストのRPF用経路 |
| 1 / 4、2 / 4 | IPv4 / IPv6 labeled unicast | ラベル付きユニキャスト(RFC 8277) |
| 1 / 128、2 / 128 | VPNv4 / VPNv6 | MPLS L3VPN(RFC 4364) |
| 25 / 65、25 / 70 | VPLS、EVPN | L2VPN |
| 16388 / 71 | BGP-LS | IGPのリンクステート情報 |
AFIの値はIANAのAddress Family Numbers、SAFIはRFC 4760が1(unicast)と2(multicast)を定義し、残りはIANAが管理しています。
アドレスファミリーごとにBGPテーブルとポリシーは別です。 IOS XRではaddress-familyブロックごとにnetwork文やroute-policyを書きます。
MP_REACH_NLRIとMP_UNREACH_NLRI
MP_REACH_NLRIは、ネクストホップと宛先プレフィックスをAFI / SAFIと一緒に1つの属性に入れたものです。
RFC 4271の基本形では、ネクストホップはNEXT_HOP属性(NEXT_HOP)、プレフィックスはUPDATE本体のNLRIフィールドでした。
Next Hopの長さは1バイトのフィールドで示すので、アドレスの種類を選びません(IPv4は4、IPv6は16または32)。
MP_UNREACH_NLRIはAFI / SAFIと取り消すプレフィックスだけです。NLRIの符号化はどちらも<長さ(ビット), プレフィックス>の並びで、RFC 4271と同じです。
| 規則 | RFC 4760 |
|---|---|
MP_REACH_NLRIを運ぶUPDATEは、ORIGINとAS_PATHを必ず伴う。iBGPではLOCAL_PREFも | 3(MUST) |
MP_REACH_NLRI以外にNLRIが無いUPDATEはNEXT_HOP属性を含めるべきでない。含まれていても受信側は無視する | 3(SHOULD NOT / SHOULD) |
MP_UNREACH_NLRIだけのUPDATEは、他の属性を伴わなくてよい | 4 |
1つの属性に入れる<AFI, SAFI>は1組だけ | 11 |
IOS XRはIPv4ユニキャストの経路もMP_REACH_NLRIで運びます。
一方、IPv4の取り消しはUPDATE本体のWithdrawn Routesフィールド(RFC 4271の基本形)、IPv6の取り消しはMP_UNREACH_NLRIです。
アドレスファミリーはOPENのCapabilityで合意する
どのアドレスファミリーを交換するかは、OPENメッセージのMultiprotocol Extensions Capability(Capability code 1、RFC 5492の仕組み)で伝えます。
| 規則 | 内容 |
|---|---|
| AFI / SAFIの組ごとにCapabilityを1つ入れる | IPv4とIPv6を運ぶならCapabilityが2つ並ぶ |
| 両者が広告したAFI / SAFIだけを交換する(RFC 4760 8) | 片側だけが広告したアドレスファミリーは流れない。相手の知らないCapabilityは無視する(RFC 5492 3、MUST) |
| 共通のAFI / SAFIが無いとき | RFC 5492 5は、NOTIFICATION(OPEN Message Error / Unsupported Capability)を送って切ってよい(MAY)とし、送るならDataフィールドに原因のCapabilityを入れなければならない(MUST)、切ったピアリングは自動で張り直すべきでない(SHOULD NOT)としている |
IOS XR(XRd 26.1.1)の実際の動きは次のとおりで、RFC 5492 5と2点が違います。
| 場面 | IOS XRの動き |
|---|---|
| ネイバーにアドレスファミリーを足す | Capabilityを交換し直すため、既存のアドレスファミリーを含むセッション全体を切断して張り直す。張り直すまでの間、そのネイバーから受けた経路はすべて消える。切断のときNOTIFICATIONは送らない(syslogはAddress family activated) |
| ネイバーからアドレスファミリーを外す | 同じくセッション全体を切断して張り直す。切断のときNOTIFICATION(Cease / Other Configuration Change)を送る |
| 張り直したとき共通のアドレスファミリーがある | 片側だけのアドレスファミリーは合意せず、共通のものだけで確立する |
| 共通のアドレスファミリーが1つも無い | OPENを受けた側がUnsupported Capabilityを送る。Dataフィールドは空で、数十秒ごとに張り直しを続ける |
稼働中のネイバーにアドレスファミリーを足す・外すと、IPv4など既存のアドレスファミリーの通信も、張り直すまで(この検証では20〜50秒ほど)止まります。
IPv6経路のネクストホップ(RFC 2545)
IPv6ユニキャスト(AFI 2 / SAFI 1)の運び方はRFC 2545が定めています。
IPv6にはリンクローカルアドレスがあるため、MP_REACH_NLRIのNext Hopは2通りです。
| Next Hop長 | 中身 | 使う条件(RFC 2545 3) |
|---|---|---|
| 32 | グローバル + リンクローカル(fe80::/10) | 広告する側・ネクストホップ・広告先ピアが同じサブネットにいるときだけ付ける(shall) |
| 16 | グローバルだけ | それ以外。iBGPのピアへ広告するときはリンクローカルを外してよい(may) |
IOS XRは、同じサブネットのeBGPでは32バイト、iBGPではリンクで張っても16バイトにします。 長さを分けているのはeBGPかiBGPかで、セッションをリンクで張るかLo0で張るかではありません。
TCPセッションをIPv4で張るかIPv6で張るかはBGPと無関係で、IPv4のセッションでIPv6経路を運ぶこともできます。
ただしRFC 2545 4は、その場合ネクストホップの決め方に「別途明示的な設定が要る」としています。
IOS XRは、セッションに使うインタフェース(update-sourceがあればそのインタフェース)のグローバルIPv6アドレスをネクストホップにします。
そのインタフェースにグローバルIPv6アドレスが無いと、IPv4を含めてセッションを確立しません(Idle (No global IPv6 address configured))。
実運用では、IPv6ユニキャストはIPv6のセッションで運ぶのが一般的です。ネクストホップが自然に決まり、IPv6の到達性をセッション自体で確かめられます。 逆向き(IPv6セッションでIPv4経路を運ぶ)には、Extended Next Hop Encoding Capability(code 5、RFC 8950)があり、XRdは既定でこれを広告します。
IOS XRでの設定
| 項目 | 内容 |
|---|---|
グローバルのaddress-family | そのアドレスファミリーを有効にし、network文を書く |
ネイバーのaddress-family | そのネイバーと交換するアドレスファミリー。書いた分だけCapabilityに入る |
show bgp ipv6 unicast … | IPv6のBGPテーブル・ネイバー・summaryはipv6 unicastを付けて見る(show bgpはIPv4) |
show bgp neighbors | Neighbor capabilitiesにアドレスファミリーごとのadvertised / receivedが出る。合意できなかったネイバーはshow bgp ipv6 unicast summaryで(NoNeg)になる |
実際の設定は、各STEPのshow configuration commit changesで示します。
実機での検証
XRd 26.1.1のルータ3台で確認します。
- AS 65001のR1とAS 65002のR2がeBGP、R2とR3がiBGP(R2は
next-hop-self)。AS 65002内はOSPF / OSPFv3 - 各ルータはLo1の
192.168.N.0/24と2001:db8:N::/64をnetwork文で広告する - STEP 0はIPv4セッション(R1 - R2はリンク、R2 - R3はLo0)だけ。R1のGi0/0/0/0には最初IPv6アドレスが無い。図は最終状態
- 出方向ポリシーはネイバーごとに別名(中身は
pass)、全ネイバーにsoft-reconfiguration inbound always - 疎通は毎STEP、R1のLo1とR3のLo1の間でIPv4 / IPv6の
ping(50発)とtracerouteで確かめる
検証の全体像
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 初期状態(IPv4のみ) | CapabilityはIPv4の1つ。IPv4経路もMP_REACH_NLRIで届く |
| 1 | IPv4セッションにIPv6ユニキャストを追加 | R1はグローバルIPv6アドレスが無くIPv4ごと確立しない。Lo0で張ったiBGPのネクストホップはLo0 |
| 2 | R1のリンクにIPv6アドレスを付ける | IPv4とIPv6の両方で確立し、ネクストホップは32バイト |
| 3 | IPv6セッションを別に張る(R2 - R3はリンクのアドレス) | eBGPは32バイト、リンクで張ったiBGPは16バイト |
| 4 | R2 - R3のIPv6セッションをLo0で張り直す | Lo0でもiBGPは16バイト |
| 5 | R2だけIPv4セッションにIPv6ユニキャストを追加 | 共通のIPv4だけで確立し、IPv6は(NoNeg) |
| 6 | R2だけIPv4セッションからIPv4ユニキャストを外す | 共通が無くUnsupported Capability。Dataは空で、張り直しを続ける |
| 7 | R2のIPv4セッションを元に戻す | 再び確立する |
| 8 | R1のnetwork文を外す | IPv6はMP_UNREACH_NLRI、IPv4はWithdrawn Routesで取り消す |
| 9 | R1のnetwork文を戻す(最終状態) | 設定がSTEP 4と一致し、疎通が戻る |
R1のLo1からR3のLo1へのpingの成功率です。
| STEP | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| IPv4 | 100% | 0% | 100% | 100% | 100% | 100% | 0% | 100% | 0% | 100% |
| IPv6 | 0% | 0% | 100% | 100% | 100% | 100% | 100% | 100% | 0% | 100% |
STEP 0:初期状態(IPv4のみ)
CapabilityはIPv4ユニキャストの1つだけで、IPv4の経路もMP_REACH_NLRIで届きます。 IPv6の経路はまだ無く、IPv6のpingは届きません。
RP/0/RP0/CPU0:R2#show bgp neighbors
Sun Sep 13 09:38:16.965 UTC
<snip>
BGP neighbor is 10.1.2.1
Remote AS 65001, local AS 65002, external link
Description: eBGP to R1 (IPv4 session)
Remote router ID 10.0.0.1
BGP state = Established, up for 00:02:26
<snip>
Neighbor capabilities:
Route refresh: advertised (old + new) and received (old + new)
4-byte AS: advertised and received
Address family IPv4 Unicast: advertised and receivedR1のOPEN(R1-R2間キャプチャーのNo.30)のMultiprotocol Extensions CapabilityはAFI: IPv4 / SAFI: Unicastの1つです。
Border Gateway Protocol - OPEN Message
Marker: ffffffffffffffffffffffffffffffff
Length: 75
Type: OPEN Message (1)
<snip>
Optional Parameter: Capability
Parameter Type: Capability (2)
Parameter Length: 6
Capability: Multiprotocol extensions capability
Type: Multiprotocol extensions capability (1)
Length: 4
AFI: IPv4 (1)
Reserved: 00
SAFI: Unicast (1)続くUPDATE(No.34)では、IPv4の経路がMP_REACH_NLRI(AFI 1 / SAFI 1)に入っています。
Border Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 60
Type: UPDATE Message (2)
<snip>
Path Attribute - MP_REACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_REACH_NLRI (14)
Length: 13
Address family identifier (AFI): IPv4 (1)
Subsequent address family identifier (SAFI): Unicast (1)
Next hop: 10.1.2.1
IPv4 Address: 10.1.2.1
Number of Subnetwork points of attachment (SNPA): 0
Network Layer Reachability Information (NLRI)
192.168.1.0/24
MP Reach NLRI prefix length: 24
MP Reach NLRI IPv4 prefix: 192.168.1.0RP/0/RP0/CPU0:R1#ping 2001:db8:3::1 source 2001:db8:1::1 count 50 timeout 1
Sun Sep 13 09:37:41.984 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 2001:db8:3::1, timeout is 1 seconds:
..UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
Success rate is 0 percent (0/50)STEP 1:IPv4セッションにIPv6ユニキャストを追加
R1 - R2はIdle (No global IPv6 address configured)になり、IPv4ごと確立しません。Lo0で張ったR2 - R3は確立し、R3の経路のネクストホップはLo0の2001:db8::3です。
3台で既存のIPv4ネイバーにaddress-family ipv6 unicastを足しました(R2・R3も同様)。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Sun Sep 13 09:40:34.412 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65001
neighbor 10.1.2.2
address-family ipv6 unicast
route-policy FROM-R2-V6 in
route-policy TO-R2-V6 out
soft-reconfiguration inbound always
!
!
!
endR1はセッションを切り、ネクストホップに使うグローバルIPv6アドレスがGi0/0/0/0に無いためIdleのままです。
RP/0/RP0/CPU0:R1#show logging start Sep 13 09:37:50
Sun Sep 13 09:43:07.919 UTC
<snip>
RP/0/RP0/CPU0:Sep 13 09:40:35.505 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.1.2.2 Down - Address family activated (VRF: default) (AS: 65002) RP/0/RP0/CPU0:R1#show bgp neighbors
Sun Sep 13 09:42:57.079 UTC
<snip>
BGP neighbor is 10.1.2.2
Remote AS 65002, local AS 65001, external link
Description: eBGP to R2 (IPv4 session)
Remote router ID 0.0.0.0
BGP state = Idle (No global IPv6 address configured)
<snip>
Last reset 00:02:21, due to Address family activatedR2は接続を試み続けますが、R1はOPENを受けるとOPENもNOTIFICATIONも返さず、TCPのRSTで切ります。
57 549.179586 10.1.2.2 → 10.1.2.1 TCP 62 56142 → 179 [SYN] Seq=0 Win=32768 Len=0 MSS=1460 WS=1
60 549.186616 10.1.2.2 → 10.1.2.1 BGP 137 OPEN Message
61 549.220950 10.1.2.1 → 10.1.2.2 TCP 54 179 → 56142 [RST, ACK] Seq=1 Ack=1 Win=16384 Len=0
62 589.507687 10.1.2.2 → 10.1.2.1 TCP 62 21219 → 179 [SYN] Seq=0 Win=32768 Len=0 MSS=1240 WS=1
65 589.515877 10.1.2.2 → 10.1.2.1 BGP 137 OPEN Message
66 589.550086 10.1.2.1 → 10.1.2.2 TCP 54 179 → 21219 [RST, ACK] Seq=1 Ack=1 Win=16384 Len=0IPv4の経路もR1 - R2で運べなくなるので、IPv4のpingも届きません。
RP/0/RP0/CPU0:R1#ping 192.168.3.1 source 192.168.1.1 count 50 timeout 1
Sun Sep 13 09:43:21.734 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.3.1 timeout is 1 seconds:
..................................................
Success rate is 0 percent (0/50)R2 - R3(Lo0同士のIPv4セッション)では、R3が送ったIPv6経路(R2-R3間キャプチャーのNo.60)のNext HopがR3のLo0の2001:db8::3(16バイト)です。
リンクのアドレス2001:db8:23::3ではなく、update-sourceのインタフェースのアドレスが使われています。
Border Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 78
Type: UPDATE Message (2)
<snip>
Path Attribute - MP_REACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_REACH_NLRI (14)
Length: 30
Address family identifier (AFI): IPv6 (2)
Subsequent address family identifier (SAFI): Unicast (1)
Next hop: 2001:db8::3
IPv6 Address: 2001:db8::3
Number of Subnetwork points of attachment (SNPA): 0
Network Layer Reachability Information (NLRI)
2001:db8:3::/64
MP Reach NLRI prefix length: 64
MP Reach NLRI IPv6 prefix: 2001:db8:3::RP/0/RP0/CPU0:R2#show bgp ipv6 unicast
Sun Sep 13 09:44:48.309 UTC
BGP router identifier 10.0.0.2, local AS number 65002
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0800000 RD version: 6
BGP main routing table version 6
BGP NSR Initial initsync version 4 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs
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
*> 2001:db8:2::/64 :: 0 32768 i
*>i2001:db8:3::/64 2001:db8::3 0 100 0 i
Processed 2 prefixes, 2 pathsSTEP 2:R1のリンクにIPv6アドレスを付ける
R1 - R2がIPv4とIPv6の両方で確立し、R1のIPv6経路のNext Hopはグローバル + リンクローカルの32バイトです。 IPv4 / IPv6ともpingが通ります。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Sun Sep 13 09:47:35.607 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/0
ipv6 address 2001:db8:12::1/64
!
endRP/0/RP0/CPU0:R2#show bgp neighbors
Sun Sep 13 09:50:42.773 UTC
<snip>
BGP neighbor is 10.1.2.1
Remote AS 65001, local AS 65002, external link
Description: eBGP to R1 (IPv4 session)
Remote router ID 10.0.0.1
BGP state = Established, up for 00:03:01
<snip>
Neighbor capabilities:
Route refresh: advertised (old + new) and received (old + new)
4-byte AS: advertised and received
Address family IPv4 Unicast: advertised and received
Address family IPv6 Unicast: advertised and receivedR1がIPv4セッションで送ったIPv6経路(R1-R2間キャプチャーのNo.112)です。R1とR2は同じサブネットのeBGPなので、RFC 2545 3のとおりリンクローカルが付きます。
Border Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 93
Type: UPDATE Message (2)
<snip>
Path Attribute - MP_REACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_REACH_NLRI (14)
Length: 46
Address family identifier (AFI): IPv6 (2)
Subsequent address family identifier (SAFI): Unicast (1)
Next hop: IPv6=2001:db8:12::1 Link-local=fe80::5054:ff:febf:f3a6
IPv6 Address: 2001:db8:12::1
Link-local Address: fe80::5054:ff:febf:f3a6
Number of Subnetwork points of attachment (SNPA): 0
Network Layer Reachability Information (NLRI)
2001:db8:1::/64
MP Reach NLRI prefix length: 64
MP Reach NLRI IPv6 prefix: 2001:db8:1::RP/0/RP0/CPU0:R2#show bgp ipv6 unicast
Sun Sep 13 09:50:43.987 UTC
BGP router identifier 10.0.0.2, local AS number 65002
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0800000 RD version: 7
BGP main routing table version 7
BGP NSR Initial initsync version 4 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs
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
*> 2001:db8:1::/64 2001:db8:12::1 0 0 65001 i
*> 2001:db8:2::/64 :: 0 32768 i
*>i2001:db8:3::/64 2001:db8::3 0 100 0 i
Processed 3 prefixes, 3 pathsSTEP 3:IPv6セッションを別に張る(R2 - R3はリンクのアドレス)
eBGP(R1 - R2)のNext Hopは32バイト、リンクのアドレスで張ったiBGP(R2 - R3)は16バイトです。 同じサブネットでも、iBGPにはリンクローカルが付きません。
IPv4セッションからIPv6ユニキャストを外し、IPv6のネイバーを別に作りました(R1・R3も対応する設定を入れています)。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Sun Sep 13 09:52:45.302 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65002
neighbor 10.0.0.3
no address-family ipv6 unicast
!
neighbor 10.1.2.1
no address-family ipv6 unicast
!
neighbor 2001:db8:12::1
remote-as 65001
description eBGP to R1 (IPv6 session)
address-family ipv6 unicast
route-policy FROM-R1-V6S in
route-policy TO-R1-V6S out
soft-reconfiguration inbound always
!
!
neighbor 2001:db8:23::3
remote-as 65002
description iBGP to R3 (IPv6 session, link)
address-family ipv6 unicast
next-hop-self
route-policy FROM-R3-V6L in
route-policy TO-R3-V6L out
soft-reconfiguration inbound always
!
!
!
endBorder Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 93
Type: UPDATE Message (2)
<snip>
Path Attribute - MP_REACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_REACH_NLRI (14)
Length: 46
Address family identifier (AFI): IPv6 (2)
Subsequent address family identifier (SAFI): Unicast (1)
Next hop: IPv6=2001:db8:12::1 Link-local=fe80::5054:ff:febf:f3a6
IPv6 Address: 2001:db8:12::1
Link-local Address: fe80::5054:ff:febf:f3a6R3がリンクのアドレスのiBGPで送った経路(R2-R3間キャプチャーのNo.135)は、Next Hopが2001:db8:23::3だけです。
Border Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 78
Type: UPDATE Message (2)
<snip>
Path Attribute - MP_REACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_REACH_NLRI (14)
Length: 30
Address family identifier (AFI): IPv6 (2)
Subsequent address family identifier (SAFI): Unicast (1)
Next hop: 2001:db8:23::3
IPv6 Address: 2001:db8:23::3
Number of Subnetwork points of attachment (SNPA): 0
Network Layer Reachability Information (NLRI)
2001:db8:3::/64
MP Reach NLRI prefix length: 64
MP Reach NLRI IPv6 prefix: 2001:db8:3::RP/0/RP0/CPU0:R3#show bgp ipv6 unicast
Sun Sep 13 09:56:51.515 UTC
BGP router identifier 10.0.0.3, local AS number 65002
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0800000 RD version: 11
BGP main routing table version 11
BGP NSR Initial initsync version 4 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs
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
*>i2001:db8:1::/64 2001:db8:23::2 0 100 0 65001 i
*>i2001:db8:2::/64 2001:db8:23::2 0 100 0 i
*> 2001:db8:3::/64 :: 0 32768 i
Processed 3 prefixes, 3 pathsSTEP 4:R2 - R3のIPv6セッションをLo0で張り直す
Lo0で張ったiBGPもNext Hopは16バイトです。 STEP 3と合わせると、長さを決めているのはeBGPかiBGPかです。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Sun Sep 13 09:57:46.984 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65002
neighbor 2001:db8::3
remote-as 65002
description iBGP to R3 (IPv6 session, Loopback0)
update-source Loopback0
address-family ipv6 unicast
next-hop-self
route-policy FROM-R3-V6S in
route-policy TO-R3-V6S out
soft-reconfiguration inbound always
!
!
no neighbor 2001:db8:23::3
!
endBorder Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 78
Type: UPDATE Message (2)
<snip>
Path Attribute - MP_REACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_REACH_NLRI (14)
Length: 30
Address family identifier (AFI): IPv6 (2)
Subsequent address family identifier (SAFI): Unicast (1)
Next hop: 2001:db8::3
IPv6 Address: 2001:db8::3
Number of Subnetwork points of attachment (SNPA): 0
Network Layer Reachability Information (NLRI)
2001:db8:3::/64
MP Reach NLRI prefix length: 64
MP Reach NLRI IPv6 prefix: 2001:db8:3::RP/0/RP0/CPU0:R3#show bgp ipv6 unicast
Sun Sep 13 10:01:53.636 UTC
BGP router identifier 10.0.0.3, local AS number 65002
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0800000 RD version: 15
BGP main routing table version 15
BGP NSR Initial initsync version 4 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs
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
*>i2001:db8:1::/64 2001:db8::2 0 100 0 65001 i
*>i2001:db8:2::/64 2001:db8::2 0 100 0 i
*> 2001:db8:3::/64 :: 0 32768 i
Processed 3 prefixes, 3 pathsSTEP 5:R2だけIPv4セッションにIPv6ユニキャストを追加
R2はIPv4を含むセッション全体を切断し、約40秒後に張り直します。その間、R1とR2は相手から受けたIPv4の経路を消します。
切断のときNOTIFICATIONは送りません。張り直した後は共通のIPv4だけで確立し、IPv6はadvertisedのみで(NoNeg)です。IPv6の経路はIPv6セッションで流れ続けます。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Sun Sep 13 10:02:54.361 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65002
neighbor 10.1.2.1
address-family ipv6 unicast
route-policy FROM-R1-V6 in
route-policy TO-R1-V6 out
soft-reconfiguration inbound always
!
!
!
endRP/0/RP0/CPU0:R2#show logging start Sep 13 10:01:27
Sun Sep 13 10:06:06.994 UTC
<snip>
RP/0/RP0/CPU0:Sep 13 10:02:55.569 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.1.2.1 Down - Address family activated (VRF: default) (AS: 65001)
<snip>
RP/0/RP0/CPU0:Sep 13 10:03:37.714 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.1.2.1 Up (VRF: default) (AS: 65001) 切断から張り直しまでの間に、両者は相手から受けたIPv4の経路を消しています(purged)。
RP/0/RP0/CPU0:R2#show bgp trace neighbor | utility tail -n 300
Sun Sep 13 10:06:15.463 UTC
<snip>
Sep 13 10:02:55.569 default-bgp/spkr-tr2-nbr 0/RP0/CPU0 t4742 [NBR]:3969: nbr reset: vrf 0x60000000 10.1.2.1, loc 6, reason: Address family activated
<snip>
Sep 13 10:02:57.571 default-bgp/spkr-tr2-nbr 0/RP0/CPU0 t4809 [NBR]:3656: prefixes from nbr 10.1.2.1, purged 1, marked gr stale 0, afi: IPv4 Unicast
<snip>
Sep 13 10:03:35.699 default-bgp/spkr-tr2-nbr 0/RP0/CPU0 t4732 [NBR]:11331: send open nbr: 10.1.2.1, loc 1RP/0/RP0/CPU0:R1#show bgp trace neighbor | utility tail -n 300
Sun Sep 13 10:05:15.820 UTC
<snip>
Sep 13 10:02:55.575 default-bgp/spkr-tr2-nbr 0/RP0/CPU0 t4653 [NBR]:3969: nbr reset: vrf 0x60000000 10.1.2.2, loc 6, reason: Peer closing down the session
<snip>
Sep 13 10:02:57.577 default-bgp/spkr-tr2-nbr 0/RP0/CPU0 t4739 [NBR]:3656: prefixes from nbr 10.1.2.2, purged 2, marked gr stale 0, afi: IPv4 Unicast
<snip>
Sep 13 10:03:37.704 default-bgp/spkr-tr2-nbr 0/RP0/CPU0 t4732 [NBR]:2632: send open nbr: 10.1.2.2, loc 3張り直した後のOPENは、R2(No.234)がIPv4とIPv6の2つ、R1(No.237)がIPv4の1つです。
Border Gateway Protocol - OPEN Message
Marker: ffffffffffffffffffffffffffffffff
Length: 83
Type: OPEN Message (1)
<snip>
Optional Parameter: Capability
Parameter Type: Capability (2)
Parameter Length: 6
Capability: Multiprotocol extensions capability
Type: Multiprotocol extensions capability (1)
Length: 4
AFI: IPv4 (1)
Reserved: 00
SAFI: Unicast (1)
<snip>
Optional Parameter: Capability
Parameter Type: Capability (2)
Parameter Length: 6
Capability: Multiprotocol extensions capability
Type: Multiprotocol extensions capability (1)
Length: 4
AFI: IPv6 (2)
Reserved: 00
SAFI: Unicast (1)Border Gateway Protocol - OPEN Message
Marker: ffffffffffffffffffffffffffffffff
Length: 75
Type: OPEN Message (1)
<snip>
Optional Parameter: Capability
Parameter Type: Capability (2)
Parameter Length: 6
Capability: Multiprotocol extensions capability
Type: Multiprotocol extensions capability (1)
Length: 4
AFI: IPv4 (1)
Reserved: 00
SAFI: Unicast (1)RP/0/RP0/CPU0:R2#show bgp neighbors
Sun Sep 13 10:05:54.117 UTC
<snip>
BGP neighbor is 10.1.2.1
Remote AS 65001, local AS 65002, external link
Description: eBGP to R1 (IPv4 session)
Remote router ID 10.0.0.1
BGP state = Established, up for 00:02:16
<snip>
Neighbor capabilities:
Route refresh: advertised (old + new) and received (old + new)
4-byte AS: advertised and received
Address family IPv4 Unicast: advertised and received
Address family IPv6 Unicast: advertisedRP/0/RP0/CPU0:R2#show bgp ipv6 unicast summary
Sun Sep 13 10:05:55.218 UTC
<snip>
Neighbor Spk AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down St/PfxRcd
10.1.2.1 0 65001 49 62 0 0 0 00:02:17 (NoNeg)
2001:db8::3 0 65002 11 12 13 0 0 00:07:41 1
2001:db8:12::1 0 65001 16 19 13 0 0 00:12:26 1STEP 6:R2だけIPv4セッションからIPv4ユニキャストを外す
R2はIPv6だけ、R1はIPv4だけを広告する形になり、OPENを受けた側がUnsupported Capabilityを返します。Dataフィールドは空で、両者は張り直しを続けます。 IPv4のpingは届かず、IPv6はIPv6セッションで届きます。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Sun Sep 13 10:07:42.655 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65002
neighbor 10.1.2.1
no address-family ipv4 unicast
!
!
endR2はまずCease(Other Configuration Change)でセッションを切ります。
RP/0/RP0/CPU0:R2#show logging start Sep 13 10:06:21
Sun Sep 13 10:11:41.367 UTC
<snip>
RP/0/RP0/CPU0:Sep 13 10:07:43.890 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.1.2.1 Down - Address family removed (CEASE notification sent - configuration change) (VRF: default) (AS: 65001) Border Gateway Protocol - NOTIFICATION Message
Marker: ffffffffffffffffffffffffffffffff
Length: 21
Type: NOTIFICATION Message (3)
Major error Code: Cease (6)
Minor error Code (Cease): Other Configuration Change (6)その後はR1から張ってもR2から張っても、OPENを受けた側がNOTIFICATIONを返して切れます。
275 2128.224240 10.1.2.2 → 10.1.2.1 BGP 75 NOTIFICATION Message
283 2164.646868 10.1.2.1 → 10.1.2.2 TCP 62 52370 → 179 [SYN] Seq=0 Win=32768 Len=0 MSS=1240 WS=1
286 2164.654024 10.1.2.1 → 10.1.2.2 BGP 129 OPEN Message
289 2166.659440 10.1.2.2 → 10.1.2.1 BGP 75 NOTIFICATION Message
297 2207.340018 10.1.2.1 → 10.1.2.2 TCP 62 25772 → 179 [SYN] Seq=0 Win=32768 Len=0 MSS=1240 WS=1
300 2207.350087 10.1.2.1 → 10.1.2.2 BGP 129 OPEN Message
303 2209.355341 10.1.2.2 → 10.1.2.1 BGP 75 NOTIFICATION Message
312 2239.147132 10.1.2.2 → 10.1.2.1 TCP 62 26263 → 179 [SYN] Seq=0 Win=32768 Len=0 MSS=1240 WS=1
315 2239.154154 10.1.2.2 → 10.1.2.1 BGP 129 OPEN Message
319 2241.160555 10.1.2.1 → 10.1.2.2 BGP 75 NOTIFICATION Message長さは21バイトで、エラーコードの後ろに何もありません。RFC 5492 5がMUSTとするDataフィールドのCapabilityは入っていません。
Border Gateway Protocol - NOTIFICATION Message
Marker: ffffffffffffffffffffffffffffffff
Length: 21
Type: NOTIFICATION Message (3)
Major error Code: OPEN Message Error (2)
Minor error Code (Open Message): Unsupported Capability (7)RP/0/RP0/CPU0:R2#show bgp neighbors
Sun Sep 13 10:11:30.753 UTC
<snip>
BGP neighbor is 10.1.2.1
Remote AS 65001, local AS 65002, external link
Description: eBGP to R1 (IPv4 session)
Remote router ID 0.0.0.0
BGP state = Connect
<snip>
Last reset 00:00:43, due to BGP Notification sent: unsupported/disjoint capability
Time since last notification sent to neighbor: 00:00:43
Error Code: unsupported/disjoint capability
Notification data sent:
None
Time since last notification received from neighbor: 00:01:54
Error Code: unsupported/disjoint capability
Notification data received:
NoneRP/0/RP0/CPU0:R1#ping 192.168.3.1 source 192.168.1.1 count 50 timeout 1
Sun Sep 13 10:10:08.859 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.3.1 timeout is 1 seconds:
..................................................
Success rate is 0 percent (0/50)RP/0/RP0/CPU0:R1#ping 2001:db8:3::1 source 2001:db8:1::1 count 50 timeout 1
Sun Sep 13 10:10:59.928 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 2001:db8:3::1, timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 6/9/51 msSTEP 7:R2のIPv4セッションを元に戻す
共通のIPv4ユニキャストが戻ると、次の張り直しで確立します。 セッションの構成はSTEP 4と同じになります。
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Sun Sep 13 10:14:32.181 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65002
neighbor 10.1.2.1
address-family ipv4 unicast
route-policy FROM-R1-V4 in
route-policy TO-R1-V4 out
soft-reconfiguration inbound always
!
no address-family ipv6 unicast
!
!
endRP/0/RP0/CPU0:R2#show logging start Sep 13 10:11:52
Sun Sep 13 10:17:40.016 UTC
<snip>
RP/0/RP0/CPU0:Sep 13 10:14:40.435 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 10.1.2.1 Up (VRF: default) (AS: 65001) STEP 8:R1のnetwork文を外す
IPv6の取り消しはMP_UNREACH_NLRIだけのUPDATE、IPv4の取り消しはUPDATE本体のWithdrawn Routesフィールドです。 R3から両方の経路が消え、pingは届きません。
RP/0/RP0/CPU0:R1#show configuration commit changes last 1
Sun Sep 13 10:50:26.942 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65001
address-family ipv4 unicast
no network 192.168.1.0/24
!
address-family ipv6 unicast
no network 2001:db8:1::/64
!
!
endBorder Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 39
Type: UPDATE Message (2)
Withdrawn Routes Length: 0
Total Path Attribute Length: 16
Path attributes
Path Attribute - MP_UNREACH_NLRI
Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
Type Code: MP_UNREACH_NLRI (15)
Length: 12
Address family identifier (AFI): IPv6 (2)
Subsequent address family identifier (SAFI): Unicast (1)
Withdrawn Routes
2001:db8:1::/64
MP Unreach NLRI prefix length: 64
MP Unreach NLRI IPv6 prefix: 2001:db8:1::Border Gateway Protocol - UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 27
Type: UPDATE Message (2)
Withdrawn Routes Length: 4
Withdrawn Routes
192.168.1.0/24
Withdrawn route prefix length: 24
Withdrawn prefix: 192.168.1.0
Total Path Attribute Length: 0RP/0/RP0/CPU0:R3#show bgp ipv6 unicast
Sun Sep 13 10:56:03.683 UTC
BGP router identifier 10.0.0.3, local AS number 65002
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0800000 RD version: 18
BGP main routing table version 18
BGP NSR Initial initsync version 4 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs
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
*>i2001:db8:2::/64 2001:db8::2 0 100 0 i
*> 2001:db8:3::/64 :: 0 32768 i
Processed 2 prefixes, 2 pathsSTEP 9:R1のnetwork文を戻す(最終状態)
3台のrunning-configがSTEP 4と一致し、IPv4 / IPv6ともpingが戻ります。
RP/0/RP0/CPU0:R1#ping 2001:db8:3::1 source 2001:db8:1::1 count 50 timeout 1
Sun Sep 13 11:41:53.372 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 2001:db8:3::1, timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 8/10/34 ms検証Configおよびshow結果
各STEPで3台すべてから、次のファイルをルータごとに分けて取得しています。検証Configは..._run.txtです(最終状態はSTEP 9のもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / show route ipv6 / show bgp summary / show bgp ipv6 unicast summary / show bgp / show bgp ipv6 unicast / show bgp <プレフィックス>(6本) / show bgp neighbors / show bgp ipv6 unicast neighbors / show bgp update-group / show bgp ipv6 unicast update-group / show bgp ipv6 unicast nexthops / show ospf neighbor / show ospfv3 neighbor / ピアごとのadvertised-routes / routes / received routes(IPv4・IPv6) |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._ping.txt | R1とR3のLo1同士のping(50発、timeout 1秒)とtraceroute(R1・R3のみ) |
..._trace.txt | show bgp trace neighbor / show bgp trace error |
..._commit.cfg | そのSTEPで実際にcommitした設定だけ。 設定を変えたルータの分のみ |
STEP 0:初期状態(IPv4のみ)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | - |
| R2 | show | log | run | - | trace | - |
| R3 | show | log | run | ping | trace | - |
STEP 1:IPv4セッションにIPv6ユニキャストを追加
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | cfg |
| R2 | show | log | run | - | trace | cfg |
| R3 | show | log | run | ping | trace | cfg |
STEP 2:R1のリンクにIPv6アドレスを付ける
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | cfg |
| R2 | show | log | run | - | trace | - |
| R3 | show | log | run | ping | trace | - |
STEP 3:IPv6セッションを別に張る(R2 - R3はリンクのアドレス)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | cfg |
| R2 | show | log | run | - | trace | cfg |
| R3 | show | log | run | ping | trace | cfg |
STEP 4:R2 - R3のIPv6セッションをLo0で張り直す
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | - |
| R2 | show | log | run | - | trace | cfg |
| R3 | show | log | run | ping | trace | cfg |
STEP 5:R2だけIPv4セッションにIPv6ユニキャストを追加
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | - |
| R2 | show | log | run | - | trace | cfg |
| R3 | show | log | run | ping | trace | - |
STEP 6:R2だけIPv4セッションからIPv4ユニキャストを外す
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | - |
| R2 | show | log | run | - | trace | cfg |
| R3 | show | log | run | ping | trace | - |
STEP 7:R2のIPv4セッションを元に戻す
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | - |
| R2 | show | log | run | - | trace | cfg |
| R3 | show | log | run | ping | trace | - |
STEP 8:R1のnetwork文を外す
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | cfg |
| R2 | show | log | run | - | trace | - |
| R3 | show | log | run | ping | trace | - |
STEP 9:R1のnetwork文を戻す(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| R1 | show | log | run | ping | trace | cfg |
| R2 | show | log | run | - | trace | - |
| R3 | show | log | run | ping | trace | - |
パケットキャプチャーはR1-R2間とR2-R3間で取得しています。STEP 8の後にラボを一度停止したため、STEP 0〜8とSTEP 9で別ファイルです。
| 範囲 | R1-R2間 | R2-R3間 |
|---|---|---|
| STEP 0〜8 | pcap | pcap |
| STEP 9 | pcap | pcap |
参考
| 資料 | タイトル | 概要 |
|---|---|---|
| RFC 4760 | Multiprotocol Extensions for BGP-4 | MP_REACH_NLRI(3)とMP_UNREACH_NLRI(4)、SAFI(6・9)、Capability(8) |
| RFC 5492 | Capabilities Advertisement with BGP-4 | OPENのOptional ParameterでCapabilityを交換する仕組み(3)と、Unsupported Capability(5) |
| RFC 2545 | Use of BGP-4 Multiprotocol Extensions for IPv6 Inter-Domain Routing | IPv6のネクストホップ(グローバル + リンクローカル、長さ16 / 32)とトランスポートの独立性 |
| RFC 8950 | Advertising IPv4 Network Layer Reachability Information (NLRI) with an IPv6 Next Hop | IPv4経路にIPv6ネクストホップを付けるExtended Next Hop Encoding Capability |
| IANA Address Family Numbers | Address Family Numbers | AFIの値の一覧 |
関連記事
- BGP(Border Gateway Protocol)
- BGPメッセージ
- BGPネイバーの状態遷移
- iBGPとeBGPの違い
- BGP next-hop-self
- BGPルートリフレクタ
- BGPパス属性とベストパス選択
- BGP ORIGIN属性
- BGP AS_PATH属性
- BGP NEXT_HOP属性
- BGP LOCAL_PREF属性
- BGP MED属性
- BGP WEIGHT属性
- BGP COMMUNITY属性
- BGP経路集約(aggregate-address)
- MP-BGP(マルチプロトコル拡張)
- BGP Extended Community(拡張コミュニティ)
- BGPマルチパス(maximum-paths)
- BGPの4バイトAS番号(RFC 6793)
- BGPのプライベートAS番号の除去(remove-private-AS)
- BGPのADD-PATH(RFC 7911)
- BGP PIC(Prefix Independent Convergence)
- BGP Best External(ベストでない外部経路の広告)