【CCNP】MPLS-VPNの覚書

Cisco

CCNP ENARSIの勉強を進めていますが、普段全く触らない技術(MPLS、MP-BGP、DMVPN)をアウトプットしていこうと思います。
この技術は企業ネットワークで使われることはなく、ISPやDC基盤で使われる技術のため、新鮮に感じてやっていて楽しいです。

MPLS-VPNとは

Multi Protocol Label Swiching-Virtual Private Networkの略です。
VRFを認識するラベルを別ルータにも通知することができ、1台のルータで複数の企業ネットワークをルーティングテーブルごと分離し対向ルータに伝えることができるイメージです。

名称説明
MPLSラベルと呼ばれる数値をMPLSヘッダとして付与することでIPv4、IPv6など様々なプロトコルで通信制御する技術になります。
MPLSヘッダはIPヘッダの前に参照されるヘッダで、MPLSヘッダは4バイト、IPヘッダは20バイトのため高速転送可能です。
VPN文字通り”仮想的な専用線”で拠点間などネットワークを仮想的に接続する技術です。

重要ワード

MPLS-VPNは複数技術の組み合わせですが、専門用語を出しすぎると訳が分からなくなるため、ここで出てくるキーワードだけ載せます。

VRF

ルーティングテーブルを分離する機能です。
物理的なNW機器を仮想的にネットワークを分離することができます。
この機能を使うことで”192.168.0.0/24″のようなネットワークが重複してもルーティングテーブルが別になるのでネットワークを識別し分離できるようになります。

MP-BGP

Multi Protocol-Border Gateway Protocolの略です。
IPv4、IPv6など様々なプロトコルに対応することができ、RD/RTのタグによりルータ間でVRFを識別することが可能なBGPです。
ざっくり説明すると、RDはVPN経路を一意にするための識別子、RTはVPN経路を対向VRFと送受信するための識別子です。
MP-BGPはTCP179を利用します。

RD (Route Distinguisher)

MP-BGPに広告する経路につける識別子になります。
MP-BGPでVPN経路を広告する際に、同じIPプレフィックスがある場合でも、一意なVPNプレフィックス(VPNv4/VPNv6 NLRI)として識別できるようになります。
MP-BGPではテーブルが一つになるので、混ざらないようにNLRIの一部に含まれて下記のように広告されます。
 65000:100:192.168.1.0/24
※NLRIの説明はBGPの利用可能な経路情報を広告する技術になるので割愛します。

RT (Route Target)

VPN経路をどのVRFに配布するか、受信したVPNv4プレフィックスをどのVRFに取り込むかを決める識別子になります。
MP-BGPの拡張コミュニティ属性(Extended Community Attribute)として広告されます。
Import RT、Export RTの2種類があり、Import RTが取り込み対象のRT、Export RTが広告対象のRTになります。

LDP

MPLSラベルを交換・配布するためのプロトコルです。
隣接ルータ間でLDPネイバーを確立し、MPLSヘッダで高速転送が可能です。
PE間で利用しますが、LDPネイバー確立するためにIP到達性が必要なためOSPFなどのIGPを利用します。
LDPはTCP、UDP646を利用します。

LER

Label Edge Routerの略です。
PEルータのことで、エッジLSRとも呼ばれます。
入口でラベルを付与するLERをIngress LER(Ingress LSR)、ラベルを削除するLERをEgress LER(Egress LSR)と呼びます。

LSR

Label Switching Routerの略です。
主にPルータのことを指し、ラベルの交換、削除を行いパケットを転送するルータになります。

MPLS-VPNの仕組み

MPLS-VPNで利用するラベルは2種類あります。
MPLSを利用して配布する主要なプロトコルとして下記があります。

プロトコル説明
LDPPE間で利用するラベル配布プロトコル
MP-BGPVPN間で利用するラベル配布プロトコル

ラベルの挿入、交換、削除の流れは下記になります。
CiscoはPHP(Penultimate Hop Poping)機能がデフォルト有効のため、最後のルータの1つ前のルータでラベルが外されます。

ラベルスイッチング動作説明
InsertPEルータのIngress LSRでラベルが付与される。
SwapPルータのLSRでラベルの交換を行う。
MPLSは隣接ルータに対して有効な機能のため、宛先のラベルが違う場合は付け替えを行う。
RemovePEルータのEgress LSRでラベルを取り除く。
Untag全てのラベルを取り除く。

動作確認

CML Freeで動作確認します。
パケットトレーサではMPLSをサポートしていないため、構築できませんでした。
PE-PE間とCE-PE間のIGPはOSPFを利用します。
CML Freeは5ノードまでのためCE-PE間はVRFでネットワークを分割します。

構成

