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

MPLS VPNのVRF(Virtual Routing and Forwarding)

目次

MPLS VPNのVRFとは

VRF(Virtual Routing and Forwarding)は、1台のルータの中に作る独立した経路表と転送表の組です。RFC 4364の3は、PEルータが複数の転送表を持ち、既定の転送表のほかに「VPN Routing and Forwarding table(VRF)」を持つと定めています。

PEは接続している顧客(VPN)ごとにVRFを1つ持ちます。顧客Aの経路は顧客AのVRFに、顧客Bの経路は顧客BのVRFに入り、互いに見えません。この分離があるから、顧客同士でIPアドレスが重なっていても同じPEに収容できます

この記事ではVRFという入れ物そのものを扱います。VRFの中身を他のPEへ運ぶ仕組み(RD・RT・MP-BGP)は、MPLS VPNのRD以降の記事で解説します。全体像はMPLS VPN(L3VPN)とはにあります。

グローバル表とVRF表

ルータが元から持っている経路表をグローバル表(IOS XRの表示ではdefault)と呼びます。VRFを作ると、それとは別の経路表が増えます。

見たいものIOS XRのコマンド
グローバル表show route
特定のVRFの経路表show route vrf <名前>
すべてのVRFの経路表show route vrf all
VRFの一覧と設定show vrf all detail
インタフェースの所属show ipv4 vrf all interface brief
VRFごとの転送表(CEF)show cef vrf <名前>

表が別物である以上、疎通確認のコマンドもVRFを指定しますping 10.1.1.1はグローバル表を引き、ping vrf CUST-A 10.1.1.1はCUST-Aの表を引きます。同じアドレスを指定しても、届く先は別の装置になります。

インタフェースはどれか1つのVRFに属する

VRFに経路が入るだけでは足りません。受け取ったパケットがどの顧客のものかを判断する必要があり、その判断材料がインタフェースの所属です。RFC 4364の3も、PE-CE間のインタフェースはどれか1つのVRFに結び付けられると述べています。

IOS XRではインタフェースの下にvrfを書きます。

インタフェースをVRFに所属させる(IOS XR)
interface GigabitEthernet0/0/0/0
 vrf CUST-A
 ipv4 address 172.16.1.1 255.255.255.0
!

1つのインタフェースが属せるVRFは1つだけですが、1つのVRFに複数のインタフェースを入れることはできます。所属を指定しないインタフェースはグローバル表のままです。

IOS XR(XRd 26.1.1)では、あとからvrfを足してもIPアドレスは外れません。インタフェースを別のVRFへ移すとアドレス設定が消えるルータもあるため、他機種の手順をそのまま持ち込まず、移した後にshow running-config interfaceで確認してください。

VRFを作るのにMP-BGPは要らない

VRFは経路表の入れ物なので、MPLSもMP-BGPも無いところで単体で作れます。IOS XRの最小の設定は次の2行です。

VRFの定義(IOS XR)
vrf CUST-A
 address-family ipv4 unicast
!

RDやRTが要るのは、そのVRFの経路を他のPEへ運ぶときです。IOS XRではRDをrouter bgpの配下(vrf <名前>の中)で設定するため、BGPを動かさない限りRDは登場しません。show vrf all detailにもRD not setと出ます。

この性質があるので、VRFはMPLS VPNの外でも使えます(次節のVRF-Lite)。

重複したアドレスの共存

顧客は自分のネットワークで好きなアドレスを使うため、別々の顧客が同じ10.1.1.0/24を持つことがあります。VRFが分かれていれば、同じプレフィックスがPEの中に複数あっても衝突しません

重ねられるのは顧客のLANだけではありません。PE-CE間のリンクのアドレスも重ねられます。VRFが違えば、1台のPEの2つのインタフェースが同じ172.16.1.1/24を持てます。

逆に、VRFを使わずにグローバル表へ入れてしまうと、同じプレフィックスが1つの表に2本入ることになります。ルータはそれを等コストの2経路として扱い、顧客A宛てのパケットが顧客B側へ送られることが起こります。後半のSTEP 0で実際にその状態を作ります。

VRF-Lite(Multi-VRF CE)

MPLSもMP-BGPも使わず、1台のルータの中の分離だけを目的にVRFを使う構成をVRF-Lite(Multi-VRF CE)と呼びます。顧客側のルータで部門ごとに経路表を分ける、といった使い方です。

VPNの経路を他のルータへ運ぶ仕組みが無いので、分離はその装置の中だけで完結します。隣のルータまで分離を延ばしたい場合は、VLANなどでリンクを論理的に分け、両端で同じVRFに入れます。

