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

MPLS VPNのMP-BGP(VPNv4経路の伝搬)

目次

MPLS VPNのMP-BGPとは

MPLS VPNでは、顧客の経路をPE同士がMP-BGP(Multiprotocol BGP)で交換します。MP-BGPは、1本のBGPセッションでIPv4以外の経路も運べるようにする拡張で、RFC 4760が定めています。

経路の種類はAFI(Address Family Identifier)とSAFI(Subsequent Address Family Identifier)の組で区別します。MPLS VPNの経路(VPNv4)はAFI 1 / SAFI 128です(RFC 4364の4.3.4)。

アドレスファミリーAFISAFINLRIの中身
IPv4 unicast11IPv4プレフィックス
VPNv4 unicast1128ラベル + RD + IPv4プレフィックス

1本のセッションに複数のアドレスファミリーを同居させられます。どの種類を流すかは、セッションを張るときに決まります。

Capabilitiesの交換で「流す種類」が決まる

BGPはセッションの開始時にOPENメッセージを交換し、その中のCapabilitiesで対応しているアドレスファミリーを伝え合います。MP-BGPのCapabilitiesはコード1、長さ4で、値はAFI(2バイト)・予約(1バイト)・SAFI(1バイト)です(RFC 4760の8)。

RFC 4760の8は、交換の条件を次のように定めています。

To have a bi-directional exchange of routing information for a particular <AFI, SAFI> between a pair of BGP speakers, each such speaker MUST advertise to the other (via the Capability Advertisement mechanism) the capability to support that particular <AFI, SAFI> route.

両側がCapabilitiesで示したアドレスファミリーだけが流れます。片方が示さなければ、そのアドレスファミリーは交換されません。

CapabilitiesはOPENでしか交換しないため、IOS XRはneighborのアドレスファミリーを足したり外したりすると、セッションを張り直します。このとき送るNOTIFICATIONは、Cease(6)のサブコード6「Other Configuration Change」です(RFC 4486の4)。同じセッションで運んでいる他のアドレスファミリーも、張り直しの間は一度落ちます

OPENには他のCapabilitiesも並びます。Extended Next Hop Encoding(コード5)の中にもSAFI 128が現れますが、これはネクストホップの書き方についてのCapabilitiesです。どのアドレスファミリーを運ぶかを決めるのはコード1です。

VPNv4のUPDATEの中身

VPNv4の経路は、UPDATEの中の属性で運ばれます。使うのは、MP_REACH_NLRI属性(Type 14)です。元のBGPのNLRI欄とNEXT_HOP属性はIPv4 unicastのためのもので、VPNv4はこの属性でしか運べません。なお、IOS XRはIPv4 unicastの経路もMP_REACH_NLRIで送ります。

ネクストホップは、PE自身のアドレスにRD 0を付けた12バイトです。RFC 4364の4.3.2は次のように述べています。

When a PE router distributes a VPN-IPv4 route via BGP, it uses its own address as the “BGP next hop”. This address is encoded as a VPN-IPv4 address with an RD of 0.

RFC 4760がネクストホップをNLRIと同じアドレスファミリーで書くことを求めているため、IPv4アドレスのままではなくVPN-IPv4の形になります。

NLRIには、ラベル・RD・プレフィックスの順に並びます。先頭の長さの欄はビット単位です(RFC 8277の2.2)。ラベルの欄は3バイト(ラベル20ビット・予約3ビット・Sビット1ビット)なので、/24の経路なら長さは24 + 64 + 24 = 112になります。ラベルの割り当て方はMPLS VPNのVPNラベルの割り当てで、RDのバイト列はMPLS VPNのRDで解説しています。

取り消しとEnd-of-RIB

経路の取り消しには、MP_UNREACH_NLRI属性(Type 15)を使います。中身はAFI・SAFIと取り消す経路の並びで、ネクストホップはありません。取り消す経路の書き方は広告のときと同じですが、ラベルの欄はCompatibilityと呼ばれ、送信側は0x800000を入れます(RFC 8277の2.4)。