CEのVPNのOSPFエリア番号が被っていますが、MP-BGPで再配布するため問題ありません。
また、MPLS網のエリア0は別ドメインになるため、CE側のOSPFとは関係ありません。
CE間のOSPFの動作として、MP-BGPで再配布しているため、標準エリアであればLSA Type3で受信します。
※同エリア(LSA Type1)で経路を受信したい場合、MPLS網でSham linkを利用することで受信できるようになるようです。

コンフィグ

CEルータ

CEA
vrf definition GREEN
 !
 address-family ipv4
 exit-address-family
!
vrf definition RED
 !
 address-family ipv4
 exit-address-family
!
ip cef
!
interface Loopback100
 vrf forwarding RED
 ip address 172.31.101.1 255.255.255.255
!
interface Loopback200
 vrf forwarding GREEN
 ip address 172.31.100.1 255.255.255.255
!
interface Ethernet0/0
 vrf forwarding RED
 ip address 172.16.10.1 255.255.255.0
!
interface Ethernet0/1
 vrf forwarding GREEN
 ip address 10.10.10.1 255.255.255.0
!

router ospf 11 vrf RED
 capability vrf-lite
 network 172.16.10.0 0.0.0.255 area 1
 network 172.31.101.1 0.0.0.0 area 1
!
router ospf 12 vrf GREEN
 capability vrf-lite
 network 10.10.10.0 0.0.0.255 area 1
 network 172.31.100.1 0.0.0.0 area 1
!
CEB
vrf definition GREEN
 !
 address-family ipv4
 exit-address-family
!
vrf definition RED
 !
 address-family ipv4
 exit-address-family
!
ip cef
!
interface Loopback100
 vrf forwarding RED
 ip address 172.31.201.1 255.255.255.255
!
interface Loopback200
 vrf forwarding GREEN
 ip address 172.31.200.1 255.255.255.255
!
interface Ethernet0/0
 vrf forwarding RED
 ip address 172.16.20.1 255.255.255.0
!
interface Ethernet0/1
 vrf forwarding GREEN
 ip address 10.10.20.1 255.255.255.0
!
router ospf 11 vrf RED
 capability vrf-lite
 network 172.16.20.0 0.0.0.255 area 1
 network 172.31.201.1 0.0.0.0 area 1
!
router ospf 12 vrf GREEN
 capability vrf-lite
 network 10.10.20.0 0.0.0.255 area 1
 network 172.31.200.1 0.0.0.0 area 1
!

PEルータ

PEA
vrf definition GREEN
 rd 1:100
 route-target export 10:100
 route-target import 10:100
 !
 address-family ipv4
 exit-address-family
!
vrf definition RED
 rd 2:200
 route-target export 20:200
 route-target import 20:200
 !
 address-family ipv4
 exit-address-family
!
ip cef
!
interface Loopback0
 ip address 100.0.0.1 255.255.255.255
!
interface Ethernet0/0
 ip address 192.168.100.1 255.255.255.0
 mpls ip
!
interface Ethernet0/1
 vrf forwarding RED
 ip address 172.16.10.254 255.255.255.0
!
interface Ethernet0/2
 vrf forwarding GREEN
 ip address 10.10.10.254 255.255.255.0
!
interface Ethernet0/3
 no ip address
 shutdown
!
router ospf 11 vrf RED
 redistribute bgp 65000
 network 172.16.10.0 0.0.0.255 area 1
!
router ospf 12 vrf GREEN
 redistribute bgp 65000
 network 10.10.10.0 0.0.0.255 area 1
!
router ospf 1
 network 100.0.0.1 0.0.0.0 area 0
 network 192.168.100.1 0.0.0.0 area 0
!
router bgp 65000
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 100.0.0.3 remote-as 65000
 neighbor 100.0.0.3 update-source Loopback0
 !
 address-family ipv4
 exit-address-family
 !
 address-family vpnv4
  neighbor 100.0.0.3 activate
  neighbor 100.0.0.3 send-community both
 exit-address-family
 !
 address-family ipv4 vrf GREEN
  redistribute ospf 12 match internal external 1 external 2
 exit-address-family
 !
 address-family ipv4 vrf RED
  redistribute ospf 11 match internal external 1 external 2
 exit-address-family
!
PEB
vrf definition GREEN
 rd 1:100
 route-target export 10:100
 route-target import 10:100
 !
 address-family ipv4
 exit-address-family
!
vrf definition RED
 rd 2:200
 route-target export 20:200
 route-target import 20:200
 !
 address-family ipv4
 exit-address-family
!
ip cef
!
interface Loopback0
 ip address 100.0.0.3 255.255.255.255
!
interface Ethernet0/0
 ip address 192.168.200.1 255.255.255.0
 mpls ip
!
interface Ethernet0/1
 vrf forwarding RED
 ip address 172.16.20.254 255.255.255.0
