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を書きます。
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 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本入り、顧客を区別できない |
| 1 | PE1にvrf CUST-Aとvrf CUST-Bを作る | BGPを使わずにVRFが作れる |
| 2 | Gi0/0/0/0をCUST-A、Gi0/0/0/1をCUST-Bに所属させる | 所属だけでアドレスは残り、経路表が移る |
| 3 | Gi0/0/0/2もCUST-Aへ。静的経路をVRFごとに入れ直す | 同じ10.1.1.0/24が両方のVRFに入り、ping vrfで別の宛先に届く |
| 4 | PE-CEリンクも172.16.1.0/24に重ねる | 1台のPEの2つのインタフェースが同じアドレスを持てる |
| 5 | CE-A1にvrf DEPT-1とDEPT-2を作る | CE側だけでも分離できる(VRF-Lite) |
PE-CE間のルーティングは静的経路です。プロトコルを使う構成はPE-CEルーティング(スタティック)以降で扱います。
VRFが無いと顧客を区別できない(STEP 0)
STEP 0ではVRFを作らず、PE1の3本のインタフェースをすべてグローバル表に置いています。顧客AとBのLANへの静的経路も、同じグローバル表に入れてあります。
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/110.1.1.0/24に2本の経路が入っています。上が顧客A(CE-A1)へ、下が顧客B(CE-B1)へ向かう経路で、ルータから見ればどちらも同じプレフィックスへの等コストの経路です。どちらの顧客宛てかを区別する材料がありません。
実際に転送に使われる表(CEF)も同じです。show cefでは、10.1.1.0/24の1行に再帰ネクストホップが2つ並びます。
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自体は通ります。
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行もありません。
vrf CUST-A
address-family ipv4 unicast
!
!
vrf CUST-B
address-family ipv4 unicast
!
!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 policyRD not setで、import・exportのRTも空です。この時点でVRFは経路表として使えます。
STEP 2でインタフェースを所属させます。投入したのはvrfの行だけですが、show ipv4 vrf all interface briefのVrf-Nameが変わり、アドレスは172.16.1.1のまま残っています。
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本ずつ入ります。
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/2Gateway 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つずつ入っています。
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 broadcastRP/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を指定すると、同じアドレスで別の装置に届きます。
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と同じアドレスにします。
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とも無関係な設定です。
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
!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-1とshow route vrf DEPT-2はそれぞれ自分の接続経路だけを持ちます。VRFの分離はPEでもCEでも同じように効きます。
検証Configおよびshow結果
各STEPで4台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt | show version / show interface description / show route / VRF関連のshow一式 |
..._ping.txt | そのSTEPでのpingとtracerouteの結果 |
..._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出力 | ping | syslog | running-config |
|---|---|---|---|---|
| PE1 | show | ping | log | run |
| CE-A1 | show | ping | log | run |
| CE-B1 | show | ping | log | run |
| CE-A2 | show | ping | log | run |
STEP 1:PE1にVRFを2つ作る
| ルータ | show出力 | ping | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|
| PE1 | show | ping | log | run | commit |
| CE-A1 | show | ping | log | run | — |
| CE-B1 | show | ping | log | run | — |
| CE-A2 | show | ping | log | run | — |
STEP 2:インタフェースをVRFに所属させる
| ルータ | show出力 | ping | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|
| PE1 | show | ping | log | run | commit |
| CE-A1 | show | ping | log | run | — |
| CE-B1 | show | ping | log | run | — |
| CE-A2 | show | ping | log | run | — |
STEP 3:VRFごとに静的経路を入れ直す
| ルータ | show出力 | ping | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|
| PE1 | show | ping | log | run | commit |
| CE-A1 | show | ping | log | run | — |
| CE-B1 | show | ping | log | run | — |
| CE-A2 | show | ping | log | run | — |
STEP 4:PE-CEリンクのアドレスも重ねる
| ルータ | show出力 | ping | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|
| PE1 | show | ping | log | run | commit |
| CE-A1 | show | ping | log | run | — |
| CE-B1 | show | ping | log | run | commit |
| CE-A2 | show | ping | log | run | — |
STEP 5:CE-A1でVRF-Liteを使う(最終状態)
| ルータ | show出力 | ping | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|
| PE1 | show | ping | log | run | — |
| CE-A1 | show | ping | log | run | commit |
| CE-B1 | show | ping | log | run | — |
| CE-A2 | show | ping | log | run | — |
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 4364 | BGP/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)