セッションを張った直後の経路をすべて送り終えたことは、End-of-RIBで知らせます。IPv4 unicast以外のアドレスファミリーでは、取り消す経路が空のMP_UNREACH_NLRIだけを持つUPDATEがEnd-of-RIBです(RFC 4724の2)。IPv4 unicastでは、取り消しも属性も持たない最小のUPDATE(23バイト)です。IOS XRは、Graceful Restartを設定していなくてもEnd-of-RIBを送ります。

IOS XRでのMP-BGPの設定

IOS XRでは、router bgpの直下とneighborの下の両方に、使うアドレスファミリーを書きます。neighborの下に書いたものが、そのピアとのOPENでCapabilitiesとして示されます

PE1 のMP-BGPの設定(IOS XR)
router bgp 65001
 bgp router-id 1.1.1.1
 address-family ipv4 unicast
  network 198.51.100.1/32
 !
 address-family vpnv4 unicast
 !
 neighbor 2.2.2.2
  remote-as 65001
  update-source Loopback0
  address-family ipv4 unicast
  !
  address-family vpnv4 unicast
  !
 !
 vrf CUST-A
  rd 65001:1
  address-family ipv4 unicast
   redistribute static
  !
 !
!

VRFの経路はvrf CUST-Aの下でredistribute staticによりBGPへ入り、RDとRTが付いてVPNv4の経路としてneighbor 2.2.2.2へ送られます。RTの設定はMPLS VPNのRTで解説しています。

検証構成

XRd 5台で、顧客Aの2拠点をPE1とPE2で収容します。PE間のiBGPにはipv4 unicastとvpnv4 unicastの両方を設定しています。片方だけを外したときの違いを見るためです。

ノード役割
PE1 / PE2vrf CUST-A(RD 65001:1、RT 65001:100)。Lo1(198.51.100.1 / .2)をBGPのipv4 unicastでだけ広告する(OSPFには入れない)
P1コアのみ(OSPF area 0 + LDP)。BGPを動かさない
CE-A1 / CE-A2顧客Aのサイト1 / 2。LAN 10.1.1.0/24 / 10.1.2.0/24
STEP操作確かめること
0初期状態VPNv4とIPv4の両方が交換されている。P1はBGPを動かしていない
1PE2の対PE1からaddress-family vpnv4 unicastを削除セッションが張り直され、VPNv4だけが交換されなくなる。IPv4は残る
2元に戻すOPENのCapabilitiesにSAFI 128が載り、UPDATEとEnd-of-RIBが流れる
3PE1のVRFから10.1.1.0/24の静的経路を削除MP_UNREACH_NLRIで取り消しが届く
4元に戻す再び広告される

1本のセッションで2種類を運ぶ(STEP 0)

PE1から見たPE2とのCapabilitiesの交換の結果です。IPv4 unicastとVPNv4 unicastの両方がadvertised and receivedで、どちらも交換されます。

STEP 0 PE1 の show bgp neighbors 2.2.2.2(抜粋)
  Multi-protocol capability received
  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 VPNv4 Unicast: advertised and received

P1はBGPを動かしていません。VPNv4の経路はPE1とPE2の間だけで交換されます。

STEP 0 P1 の show bgp vpnv4 unicast
RP/0/RP0/CPU0:P1#show bgp vpnv4 unicast
Tue Sep 22 07:23:26.227 UTC
% BGP instance 'default' not active

片側がCapabilitiesで示さないとVPNv4だけが止まる(STEP 1)

STEP 1でPE2の対PE1からaddress-family vpnv4 unicastを外すと、PE2はセッションを張り直しました。