検証構成

XRd 4台で、顧客Aと顧客Bが同じアドレスを使う状態を作ります。CE-A1とCE-B1のLANはどちらも同じアドレス10.1.1.0/24)で、STEP 4ではPE-CE間のリンクも172.16.1.0/24で重ねます。

STEP操作確かめること
0初期状態(VRFなし、PEの3本ともグローバル)同じプレフィックスが1つの表に2本入り、顧客を区別できない
1PE1にvrf CUST-Avrf CUST-Bを作るBGPを使わずにVRFが作れる
2Gi0/0/0/0をCUST-A、Gi0/0/0/1をCUST-Bに所属させる所属だけでアドレスは残り、経路表が移る
3Gi0/0/0/2もCUST-Aへ。静的経路をVRFごとに入れ直す同じ10.1.1.0/24が両方のVRFに入り、ping vrfで別の宛先に届く
4PE-CEリンクも172.16.1.0/24に重ねる1台のPEの2つのインタフェースが同じアドレスを持てる
5CE-A1にvrf DEPT-1DEPT-2を作るCE側だけでも分離できる(VRF-Lite)

PE-CE間のルーティングは静的経路です。プロトコルを使う構成はPE-CEルーティング(スタティック)以降で扱います。

VRFが無いと顧客を区別できない(STEP 0)

STEP 0ではVRFを作らず、PE1の3本のインタフェースをすべてグローバル表に置いています。顧客AとBのLANへの静的経路も、同じグローバル表に入れてあります。

STEP 0 PE1 の show route(VRFなし)
Gateway of last resort is not set

S    10.1.1.0/24 [1/0] via 172.16.1.2, 00:03:05
                 [1/0] via 172.16.11.2, 00:03:05
S    10.1.2.0/24 [1/0] via 172.16.2.2, 00:03:05
L    11.11.11.11/32 is directly connected, 00:03:11, Loopback0
C    172.16.1.0/24 is directly connected, 00:03:05, GigabitEthernet0/0/0/0
L    172.16.1.1/32 is directly connected, 00:03:05, GigabitEthernet0/0/0/0
C    172.16.2.0/24 is directly connected, 00:03:05, GigabitEthernet0/0/0/2
L    172.16.2.1/32 is directly connected, 00:03:05, GigabitEthernet0/0/0/2
C    172.16.11.0/24 is directly connected, 00:03:05, GigabitEthernet0/0/0/1
L    172.16.11.1/32 is directly connected, 00:03:05, GigabitEthernet0/0/0/1

10.1.1.0/242本の経路が入っています。上が顧客A(CE-A1)へ、下が顧客B(CE-B1)へ向かう経路で、ルータから見ればどちらも同じプレフィックスへの等コストの経路です。どちらの顧客宛てかを区別する材料がありません

実際に転送に使われる表(CEF)も同じです。show cefでは、10.1.1.0/24の1行に再帰ネクストホップが2つ並びます。

STEP 0 PE1 のグローバルCEF表
RP/0/RP0/CPU0:PE1#show cef
Sun Sep 20 04:54:09.689 UTC

Prefix              Next Hop            Interface
------------------- ------------------- ------------------
0.0.0.0/0           drop                default handler 
0.0.0.0/32          broadcast
10.1.1.0/24         172.16.1.2/32       <recursive>
                    172.16.11.2/32      <recursive>
10.1.2.0/24         172.16.2.2/32       <recursive>
11.11.11.11/32      receive             Loopback0
172.16.1.0/24       attached            GigabitEthernet0/0/0/0
172.16.1.0/32       broadcast           GigabitEthernet0/0/0/0
172.16.1.1/32       receive             GigabitEthernet0/0/0/0
172.16.1.2/32       172.16.1.2/32       GigabitEthernet0/0/0/0
172.16.1.255/32     broadcast           GigabitEthernet0/0/0/0
172.16.2.0/24       attached            GigabitEthernet0/0/0/2
172.16.2.0/32       broadcast           GigabitEthernet0/0/0/2
172.16.2.1/32       receive             GigabitEthernet0/0/0/2
172.16.2.2/32       172.16.2.2/32       GigabitEthernet0/0/0/2
172.16.2.255/32     broadcast           GigabitEthernet0/0/0/2
172.16.11.0/24      attached            GigabitEthernet0/0/0/1
172.16.11.0/32      broadcast           GigabitEthernet0/0/0/1
172.16.11.1/32      receive             GigabitEthernet0/0/0/1
172.16.11.2/32      172.16.11.2/32      GigabitEthernet0/0/0/1
172.16.11.255/32    broadcast           GigabitEthernet0/0/0/1
224.0.0.0/4         0.0.0.0/32          
224.0.0.0/24        receive
255.255.255.255/32  broadcast

