MPLS VPNのVPNラベルとは
VPNラベルは、出口のPEが「どのVRFの、どこへ出すか」を決めるためのラベルです。出口のPEが自分で値を決め、MP-BGPのNLRIに入れて入口のPEへ伝えます(MPLS VPNのMP-BGP)。入口のPEは、このラベルをトランスポートラベルの下に積んで送ります。
コアのPルータが見るのはトランスポートラベルだけで、VPNラベルを見るのは出口のPEだけです。そのため、VPNラベルの値をどう決めるかは、出口のPEの都合だけで選べます。
割り当ての単位は実装が決める
RFC 4364の4.3.2は、経路ごとに別のラベルを付けるかどうかを実装に任せています。
Whether or not each route has a distinct label is an implementation matter.
そのうえで、考えられるやり方として次の3つを挙げています。IOS XRでは、それぞれper-vrf、per-ce、per-prefixという名前のモードで選べます。
| RFC 4364の挙げるやり方 | IOS XRのモード | ラベルの数 | 出口のPEでの処理 |
|---|---|---|---|
| 経路ごとに1つ | per-prefix(既定) | 経路の数だけ | ラベルだけで出口が決まる |
| 接続回線ごとに1つ | per-ce(ネクストホップのCEごと) | CEの数だけ | ラベルだけで出口が決まる |
| VRFごとに1つ | per-vrf | VRFごとに1つ | VRFでIPを引き直す |
VRFごとに1つにすると、ラベルだけではどのCEへ出すかが決まりません。RFC 4364の4.3.2は、この場合に出口のPEがすることを次のように述べています。
when the egress PE receives a packet with that label, it must look up the packet’s IP destination address in that VRF
IOS XRのshow mpls forwardingでは、このようにラベルを外してVRFでIPを引き直すラベルは、Aggregate と表示され、Prefix or ID欄は<VRF名>: Per-VRF Aggrになります。
IOS XRのper-ceは、Resilient per-CEという形で実装されています。CEへ出す転送先に加えて、VRFでIPを引き直す予備の転送先を持ち、show mpls forwardingではその予備の行に(!)(FRRのバックアップ)が付きます。
redistribute connected の経路はモードにかかわらず集約ラベル
redistribute connectedで広告するPE-CE間の経路は、宛先がCEではなく、そのLANにいる個々の機器です。ラベルだけでは出口のレイヤ2ヘッダーが決まらないので、出口のPEはIPを引き直す(ARPを引く)必要があります。RFC 4364の4.3.2も、集約したラベルが役に立つ場面として次を挙げています。
or if the VRF has an associated Local Area Network (LAN) interface (where there is a different outgoing layer 2 header for each system on the LAN, but a route is not distributed for each such system)
IOS XRはredistribute connectedの経路に、label modeの設定にかかわらず、VRFごとの集約ラベル(Per-VRF Aggr)を付けます。per-vrfにしたときにredistribute staticの経路が乗るのも、この同じラベルです。
長所と短所
| モード | 長所 | 短所 |
|---|---|---|
per-prefix | ラベルだけで出口が決まる。経路の出口が変わってもラベルを配り直さなくてよい(RFC 4364の4.3.2) | 経路の数だけラベルを使う。大きなVRFではPEのラベルを大量に消費する |
per-ce | ラベルの数がCEの数まで減る。ラベルだけで出口が決まる | 出口のCEが変わると、ラベルも変わる |
per-vrf | ラベルが1つで済む | 出口のPEで2回の検索(ラベル、次にIP)が必要になる |
ラベルの値は20ビットで、1台のPEが使える数には限りがあります。VRFの数や経路の数が多いPEほど、どのモードを選ぶかが効いてきます。
IOS XRでのVPNラベルの設定
モードはVRFごとに、router bgpのvrfの下のaddress-family ipv4 unicastでlabel modeとして設定します。書かなければper-prefixです。
router bgp 65001
vrf CUST-A
rd 65001:1
address-family ipv4 unicast
label mode per-vrf
redistribute connected
redistribute static
!
!
!| 設定 | 割り当て |
|---|---|
| (書かない) | per-prefix(既定) |
label mode per-ce | ネクストホップのCEごとに1つ |
label mode per-vrf | VRFごとに1つ |
label modeを変えても、BGPのセッションは張り直されません。PEは新しいラベルを付けたUPDATEを送り直すだけです。受け取った側は、同じプレフィックス・同じネクストホップのUPDATEが来れば、前のラベルを取り消して新しいラベルに置き換えます(RFC 8277の2.5)。
検証構成
XRd 6台で、出口のPE2の後ろにCEを2台・経路を4本置きます。モードの違いは「CEが複数」「経路が複数」の形でしか見分けられないためです。PE1とPE2はVRFのBGPにredistribute connectedとredistribute staticを入れているので、PE-CE間の経路もredistribute connectedによってVPNv4の経路として広告されます。
| ノード | 役割 |
|---|---|
| PE1 / PE2 | vrf CUST-A(RD 65001:1、RT 65001:100)。redistribute connectedとredistribute static |
| P1 | コアのみ(OSPF area 0 + LDP) |
| CE-A1 | 顧客Aのサイト1。LAN 10.1.1.0/24 |
| CE-A2 / CE-A3 | サイト2 / 3。LANを2つずつ(10.1.2.0/24・10.1.3.0/24 / 10.1.4.0/24・10.1.5.0/24) |
変えるのはPE2のvrf CUST-Aのlabel modeだけです。各STEPでは、CE-A1から宛先ごとに違う回数のpingを送ります(10.1.2.1に10発、10.1.3.1に20発、10.1.4.1に30発、10.1.5.1に40発、redistribute connectedの172.16.2.2に7発、172.16.3.2に11発)。P1-PE2間では、PHPのあとVPNラベルだけが付いているので、どの宛先のpingがどのラベルで届いたかをキャプチャーから直接数えられます。
| STEP | 操作(PE2のvrf CUST-A) | 確かめること |
|---|---|---|
| 0 | 初期状態(既定 = per-prefix) | redistribute staticの4本に4つのラベル、redistribute connectedの2本は集約ラベル |
| 1 | label mode per-ce | redistribute staticの経路がCEごとの2つにまとまる。セッションは張り直されない |
| 2 | label mode per-vrf | すべてが集約ラベル1つになり、AggregateでIPを引き直す |
| 3 | label modeを外す(最終状態) | STEP 0に戻る |
既定は経路ごと、redistribute connected は集約ラベル(STEP 0)
PE2が自分の経路に付けたラベル(Local Label)です。redistribute staticの4本に24003〜24006の4つ、redistribute connectedの2本には共通の24007が付いています。
Network Next Hop Rcvd Label Local Label
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 20
*>i10.1.1.0/24 1.1.1.1 24003 nolabel
*> 10.1.2.0/24 172.16.2.2 nolabel 24003
*> 10.1.3.0/24 172.16.2.2 nolabel 24004
*> 10.1.4.0/24 172.16.3.2 nolabel 24005
*> 10.1.5.0/24 172.16.3.2 nolabel 24006
*>i172.16.1.0/24 1.1.1.1 24004 nolabel
*> 172.16.2.0/24 0.0.0.0 nolabel 24007
*> 172.16.3.0/24 0.0.0.0 nolabel 24007
Processed 8 prefixes, 8 paths24007は、redistribute connectedの経路の詳細でもLocal Labelとして出ています。
RP/0/RP0/CPU0:PE2#show bgp vpnv4 unicast rd 65001:1 172.16.2.0/24
Tue Sep 22 15:59:04.077 UTC
BGP routing table entry for 172.16.2.0/24, Route Distinguisher: 65001:1
Versions:
Process bRIB/RIB SendTblVer
Speaker 14 14
Local Label: 24007転送表では、24003〜24006がUnlabelled(ラベルを外してCEへ出す)、24007がAggregate(VRFでIPを引き直す)です。
RP/0/RP0/CPU0:PE2#show mpls forwarding
Tue Sep 22 15:59:06.567 UTC
Local Outgoing Prefix Outgoing Next Hop Bytes
Label Label or ID Interface Switched
------ ----------- ------------------ ------------ --------------- ------------
24000 24000 1.1.1.1/32 Gi0/0/0/1 10.0.23.3 16559
24001 Pop 3.3.3.3/32 Gi0/0/0/1 10.0.23.3 626
24002 Pop 10.0.13.0/24 Gi0/0/0/1 10.0.23.3 0
24003 Unlabelled 10.1.2.0/24[V] Gi0/0/0/0 172.16.2.2 2236
24004 Unlabelled 10.1.3.0/24[V] Gi0/0/0/0 172.16.2.2 2000
24005 Unlabelled 10.1.4.0/24[V] Gi0/0/0/2 172.16.3.2 4236
24006 Unlabelled 10.1.5.0/24[V] Gi0/0/0/2 172.16.3.2 4000
24007 Aggregate CUST-A: Per-VRF Aggr[V] \
CUST-A 1872 P1-PE2間のキャプチャーで、CE-A1からのping(ICMPのecho request)をラベルと宛先ごとに数えると、送った回数どおりに分かれています。
$ tshark -r mpls-vpn-label-step0-p1pe2.pcap -Y 'mpls && icmp.type == 8 && ip.src == 10.1.1.1' -T fields -e mpls.label -e ip.dst | sort | uniq -c
10 24003 10.1.2.1
20 24004 10.1.3.1
30 24005 10.1.4.1
40 24006 10.1.5.1
7 24007 172.16.2.2
11 24007 172.16.3.2per-CEにするとCEごとにまとまる(STEP 1)
label mode per-ceにすると、redistribute staticの経路のラベルがネクストホップのCEごとの2つ(CE-A2向けの24008、CE-A3向けの24009)にまとまりました。redistribute connectedの経路は24007のままです。
Network Next Hop Rcvd Label Local Label
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 28
*>i10.1.1.0/24 1.1.1.1 24003 nolabel
*> 10.1.2.0/24 172.16.2.2 nolabel 24008
*> 10.1.3.0/24 172.16.2.2 nolabel 24008
*> 10.1.4.0/24 172.16.3.2 nolabel 24009
*> 10.1.5.0/24 172.16.3.2 nolabel 24009
*>i172.16.1.0/24 1.1.1.1 24004 nolabel
*> 172.16.2.0/24 0.0.0.0 nolabel 24007
*> 172.16.3.0/24 0.0.0.0 nolabel 24007
Processed 8 prefixes, 8 paths経路の詳細には、Resilient per-CEのネクストホップの組が表示されます。
RP/0/RP0/CPU0:PE2#show bgp vpnv4 unicast rd 65001:1 10.1.2.0/24
Tue Sep 22 16:03:27.460 UTC
BGP routing table entry for 10.1.2.0/24, Route Distinguisher: 65001:1
Versions:
Process bRIB/RIB SendTblVer
Speaker 25 25
Local Label: 24008
Gateway Array ID: 1, Resilient per-CE nexthop set ID: 1転送表の24008と24009は、CEへ出す行(Unlabelled)に加えて、(!)の付いた予備の行(Aggregate、VRFでIPを引き直す)を持っています。1つのラベルが特定のプレフィックスを指さないので、Prefix or ID欄はNo IDです。
RP/0/RP0/CPU0:PE2#show mpls forwarding
Tue Sep 22 16:03:31.271 UTC
Local Outgoing Prefix Outgoing Next Hop Bytes
Label Label or ID Interface Switched
------ ----------- ------------------ ------------ --------------- ------------
24000 24000 1.1.1.1/32 Gi0/0/0/1 10.0.23.3 16603
24001 Pop 3.3.3.3/32 Gi0/0/0/1 10.0.23.3 626
24002 Pop 10.0.13.0/24 Gi0/0/0/1 10.0.23.3 0
24007 Aggregate CUST-A: Per-VRF Aggr[V] \
CUST-A 1872
24008 Unlabelled No ID Gi0/0/0/0 172.16.2.2 4236
Aggregate No ID CUST-A 0 (!)
24009 Unlabelled No ID Gi0/0/0/2 172.16.3.2 8236
Aggregate No ID CUST-A 0 (!)モードを変えても、BGPのセッションは張り直されませんでした(PE1・PE2ともsyslogにADJCHANGEは出ていません)。PE2は新しいラベルを付けたUPDATEを1つ送っただけです。添付のSTEP 1のキャプチャーのNo.8で、4本の経路に24008と24009が付いています。取り消し(MP_UNREACH_NLRI)は送られていません。
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: 77
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: 24009 (bottom)
Route Distinguisher: 65001:1
MP Reach NLRI IPv4 prefix: 10.1.5.0
BGP Prefix
Prefix Length: 112
Label Stack: 24009 (bottom)
Route Distinguisher: 65001:1
MP Reach NLRI IPv4 prefix: 10.1.4.0
BGP Prefix
Prefix Length: 112
Label Stack: 24008 (bottom)
Route Distinguisher: 65001:1
MP Reach NLRI IPv4 prefix: 10.1.3.0
BGP Prefix
Prefix Length: 112
Label Stack: 24008 (bottom)
Route Distinguisher: 65001:1
MP Reach NLRI IPv4 prefix: 10.1.2.0データプレーンでも、CE-A2の2つの宛先は24008に、CE-A3の2つの宛先は24009に乗っています。
$ tshark -r mpls-vpn-label-step1-p1pe2.pcap -Y 'mpls && icmp.type == 8 && ip.src == 10.1.1.1' -T fields -e mpls.label -e ip.dst | sort | uniq -c
7 24007 172.16.2.2
11 24007 172.16.3.2
10 24008 10.1.2.1
20 24008 10.1.3.1
30 24009 10.1.4.1
40 24009 10.1.5.1per-VRFにすると1つになり、出口でIPを引き直す(STEP 2)
label mode per-vrfにすると、6本すべてが24007になりました。redistribute connectedの経路がSTEP 0から使っていた集約ラベルです。
Network Next Hop Rcvd Label Local Label
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 32
*>i10.1.1.0/24 1.1.1.1 24003 nolabel
*> 10.1.2.0/24 172.16.2.2 nolabel 24007
*> 10.1.3.0/24 172.16.2.2 nolabel 24007
*> 10.1.4.0/24 172.16.3.2 nolabel 24007
*> 10.1.5.0/24 172.16.3.2 nolabel 24007
*>i172.16.1.0/24 1.1.1.1 24004 nolabel
*> 172.16.2.0/24 0.0.0.0 nolabel 24007
*> 172.16.3.0/24 0.0.0.0 nolabel 24007
Processed 8 prefixes, 8 paths入口のPE1が受け取るラベル(Rcvd Label)も、6本すべて24007です。
Network Next Hop Rcvd Label Local Label
Route Distinguisher: 65001:1 (default for vrf CUST-A)
Route Distinguisher Version: 29
*> 10.1.1.0/24 172.16.1.2 nolabel 24003
*>i10.1.2.0/24 2.2.2.2 24007 nolabel
*>i10.1.3.0/24 2.2.2.2 24007 nolabel
*>i10.1.4.0/24 2.2.2.2 24007 nolabel
*>i10.1.5.0/24 2.2.2.2 24007 nolabel
*> 172.16.1.0/24 0.0.0.0 nolabel 24004
*>i172.16.2.0/24 2.2.2.2 24007 nolabel
*>i172.16.3.0/24 2.2.2.2 24007 nolabel
Processed 8 prefixes, 8 pathsPE2の転送表でVRFに属するラベルは24007だけで、Aggregate、Prefix or ID欄はCUST-A: Per-VRF Aggr[V]です。出口のPE2は、このラベルを外したあとvrf CUST-AでIPを引き直して転送先を決めます。
RP/0/RP0/CPU0:PE2#show mpls forwarding vrf CUST-A
Tue Sep 22 16:07:54.813 UTC
Local Outgoing Prefix Outgoing Next Hop Bytes
Label Label or ID Interface Switched
------ ----------- ------------------ ------------ --------------- ------------
24007 Aggregate CUST-A: Per-VRF Aggr[V] \
CUST-A 14272 6つの宛先へのpingが、すべて24007で届いています。
$ tshark -r mpls-vpn-label-step2-p1pe2.pcap -Y 'mpls && icmp.type == 8 && ip.src == 10.1.1.1' -T fields -e mpls.label -e ip.dst | sort | uniq -c
10 24007 10.1.2.1
20 24007 10.1.3.1
30 24007 10.1.4.1
40 24007 10.1.5.1
7 24007 172.16.2.2
11 24007 172.16.3.2なお、STEP 2のshow mpls forwarding(添付のファイル)には、STEP 1で使った24008と24009の行がまだ残っていますが、カウンタは0で通信は流れていません。
元に戻す(STEP 3)
label modeを外すと、redistribute staticの経路は再び経路ごとのラベル(24003〜24006)に戻りました。
$ tshark -r mpls-vpn-label-step3-p1pe2.pcap -Y 'mpls && icmp.type == 8 && ip.src == 10.1.1.1' -T fields -e mpls.label -e ip.dst | sort | uniq -c
10 24003 10.1.2.1
20 24004 10.1.3.1
30 24005 10.1.4.1
40 24006 10.1.5.1
7 24007 172.16.2.2
11 24007 172.16.3.2参考
| 規格 | タイトル | この記事で参照した箇所 |
|---|---|---|
| RFC 4364 | BGP/MPLS IP Virtual Private Networks (VPNs) | 4.3.2(ラベルの割り当ての単位は実装の問題、VRFごと・接続回線ごと・経路ごとの3つ、LANインタフェースと集約ラベル) |
| RFC 8277 | Using BGP to Bind MPLS Labels to Address Prefixes | 2.5(プレフィックスに結び付けたラベルの変更) |
書籍: Mobeen Tahir ほか『Cisco IOS XR Fundamentals』(Cisco Press, 2009)Chapter 9
検証環境: Cisco IOS XRd 26.1.1(Cisco Modeling Labs)
検証Configおよびshow結果
各STEPで6台すべてから、次のファイルをルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show bgp vpnv4 unicast labels / show bgp vpnv4 unicast rd <RD> <プレフィックス>(6本)/ 3点セット(advertised-routes / routes / received routes)/ show mpls forwarding / show mpls forwarding vrf CUST-A / show mpls label table など |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._ping.txt | そのSTEPのpingとtraceroute |
..._trace.txt | PEのshow bgp traceをピアのアドレスで絞り、末尾150行を切り出したもの |
..._clear.txt | pingの前にクリアしたカウンタ(PE2のclear mpls forwarding counters) |
..._commit.cfg | そのSTEPで実際にcommitされた設定だけ。設定を変えたルータの分のみ |
最終状態(STEP 3)はSTEP 0と同じ設定に戻しています。
STEP 0:初期状態(既定 = per-prefix)
| ルータ | show出力 | syslog | running-config | ping | trace | clear | 投入した設定 |
|---|---|---|---|---|---|---|---|
| CE-A1 | show | log | run | ping | - | - | - |
| PE1 | show | log | run | ping | trace | - | - |
| P1 | show | log | run | ping | - | - | - |
| PE2 | show | log | run | ping | trace | clear | - |
| CE-A2 | show | log | run | ping | - | - | - |
| CE-A3 | show | log | run | ping | - | - | - |
STEP 1:label mode per-ce
| ルータ | show出力 | syslog | running-config | ping | trace | clear | 投入した設定 |
|---|---|---|---|---|---|---|---|
| CE-A1 | show | log | run | ping | - | - | - |
| PE1 | show | log | run | ping | trace | - | - |
| P1 | show | log | run | ping | - | - | - |
| PE2 | show | log | run | ping | trace | clear | commit |
| CE-A2 | show | log | run | ping | - | - | - |
| CE-A3 | show | log | run | ping | - | - | - |
STEP 2:label mode per-vrf
| ルータ | show出力 | syslog | running-config | ping | trace | clear | 投入した設定 |
|---|---|---|---|---|---|---|---|
| CE-A1 | show | log | run | ping | - | - | - |
| PE1 | show | log | run | ping | trace | - | - |
| P1 | show | log | run | ping | - | - | - |
| PE2 | show | log | run | ping | trace | clear | commit |
| CE-A2 | show | log | run | ping | - | - | - |
| CE-A3 | show | log | run | ping | - | - | - |
STEP 3:label modeを外す(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | clear | 投入した設定 |
|---|---|---|---|---|---|---|---|
| CE-A1 | show | log | run | ping | - | - | - |
| PE1 | show | log | run | ping | trace | - | - |
| P1 | show | log | run | ping | - | - | - |
| PE2 | show | log | run | ping | trace | clear | commit |
| CE-A2 | show | log | run | ping | - | - | - |
| CE-A3 | show | log | run | ping | - | - | - |
| パケットキャプチャーはSTEPごとに取得しています。 |
| STEP | P1-PE2間 |
|---|---|
| 0 | pcap |
| 1 | pcap |
| 2 | pcap |
| 3 | pcap |