STEP 1 PE2 の syslog
RP/0/RP0/CPU0:Sep 22 07:24:26.709 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 1.1.1.1 Down - Address family removed (CEASE notification sent - configuration change) (VRF: default) (AS: 65001) 
RP/0/RP0/CPU0:Sep 22 07:24:26.710 UTC: bgp[1084]: %ROUTING-BGP-5-NSR_STATE_CHANGE : Changed state to NSR-Ready 
RP/0/RP0/CPU0:Sep 22 07:24:28.006 UTC: ssh_syslog_proxy[1188]: %SECURITY-SSHD_SYSLOG_PRX-6-INFO_GENERAL : sshd[5917]: Received disconnect from 10.20.1.1 port 33910:11: disconnected by user 
RP/0/RP0/CPU0:Sep 22 07:24:28.006 UTC: ssh_syslog_proxy[1188]: %SECURITY-SSHD_SYSLOG_PRX-6-INFO_GENERAL : sshd[5917]: Disconnected from user cisco 10.20.1.1 port 33910 
RP/0/RP0/CPU0:Sep 22 07:24:54.951 UTC: bgp[1084]: %ROUTING-BGP-5-ADJCHANGE : neighbor 1.1.1.1 Up (VRF: default) (AS: 65001) 

張り直しの前にPE2が送ったNOTIFICATIONが、添付のSTEP 1のキャプチャーのNo.9です。

STEP 1 No.9 NOTIFICATION(PE2 → PE1)tshark -V
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)
上のtshark出力のパケット(No.9 NOTIFICATION)のpcapをダウンロード

張り直したあとのCapabilitiesの交換では、VPNv4 unicastがadvertisedだけになりました。PE1は示しましたが、PE2から返ってきていません。

STEP 1 PE1 の show bgp neighbors 2.2.2.2(抜粋)
  Multi-protocol capability received
  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 VPNv4 Unicast: advertised

その結果、PE1のVPNv4のテーブルからPE2の経路(10.1.2.0/24)が消え、自分の経路だけが残りました。IPv4 unicastのほうは、PE2の198.51.100.2/32を受け取っています。

STEP 1 PE1 の show bgp vpnv4 unicast(抜粋)
   Network            Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 9
*> 10.1.1.0/24        172.16.1.2               0         32768 ?

Processed 1 prefixes, 1 paths
STEP 1 PE1 の show bgp ipv4 unicast(抜粋)
   Network            Next Hop            Metric LocPrf Weight Path
*> 198.51.100.1/32    0.0.0.0                  0         32768 i
*>i198.51.100.2/32    2.2.2.2                  0    100      0 i

Processed 2 prefixes, 2 paths

疎通も分かれます。VRFの宛先には届かず(Uは宛先に到達できないことを示すICMPの応答)、IPv4 unicastで学んだ宛先には届きます。

STEP 1 PE1 の ping
RP/0/RP0/CPU0:PE1#ping vrf CUST-A 10.1.2.1 count 50 timeout 1
Tue Sep 22 07:26:01.416 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 10.1.2.1 timeout is 1 seconds:
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
Success rate is 0 percent (0/50)
RP/0/RP0/CPU0:PE1#ping 198.51.100.2 source 198.51.100.1 count 20 timeout 1
Tue Sep 22 07:26:52.573 UTC
Type escape sequence to abort.
Sending 20, 100-byte ICMP Echos to 198.51.100.2 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (20/20), round-trip min/avg/max = 7/11/49 ms

OPENのCapabilitiesにSAFI 128が載り、UPDATEとEnd-of-RIBが流れる(STEP 2)

STEP 2でアドレスファミリーを戻すと、PE2はもう一度セッションを張り直し、OPENのCapabilitiesにSAFI 128を載せました。添付のSTEP 2のキャプチャーのNo.33です。

STEP 2 No.33 OPEN(PE2 → PE1)tshark -V(抜粋)
Border Gateway Protocol - OPEN Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 83
    Type: OPEN Message (1)
    Version: 4
    My AS: 65001
    Hold Time: 180
    BGP Identifier: 2.2.2.2
    Optional Parameters Length: 54
    Optional Parameters
        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)
        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: Labeled VPN Unicast (128)
上のtshark出力のパケット(No.33 OPEN)のpcapをダウンロード