この状態で顧客Aの拠点間(CE-A1からCE-A2のLAN)を測ると、ping自体は通ります。

STEP 0 CE-A1 から顧客Aの別拠点への疎通
RP/0/RP0/CPU0:CE-A1#ping 10.1.2.1 source 10.1.1.1 count 50 timeout 1
Sun Sep 20 04:52:46.415 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 10.1.2.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 8/10/29 ms
RP/0/RP0/CPU0:CE-A1#traceroute 10.1.2.1 source 10.1.1.1 timeout 1 probe 2 maxttl 4
Sun Sep 20 04:52:48.040 UTC

Type escape sequence to abort.
Tracing the route to 10.1.2.1

 1   *  * 
 2   *  * 
 3   *  * 
 4   *  * 

pingは100%届いているのに、tracerouteは1ホップ目から応答がありません。tracerouteの戻り(ICMP time exceeded)の宛先は10.1.1.1で、PE1はこれを2本の経路のどちらかへ送ります。顧客B側へ送られた分は、同じ10.1.1.1を持つCE-B1に届いて終わります。送信元へは戻りません。

顧客Aのパケットが顧客Bへ渡っている状態で、VPNとして成立していません。

VRFを作って経路を分ける(STEP 1〜3)

STEP 1でPE1にVRFを2つ作ります。投入したのは次の内容だけで、BGPは1行もありません

STEP 1 で commit された設定
vrf CUST-A
 address-family ipv4 unicast
 !
!
vrf CUST-B
 address-family ipv4 unicast
 !
!
STEP 1 PE1 の show vrf all detail(抜粋)
RP/0/RP0/CPU0:PE1#show vrf all detail
Sun Sep 20 04:58:52.194 UTC

VRF CUST-A; RD not set; VPN ID not set
VRF mode: Regular
Description not set
Address family IPV4 Unicast
  No import VPN route-target communities
  No export VPN route-target communities
  No import route policy
  No export route policy

RD not setで、import・exportのRTも空です。この時点でVRFは経路表として使えます。

STEP 2でインタフェースを所属させます。投入したのはvrfの行だけですが、show ipv4 vrf all interface briefVrf-Nameが変わり、アドレスは172.16.1.1のまま残っています

STEP 2 PE1 のインタフェース所属
RP/0/RP0/CPU0:PE1#show ipv4 vrf all interface brief
Sun Sep 20 05:06:10.788 UTC

Interface                      IP-Address      Status          Protocol Vrf-Name
Loopback0                      11.11.11.11     Up              Up       default 
MgmtEth0/RP0/CPU0/0            10.19.7.11      Up              Up       Mgmt    
GigabitEthernet0/0/0/0         172.16.1.1      Up              Up       CUST-A  
GigabitEthernet0/0/0/1         172.16.11.1     Up              Up       CUST-B  
GigabitEthernet0/0/0/2         172.16.2.1      Up              Up       default 
GigabitEthernet0/0/0/3         unassigned      Shutdown        Down     default 

STEP 3で残りのGi0/0/0/2もCUST-Aに入れ、グローバル表の静的経路を削除してVRFごとに入れ直します。結果として、同じ10.1.1.0/24が両方のVRFに1本ずつ入ります。

STEP 3 PE1 の show route vrf CUST-A
Gateway of last resort is not set

S    10.1.1.0/24 [1/0] via 172.16.1.2, 00:02:16
S    10.1.2.0/24 [1/0] via 172.16.2.2, 00:02:16
C    172.16.1.0/24 is directly connected, 00:09:27, GigabitEthernet0/0/0/0
L    172.16.1.1/32 is directly connected, 00:09:27, GigabitEthernet0/0/0/0
C    172.16.2.0/24 is directly connected, 00:02:16, GigabitEthernet0/0/0/2
L    172.16.2.1/32 is directly connected, 00:02:16, GigabitEthernet0/0/0/2
STEP 3 PE1 の show route vrf CUST-B
Gateway of last resort is not set

S    10.1.1.0/24 [1/0] via 172.16.11.2, 00:02:17
C    172.16.11.0/24 is directly connected, 00:09:28, GigabitEthernet0/0/0/1
L    172.16.11.1/32 is directly connected, 00:09:28, GigabitEthernet0/0/0/1