!
interface Ethernet0/2
 vrf forwarding GREEN
 ip address 10.10.20.254 255.255.255.0
!

router ospf 11 vrf RED
 redistribute bgp 65000
 network 172.16.20.0 0.0.0.255 area 1
!
router ospf 12 vrf GREEN
 redistribute bgp 65000
 network 10.10.20.0 0.0.0.255 area 1
!
router ospf 1
 network 100.0.0.3 0.0.0.0 area 0
 network 192.168.200.1 0.0.0.0 area 0
!
router bgp 65000
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 100.0.0.1 remote-as 65000
 neighbor 100.0.0.1 update-source Loopback0
 !
 address-family ipv4
 exit-address-family
 !
 address-family vpnv4
  neighbor 100.0.0.1 activate
  neighbor 100.0.0.1 send-community both
 exit-address-family
 !
 address-family ipv4 vrf GREEN
  redistribute ospf 12 match internal external 1 external 2
 exit-address-family
 !
 address-family ipv4 vrf RED
  redistribute ospf 11 match internal external 1 external 2
 exit-address-family
!
mpls ldp router-id Loopback0

Pルータ

LSR
ip cef
!
interface Loopback0
 ip address 100.0.0.2 255.255.255.255
!
interface Ethernet0/0
 ip address 192.168.100.5 255.255.255.0
 mpls ip
!
interface Ethernet0/1
 ip address 192.168.200.5 255.255.255.0
 mpls ip
!
router ospf 1
 router-id 100.0.0.2
 network 100.0.0.2 0.0.0.0 area 0
 network 192.168.100.5 0.0.0.0 area 0
 network 192.168.200.5 0.0.0.0 area 0
!
mpls ldp router-id Loopback0

動作確認

CE確認

traceroute vrf [vrf名] [宛先]コマンドで、疎通とラベル番号を確認できます。

CEA#traceroute vrf RED 172.31.201.1
Type escape sequence to abort.
Tracing the route to 172.31.201.1
VRF info: (vrf in name/id, vrf out name/id)
  1 172.16.10.254 1 msec 2 msec 1 msec
  2 192.168.100.5 [MPLS: Labels 17/21 Exp 0] 4 msec 3 msec 3 msec
  3 172.16.20.254 [MPLS: Label 21 Exp 0] 2 msec 3 msec 3 msec
  4 172.16.20.1 3 msec 4 msec * 
CEA#traceroute vrf GREEN 172.31.200.1
Type escape sequence to abort.
Tracing the route to 172.31.200.1
VRF info: (vrf in name/id, vrf out name/id)
  1 10.10.10.254 2 msec 2 msec 2 msec
  2 192.168.100.5 [MPLS: Labels 17/22 Exp 0] 4 msec 3 msec 4 msec
  3 10.10.20.254 [MPLS: Label 22 Exp 0] 2 msec 2 msec 2 msec
  4 10.10.20.1 3 msec 4 msec * 
CEA#

show ip route vrf [vrf名]コマンドで、VPN経路を確認することができます。

CEA#show ip route vrf RED

Routing Table: RED
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, m - OMP
       n - NAT, Ni - NAT inside, No - NAT outside, Nd - NAT DIA
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       H - NHRP, G - NHRP registered, g - NHRP registration summary
       o - ODR, P - periodic downloaded static route, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR
       & - replicated local route overrides by connected

Gateway of last resort is not set

      172.16.0.0/16 is variably subnetted, 3 subnets, 2 masks
C        172.16.10.0/24 is directly connected, Ethernet0/0
L        172.16.10.1/32 is directly connected, Ethernet0/0
O IA     172.16.20.0/24 [110/11] via 172.16.10.254, 04:22:48, Ethernet0/0
      172.31.0.0/32 is subnetted, 2 subnets
C        172.31.101.1 is directly connected, Loopback100
O IA     172.31.201.1 [110/21] via 172.16.10.254, 04:21:46, Ethernet0/0
CEA#

PE確認

show mpls ldp bindingsコマンドで、経路とラベルの関連付けを確認できます。
Implicit NullはPHP機能が有効であればラベルを外してから転送することになります。

LER1#show mpls ldp bindings  
  lib entry: 100.0.0.1/32, rev 2
        local binding:  label: imp-null
        remote binding: lsr: 100.0.0.2:0, label: 16
  lib entry: 100.0.0.2/32, rev 8
        local binding:  label: 17
        remote binding: lsr: 100.0.0.2:0, label: imp-null
  lib entry: 100.0.0.3/32, rev 6
        local binding:  label: 16
        remote binding: lsr: 100.0.0.2:0, label: 17
  lib entry: 192.168.100.0/24, rev 4
        local binding:  label: imp-null
        remote binding: lsr: 100.0.0.2:0, label: imp-null
  lib entry: 192.168.200.0/24, rev 10
        local binding:  label: 18
        remote binding: lsr: 100.0.0.2:0, label: imp-null