続いてPE2は、VPNv4の経路とEnd-of-RIBを1つのTCPセグメントで送りました(No.38)。1つ目のUPDATEのMP_REACH_NLRIでは、ネクストホップがRD 0:0付きのPE2のアドレス、NLRIの長さが112になっています。

STEP 2 No.38 1つ目のUPDATEの MP_REACH_NLRI(tshark -V の抜粋)
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
                1... .... = Optional: Set
                .0.. .... = Transitive: Not set
                ..0. .... = Partial: Not set
                ...1 .... = Extended-Length: Set
                .... 0000 = Unused: 0x0
            Type Code: MP_REACH_NLRI (14)
            Length: 32
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Labeled VPN Unicast (128)
            Next hop:  RD=0:0 IPv4=2.2.2.2
                Route Distinguisher: 0:0
                IPv4 Address: 2.2.2.2
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                BGP Prefix
                    Prefix Length: 112
                    Label Stack: 24003 (bottom)
                    Route Distinguisher: 65001:1
                    MP Reach NLRI IPv4 prefix: 10.1.2.0

2つ目のUPDATEがVPNv4のEnd-of-RIBです。MP_UNREACH_NLRIの長さが3(AFIとSAFIだけ)で、取り消す経路はありません。

STEP 2 No.38 2つ目のUPDATE(End-of-RIB)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 29
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 6
    Path attributes
        Path Attribute - MP_UNREACH_NLRI
            Flags: 0x80, Optional, Non-transitive, Complete
                1... .... = Optional: Set
                .0.. .... = Transitive: Not set
                ..0. .... = Partial: Not set
                ...0 .... = Extended-Length: Not set
                .... 0000 = Unused: 0x0
            Type Code: MP_UNREACH_NLRI (15)
            Length: 3
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Labeled VPN Unicast (128)
            Withdrawn Routes
上のtshark出力のパケット(No.38 UPDATE)のpcapをダウンロード

MP_UNREACH_NLRIで取り消す(STEP 3〜4)

STEP 3でPE1のVRFから10.1.1.0/24の静的経路を消すと、PE1は取り消しを送りました。添付のSTEP 3のキャプチャーのNo.6です。

STEP 3 No.6 UPDATE(PE1 → PE2)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 45
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 22
    Path attributes
        Path Attribute - MP_UNREACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
                1... .... = Optional: Set
                .0.. .... = Transitive: Not set
                ..0. .... = Partial: Not set
                ...1 .... = Extended-Length: Set
                .... 0000 = Unused: 0x0
            Type Code: MP_UNREACH_NLRI (15)
            Length: 18
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Labeled VPN Unicast (128)
            Withdrawn Routes
                BGP Prefix
                    Prefix Length: 112
                    Label Stack: 0 (withdrawn)
                    Route Distinguisher: 65001:1
                    MP Unreach NLRI IPv4 prefix: 10.1.1.0

tsharkはラベルの欄をLabel Stack: 0 (withdrawn)と表示しますが、実際のバイトは80 00 00(Compatibility 0x800000)です。0x0050の行の80(SAFI 128)と70(長さ112)の直後の3バイトにあたります。

STEP 3 No.6 の生のバイト列(tshark -x)
0000  52 54 00 48 6a f7 52 54 00 d4 50 0d 88 47 05 dc   RT.Hj.RT..P..G..
0010  1d ff 45 c0 00 68 c1 79 00 00 ff 06 f3 50 01 01   ..E..h.y.....P..
0020  01 01 02 02 02 02 eb 82 00 b3 eb 78 93 ab a3 89   ...........x....
0030  07 99 50 18 7e 6e 4c ee 00 00 ff ff ff ff ff ff   ..P.~nL.........
0040  ff ff ff ff ff ff ff ff ff ff 00 2d 02 00 00 00   ...........-....
0050  16 90 0f 00 12 00 01 80 70 80 00 00 00 00 fd e9   ........p.......
0060  00 00 00 01 0a 01 01 ff ff ff ff ff ff ff ff ff   ................
0070  ff ff ff ff ff ff ff 00 13 04                     ..........
上のtshark出力のパケット(No.6 UPDATE)のpcapをダウンロード