転送表も同じようにVRFごとに分かれます。STEP 0では1つの表に2つの再帰ネクストホップが並んでいましたが、いまは別々の表に1つずつ入っています。

STEP 3 PE1 の show cef vrf CUST-A
RP/0/RP0/CPU0:PE1#show cef vrf CUST-A
Sun Sep 20 05:09:48.093 UTC

Prefix              Next Hop            Interface
------------------- ------------------- ------------------
0.0.0.0/0           drop                default handler 
0.0.0.0/32          broadcast
10.1.1.0/24         172.16.1.2/32       <recursive>
10.1.2.0/24         172.16.2.2/32       <recursive>
172.16.1.0/24       attached            GigabitEthernet0/0/0/0
172.16.1.0/32       broadcast           GigabitEthernet0/0/0/0
172.16.1.1/32       receive             GigabitEthernet0/0/0/0
172.16.1.2/32       172.16.1.2/32       GigabitEthernet0/0/0/0
172.16.1.255/32     broadcast           GigabitEthernet0/0/0/0
172.16.2.0/24       attached            GigabitEthernet0/0/0/2
172.16.2.0/32       broadcast           GigabitEthernet0/0/0/2
172.16.2.1/32       receive             GigabitEthernet0/0/0/2
172.16.2.2/32       172.16.2.2/32       GigabitEthernet0/0/0/2
172.16.2.255/32     broadcast           GigabitEthernet0/0/0/2
224.0.0.0/4         0.0.0.0/32          
224.0.0.0/24        receive
255.255.255.255/32  broadcast
STEP 3 PE1 の show cef vrf CUST-B
RP/0/RP0/CPU0:PE1#show cef vrf CUST-B
Sun Sep 20 05:09:48.451 UTC

Prefix              Next Hop            Interface
------------------- ------------------- ------------------
0.0.0.0/0           drop                default handler 
0.0.0.0/32          broadcast
10.1.1.0/24         172.16.11.2/32      <recursive>
172.16.11.0/24      attached            GigabitEthernet0/0/0/1
172.16.11.0/32      broadcast           GigabitEthernet0/0/0/1
172.16.11.1/32      receive             GigabitEthernet0/0/0/1
172.16.11.2/32      172.16.11.2/32      GigabitEthernet0/0/0/1
172.16.11.255/32    broadcast           GigabitEthernet0/0/0/1
224.0.0.0/4         0.0.0.0/32          
224.0.0.0/24        receive
255.255.255.255/32  broadcast

どちらの表にも10.1.1.0/24がありますが、次ホップが違います。pingにVRFを指定すると、同じアドレスで別の装置に届きます。

STEP 3 PE1 からの疎通(VRF指定あり・なし)
RP/0/RP0/CPU0:PE1#ping vrf CUST-A 10.1.1.1 count 50 timeout 1
Sun Sep 20 05:07:37.488 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 10.1.1.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 4/9/60 ms
RP/0/RP0/CPU0:PE1#ping vrf CUST-B 10.1.1.1 count 50 timeout 1
Sun Sep 20 05:07:39.294 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 10.1.1.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 4/9/58 ms
RP/0/RP0/CPU0:PE1#ping 10.1.1.1 count 50 timeout 1
Sun Sep 20 05:07:41.195 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 10.1.1.1 timeout is 1 seconds:
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
Success rate is 0 percent (0/50)

VRFを指定した2つはどちらも100%ですが、届いている相手は別の装置です。VRFを指定しない最後の1つはU(到達不能)で、グローバル表に10.1.1.0/24が無いことを示しています。

顧客をまたぐ通信も届きません。顧客BのCE-B1から顧客Aの10.1.2.1へのpingは0%で、STEP 0では顧客Bへ漏れていた通信が遮断されています

リンクのアドレスまで重ねられる(STEP 4)

STEP 4では、CE-B1とPE1のGi0/0/0/1を172.16.1.0/24に変更して、PE-CE間のリンクも顧客Aと同じアドレスにします

STEP 4 PE1 のインタフェース(同じアドレスが2つ)
RP/0/RP0/CPU0:PE1#show ipv4 vrf all interface brief
Sun Sep 20 05:13:50.621 UTC

Interface                      IP-Address      Status          Protocol Vrf-Name
Loopback0                      11.11.11.11     Up              Up       default 
MgmtEth0/RP0/CPU0/0            10.19.7.11      Up              Up       Mgmt    
GigabitEthernet0/0/0/0         172.16.1.1      Up              Up       CUST-A  
GigabitEthernet0/0/0/1         172.16.1.1      Up              Up       CUST-B  
GigabitEthernet0/0/0/2         172.16.2.1      Up              Up       CUST-A  
GigabitEthernet0/0/0/3         unassigned      Shutdown        Down     default 