show mpls forwarding-tableコマンドで、MPLSのテーブルを確認できます。

LER1#show mpls forwarding-table
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
16         Pop Label  100.0.0.2/32     0             Et0/0      192.168.100.5
17         Pop Label  192.168.200.0/24 0             Et0/0      192.168.100.5
18         17         100.0.0.3/32     0             Et0/0      192.168.100.5
19         No Label   10.10.10.0/24[V] 0             aggregate/GREEN 
20         No Label   172.31.100.1/32[V]   \
                                       0             Et0/2      10.10.10.1  
21         No Label   172.16.10.0/24[V]   \
                                       0             aggregate/RED 
22         No Label   172.31.101.1/32[V]   \
                                       0             Et0/1      172.16.10.1 

show ip bgp vpnv4 allコマンドで、MP-BGPのテーブルを確認できます。

LER1#show ip bgp vpnv4 all
BGP table version is 109, local router ID is 100.0.0.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, 
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter, 
              x best-external, a additional-path, c RIB-compressed, 
              t secondary path, L long-lived-stale,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 1:100 (default for vrf GREEN)
 *>   10.10.10.0/24    0.0.0.0                  0         32768 ?
 *>i  10.10.20.0/24    100.0.0.3                0    100      0 ?
 *>   172.31.100.1/32  10.10.10.1              11         32768 ?
 *>i  172.31.200.1/32  100.0.0.3               11    100      0 ?
Route Distinguisher: 2:200 (default for vrf RED)
 *>   172.16.10.0/24   0.0.0.0                  0         32768 ?
 *>i  172.16.20.0/24   100.0.0.3                0    100      0 ?
 *>   172.31.101.1/32  172.16.10.1             11         32768 ?
 *>i  172.31.201.1/32  100.0.0.3               11    100      0 ?
LER1#

show ip cef vrf [vrf名] [宛先]コマンドで、経路に付与されるラベルを確認することができます。

LER1#show ip cef vrf RED 172.31.201.1
172.31.201.1/32
  nexthop 192.168.100.5 Ethernet0/0 label 17-(local:16) 21
LER1#

show ip routeコマンドで、PE間のグローバルルーティングテーブルを確認できます。

LER1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, m - OMP
       n - NAT, Ni - NAT inside, No - NAT outside, Nd - NAT DIA
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       H - NHRP, G - NHRP registered, g - NHRP registration summary
       o - ODR, P - periodic downloaded static route, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR
       & - replicated local route overrides by connected

Gateway of last resort is not set

      100.0.0.0/32 is subnetted, 3 subnets
C        100.0.0.1 is directly connected, Loopback0
O        100.0.0.2 [110/11] via 192.168.100.5, 06:10:37, Ethernet0/0
O        100.0.0.3 [110/21] via 192.168.100.5, 05:03:28, Ethernet0/0
      192.168.100.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.100.0/24 is directly connected, Ethernet0/0
L        192.168.100.1/32 is directly connected, Ethernet0/0
O     192.168.200.0/24 [110/20] via 192.168.100.5, 05:03:32, Ethernet0/0
LER1#

show ip route vrf [vrf名]コマンドで、VPN経路の確認ができます。

LER1#show ip route vrf RED 

Routing Table: RED
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, m - OMP
       n - NAT, Ni - NAT inside, No - NAT outside, Nd - NAT DIA
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       H - NHRP, G - NHRP registered, g - NHRP registration summary
       o - ODR, P - periodic downloaded static route, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR
       & - replicated local route overrides by connected

Gateway of last resort is not set

      172.16.0.0/16 is variably subnetted, 3 subnets, 2 masks
C        172.16.10.0/24 is directly connected, Ethernet0/1
L        172.16.10.254/32 is directly connected, Ethernet0/1
B        172.16.20.0/24 [200/0] via 100.0.0.3, 05:02:44
      172.31.0.0/32 is subnetted, 2 subnets
O        172.31.101.1 [110/11] via 172.16.10.1, 03:39:54, Ethernet0/1
B        172.31.201.1 [200/11] via 100.0.0.3, 03:38:52
LER1#

最後に

ENARSIではMPLS-VPNが一番複雑な技術だと思います。
説明が長くなるのでかなり端折りましたが、実際には更に細かい技術が詰まっており、ラベル技術はLSP(Label Switched Path)、FEC(Forwarding Equivalence Class)を理解する必要があり、テーブルの種類(RIB、FIB、LIB、LFIB)なども抑えないといけないです。
LDP、MP-BGP以外にラベルプロトコルでRSVP、TDPがあるらしくまだ抑えきれていないです。
普段触らない領域なので、コア試験よりも難しいと言われているのがよくわかりました。