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

MPLS VPNのVPNラベルの割り当て(per-prefix / per-CE / per-VRF)

目次

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-vrfper-ceper-prefixという名前のモードで選べます。

RFC 4364の挙げるやり方IOS XRのモードラベルの数出口のPEでの処理
経路ごとに1つper-prefix(既定)経路の数だけラベルだけで出口が決まる
接続回線ごとに1つper-ce(ネクストホップのCEごと)CEの数だけラベルだけで出口が決まる
VRFごとに1つper-vrfVRFごとに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 bgpvrfの下のaddress-family ipv4 unicastlabel modeとして設定します。書かなければper-prefixです。

per-VRF にする設定(IOS XR)
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-vrfVRFごとに1つ

label modeを変えても、BGPのセッションは張り直されません。PEは新しいラベルを付けたUPDATEを送り直すだけです。受け取った側は、同じプレフィックス・同じネクストホップのUPDATEが来れば、前のラベルを取り消して新しいラベルに置き換えます(RFC 8277の2.5)。

検証構成

XRd 6台で、出口のPE2の後ろにCEを2台・経路を4本置きます。モードの違いは「CEが複数」「経路が複数」の形でしか見分けられないためです。PE1とPE2はVRFのBGPにredistribute connectedredistribute staticを入れているので、PE-CE間の経路もredistribute connectedによってVPNv4の経路として広告されます。

ノード役割
PE1 / PE2vrf CUST-A(RD 65001:1、RT 65001:100)。redistribute connectedredistribute 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/2410.1.3.0/24 / 10.1.4.0/2410.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 connected172.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本は集約ラベル
1label mode per-ceredistribute staticの経路がCEごとの2つにまとまる。セッションは張り直されない
2label mode per-vrfすべてが集約ラベル1つになり、AggregateでIPを引き直す
3label modeを外す(最終状態)STEP 0に戻る

既定は経路ごと、redistribute connected は集約ラベル(STEP 0)

PE2が自分の経路に付けたラベル(Local Label)です。redistribute staticの4本に24003〜24006の4つ、redistribute connectedの2本には共通の24007が付いています。

STEP 0 PE2 の show bgp vpnv4 unicast labels(抜粋)
   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 paths

24007は、redistribute connectedの経路の詳細でもLocal Labelとして出ています。

STEP 0 PE2 の show bgp vpnv4 unicast rd 65001:1 172.16.2.0/24(抜粋)
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を引き直す)です。

STEP 0 PE2 の show mpls forwarding
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)をラベルと宛先ごとに数えると、送った回数どおりに分かれています。

STEP 0 のキャプチャーで数えたラベルと宛先
$ 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.2

per-CEにするとCEごとにまとまる(STEP 1)

label mode per-ceにすると、redistribute staticの経路のラベルがネクストホップのCEごとの2つ(CE-A2向けの24008、CE-A3向けの24009)にまとまりました。redistribute connectedの経路は24007のままです。

STEP 1 PE2 の show bgp vpnv4 unicast labels(抜粋)
   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のネクストホップの組が表示されます。

STEP 1 PE2 の show bgp vpnv4 unicast rd 65001:1 10.1.2.0/24(抜粋)
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です。

STEP 1 PE2 の show mpls forwarding
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)は送られていません。

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

データプレーンでも、CE-A2の2つの宛先は24008に、CE-A3の2つの宛先は24009に乗っています。

STEP 1 のキャプチャーで数えたラベルと宛先
$ 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.1

per-VRFにすると1つになり、出口でIPを引き直す(STEP 2)

label mode per-vrfにすると、6本すべてが24007になりました。redistribute connectedの経路がSTEP 0から使っていた集約ラベルです。

STEP 2 PE2 の show bgp vpnv4 unicast labels(抜粋)
   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です。

STEP 2 PE1 の show bgp vpnv4 unicast labels(抜粋)
   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 paths

PE2の転送表でVRFに属するラベルは24007だけで、Aggregate、Prefix or ID欄はCUST-A: Per-VRF Aggr[V]です。出口のPE2は、このラベルを外したあとvrf CUST-AでIPを引き直して転送先を決めます。

STEP 2 PE2 の show mpls forwarding vrf CUST-A
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で届いています。

STEP 2 のキャプチャーで数えたラベルと宛先
$ 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)に戻りました。

STEP 3 のキャプチャーで数えたラベルと宛先
$ 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 4364BGP/MPLS IP Virtual Private Networks (VPNs)4.3.2(ラベルの割り当ての単位は実装の問題、VRFごと・接続回線ごと・経路ごとの3つ、LANインタフェースと集約ラベル)
RFC 8277Using BGP to Bind MPLS Labels to Address Prefixes2.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.txtshow 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のpingtraceroute
..._trace.txtPEのshow bgp traceをピアのアドレスで絞り、末尾150行を切り出したもの
..._clear.txtpingの前にクリアしたカウンタ(PE2のclear mpls forwarding counters
..._commit.cfgそのSTEPで実際にcommitされた設定だけ。設定を変えたルータの分のみ

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

STEP 0:初期状態(既定 = per-prefix)

ルータshow出力syslogrunning-configpingtraceclear投入した設定
CE-A1showlogrunping---
PE1showlogrunpingtrace--
P1showlogrunping---
PE2showlogrunpingtraceclear-
CE-A2showlogrunping---
CE-A3showlogrunping---

STEP 1:label mode per-ce

ルータshow出力syslogrunning-configpingtraceclear投入した設定
CE-A1showlogrunping---
PE1showlogrunpingtrace--
P1showlogrunping---
PE2showlogrunpingtraceclearcommit
CE-A2showlogrunping---
CE-A3showlogrunping---

STEP 2:label mode per-vrf

ルータshow出力syslogrunning-configpingtraceclear投入した設定
CE-A1showlogrunping---
PE1showlogrunpingtrace--
P1showlogrunping---
PE2showlogrunpingtraceclearcommit
CE-A2showlogrunping---
CE-A3showlogrunping---

STEP 3:label modeを外す(最終状態)

ルータshow出力syslogrunning-configpingtraceclear投入した設定
CE-A1showlogrunping---
PE1showlogrunpingtrace--
P1showlogrunping---
PE2showlogrunpingtraceclearcommit
CE-A2showlogrunping---
CE-A3showlogrunping---
パケットキャプチャーはSTEPごとに取得しています。
STEPP1-PE2間
0pcap
1pcap
2pcap
3pcap

関連記事