1台のPEの2つのインタフェースが同じ172.16.1.1を持っています。グローバル表では重複として弾かれる設定が、VRFが違えばそのまま通ります。疎通はSTEP 3と変わりません。

CEでのVRF-Lite(STEP 5)

STEP 5では、PEではなく顧客側のCE-A1にVRFを2つ作り、ループバックを1つずつ入れます。MPLSもMP-BGPも無く、PEとも無関係な設定です

STEP 5 で CE-A1 に commit された設定
vrf DEPT-1
 address-family ipv4 unicast
 !
!
vrf DEPT-2
 address-family ipv4 unicast
 !
!
interface Loopback2
 description dept-1 LAN 10.9.1.0/24
 vrf DEPT-1
 ipv4 address 10.9.1.1 255.255.255.0
!
interface Loopback3
 description dept-2 LAN 10.9.1.0/24 (overlaps dept-1)
 vrf DEPT-2
 ipv4 address 10.9.1.1 255.255.255.0
!
STEP 5 CE-A1 のインタフェース
RP/0/RP0/CPU0:CE-A1#show ipv4 vrf all interface brief
Sun Sep 20 05:18:04.919 UTC

Interface                      IP-Address      Status          Protocol Vrf-Name
Loopback0                      1.1.1.1         Up              Up       default 
Loopback1                      10.1.1.1        Up              Up       default 
Loopback2                      10.9.1.1        Up              Up       DEPT-1  
Loopback3                      10.9.1.1        Up              Up       DEPT-2  
MgmtEth0/RP0/CPU0/0            10.19.7.21      Up              Up       Mgmt    
GigabitEthernet0/0/0/0         172.16.1.2      Up              Up       default 
GigabitEthernet0/0/0/1         unassigned      Shutdown        Down     default 
GigabitEthernet0/0/0/2         unassigned      Shutdown        Down     default 
GigabitEthernet0/0/0/3         unassigned      Shutdown        Down     default 

同じ10.9.1.1が2つのループバックに付き、show route vrf DEPT-1show route vrf DEPT-2はそれぞれ自分の接続経路だけを持ちます。VRFの分離はPEでもCEでも同じように効きます

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow version / show interface description / show route / VRF関連のshow一式
..._ping.txtそのSTEPでのpingtracerouteの結果
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._commit.cfgそのSTEPで実際にcommitされた設定だけ。設定を変えたルータの分のみ

最終状態では、PE1にVRFが2つあり3本のインタフェースがそこに属し、CE-A1にVRF-Liteの2つのVRFがあります。

STEP 0:初期状態(VRFなし、すべてグローバル表)

ルータshow出力pingsyslogrunning-config
PE1showpinglogrun
CE-A1showpinglogrun
CE-B1showpinglogrun
CE-A2showpinglogrun

STEP 1:PE1にVRFを2つ作る

ルータshow出力pingsyslogrunning-config投入した設定
PE1showpinglogruncommit
CE-A1showpinglogrun
CE-B1showpinglogrun
CE-A2showpinglogrun

STEP 2:インタフェースをVRFに所属させる

ルータshow出力pingsyslogrunning-config投入した設定
PE1showpinglogruncommit
CE-A1showpinglogrun
CE-B1showpinglogrun
CE-A2showpinglogrun

STEP 3:VRFごとに静的経路を入れ直す

ルータshow出力pingsyslogrunning-config投入した設定
PE1showpinglogruncommit
CE-A1showpinglogrun
CE-B1showpinglogrun
CE-A2showpinglogrun

STEP 4:PE-CEリンクのアドレスも重ねる

ルータshow出力pingsyslogrunning-config投入した設定
PE1showpinglogruncommit
CE-A1showpinglogrun
CE-B1showpinglogruncommit
CE-A2showpinglogrun

STEP 5:CE-A1でVRF-Liteを使う(最終状態)

ルータshow出力pingsyslogrunning-config投入した設定
PE1showpinglogrun
CE-A1showpinglogruncommit
CE-B1showpinglogrun
CE-A2showpinglogrun

参考

RFCタイトル概要
RFC 4364BGP/MPLS IP Virtual Private Networks (VPNs)PEが複数の転送表(VRF)を持つこと、インタフェースとVRFの対応(3)

書籍: Luc De Ghein『MPLS Fundamentals』(Cisco Press, 2006)Chapter 7

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

関連記事