取り消しを受けたPE2のVPNv4のテーブルからは10.1.1.0/24が消え、STEP 4で戻すと再び入りました。

STEP 3 PE2 の show bgp vpnv4 unicast(抜粋)
   Network            Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 12
*> 10.1.2.0/24        172.16.2.2               0         32768 ?

Processed 1 prefixes, 1 paths
STEP 4 PE2 の show bgp vpnv4 unicast(抜粋)
   Network            Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 14
*>i10.1.1.0/24        1.1.1.1                  0    100      0 ?
*> 10.1.2.0/24        172.16.2.2               0         32768 ?

Processed 2 prefixes, 2 paths

参考

規格タイトルこの記事で参照した箇所
RFC 4760Multiprotocol Extensions for BGP-43(MP_REACH_NLRI)、4(MP_UNREACH_NLRI)、8(Capabilitiesと交換の条件)
RFC 4364BGP/MPLS IP Virtual Private Networks (VPNs)4.3.2(ネクストホップはRD 0のVPN-IPv4)、4.3.4(AFI 1 / SAFI 128)
RFC 8277Using BGP to Bind MPLS Labels to Address Prefixes2.2(ラベル付きNLRIの長さ)、2.4(取り消しのCompatibility)
RFC 4724Graceful Restart Mechanism for BGP2(End-of-RIB)
RFC 4486Subcodes for BGP Cease Notification Message4(Other Configuration Change)

検証環境: Cisco IOS XRd 26.1.1(Cisco Modeling Labs)

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow version / show bgp neighbors / show bgp ipv4 unicast / show bgp vpnv4 unicast / show bgp vpnv4 unicast rd <RD> <プレフィックス> / 3点セット(advertised-routes / routes / received routes、ipv4とvpnv4の両方)/ show bgp vrf CUST-A / show mpls forwarding など
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._ping.txtそのSTEPのpingtraceroute
..._trace.txtPEのshow bgp traceをピアのアドレスで絞り、末尾150行を切り出したもの
..._commit.cfgそのSTEPで実際にcommitされた設定だけ。設定を変えたルータの分のみ

最終状態(STEP 4)はSTEP 0と同じ設定に戻しています。

STEP 0:初期状態

ルータshow出力syslogrunning-configpingtrace投入した設定
PE1showlogrunpingtrace-
PE2showlogrunpingtrace-
P1showlogrunping--
CE-A1showlogrunping--
CE-A2showlogrunping--

STEP 1:PE2の対PE1からaddress-family vpnv4 unicastを削除

ルータshow出力syslogrunning-configpingtrace投入した設定
PE1showlogrunpingtrace-
PE2showlogrunpingtracecommit
P1showlogrunping--
CE-A1showlogrunping--
CE-A2showlogrunping--

STEP 2:元に戻す

ルータshow出力syslogrunning-configpingtrace投入した設定
PE1showlogrunpingtrace-
PE2showlogrunpingtracecommit
P1showlogrunping--
CE-A1showlogrunping--
CE-A2showlogrunping--

STEP 3:PE1のVRFから10.1.1.0/24の静的経路を削除

ルータshow出力syslogrunning-configpingtrace投入した設定
PE1showlogrunpingtracecommit
PE2showlogrunpingtrace-
P1showlogrunping--
CE-A1showlogrunping--
CE-A2showlogrunping--

STEP 4:元に戻す(最終状態)

ルータshow出力syslogrunning-configpingtrace投入した設定
PE1showlogrunpingtracecommit
PE2showlogrunpingtrace-
P1showlogrunping--
CE-A1showlogrunping--
CE-A2showlogrunping--
パケットキャプチャーはSTEPごとに取得しています。
STEPPE1-P1間
0pcap
1pcap
2pcap
3pcap
4pcap

関連記事