サマリ
- Single-AS なネットワークにおいて、 SR-MPLS + VPNv4 による L3VPN を実現
- IOS XR + Junos の Multi-vendor 環境で動作検証に成功
この記事は Multi-AS Segment Routing 検証連載の1つです。目次は こちら
概要
イノベーションセンターの三島です。普段の業務では Multi-AS Segment Routing に関する control plane/data plane の技術検証や、運用効率化のためのコントローラー開発などを行なっています。
本記事では SR-MPLS を用いた L3VPN の Multi-vendor 環境における検証例を、サンプルトポロジーやコンフィグ例を添えながら紹介します。 今回の記事ではまず Single-AS での L3VPN 検証結果を紹介し、 Multi-AS 構成については次回以降の記事で扱っていきます。
L3VPN とは
L3VPN とは、複数のネットワーク同士をレイヤー3で接続する仮想的な専用回線を構築する技術です。
こちらの図に L3VPN の概要を示しました。 この例では、 A、B の2種類の顧客を1つのコア網に収容しています。 VPN は仮想的な専用回線であり、図の通り同一の顧客同士は通信可能にしつつ、異なる顧客同士は通信不可になるよう構成します。 L3VPN は レイヤー3 での IP の相互接続を担保する VPN であり、異なる拠点同士は別の Prefix で構成します。
L3VPN には、顧客を VRF 単位で識別する per-VRF L3VPN と、 CE 単位で識別する per-CE L3VPN があります。
VRF とは、1つのルーターを複数のルーティング面に多重化する技術です。 per-VRF L3VPN は、複数の顧客を各々の VRF で分離し識別する方式です。 一方、 per-CE L3VPN では顧客の CE ルーターを単一の default-VRF に収容し、 nexthop で識別する方式です。
今回の検証では、顧客側に専用のゲートウェイとなる CE ルーターが不要となる利点や、 VRF 単位で経路表を分離できる利点を考慮し、 per-VRF L3VPN を扱います。
ある PE における、収容対象のセグメント、当該 PE のアドレス、顧客識別子、その他メタデータの組などの L3VPN の情報は MP-BGP の VPNv4/VPNv6 で伝達します。 VRF の識別子を Route Distinguisher(RD)、経路の識別子を Route Target(RT)と呼び、これらの組み合わせで収容する顧客を識別します。
Segment Routing とは
Segment Routing(SR)とは、RFC8402で標準化された次世代の経路制御技術です。
SR では転送対象や処理を Segment と呼ばれる単位で扱い、ソースルーティングのパラダイムに基づき転送します。 ソースルーティングとは、現在最も一般的であるパケットの宛先アドレスを基にした転送先決定ではなく、送信元があらかじめパケットに埋め込んだ情報によって転送先を決定するルーティング手法です。 各パケットに Segment ID(SID)のリストである Segment List を付与することで、そのパケットに対する網内での経路や処理などを指定します。
こちらの図に SR-MPLS による転送例を示しました。この例では顧客 A、B の通信に対して VPN を提供するとともに、 PE1 → P1 → P2 → PE2 となるような Traffic Engineering(TE)を提供しています。
- PE1 は顧客 A からパケットが送られた際、顧客 A を示す VPN ラベル(SID: 24001)を付与するとともに、事前に定義した SR Policy に従い、 P1 → P2 → PE2 という経路を示す TE ラベルとなる Segment List (16004/16003)を付与し、 P1 へと転送します。
- P1 は パケットに付与された Segment List の先頭要素(Active Segment)を参照し、処理します。ここでは P2 を示す SID(16004)が付与されているため、ラベルを Pop することで Active Segment を進めるとともに、 P2 へと転送します。
- P2 は Active Segment を参照し、 Active Segment を進めると共に、 PE2 へとパケットを転送します。
- PE2 は Active Segment を参照し、 Segment が示す L3VPN 動作を実施し、顧客 A へとパケットを転送します。
これらの動作により、本記事の目的である VPN が実現できます。 また、送信元 PE が付与する Segment List を変更することにより、柔軟に経路を変更する TE も実現可能となります。
このように、 SR では Segment List に格納された SID により、 TE や VPN など様々な動作を実現できます。
検証例の紹介
ここまでの話で、 SR による TE や VPN の実現手法について説明しました。 以降は L3VPN の検証例を実際のコンフィグ例を添えつつ紹介します。
サンプルトポロジー&想定するユースケース
検証のため、下記のようなトポロジーを作成します。
4つのルーターからなる SR domain をコア網として構成し、顧客 A、B を収容します。
検証環境は Multi-vendor に構成します。使用する機器は下記の通りです。
- PE1、P1: Cisco IOS XR 7.4.1
- PE2、P2: Junos OS 21.3R1.9
基本設定
ここからは機器設定と動作確認を行います。 基本的なインターフェース設定等は既に実施されているものとし、 SR の SID を広告する IS-IS と、 L3VPN を実現する BGP VPNv4 の設定・動作確認を実施します。
IS-IS - 設定
IS-IS の SR 拡張を利用し、 SR-MPLS の SID 情報を広告します。 また、運用効率化のため MPLS OAM の設定もしておきます。
IOS XR
router isis 1 is-type level-2-only net 49.0000.0000.0aff.0001.00 segment-routing global-block 16000 23999 address-family ipv4 unicast metric-style wide segment-routing mpls ! interface Loopback0 address-family ipv4 unicast prefix-sid index 0 ! ! interface GigabitEthernet0/0/0/0 point-to-point address-family ipv4 unicast ! ! interface GigabitEthernet0/0/0/1 point-to-point address-family ipv4 unicast ! ! ! mpls oam ! segment-routing
Junos
set protocols isis interface ge-0/0/0.0 level 2 metric 10 set protocols isis interface ge-0/0/0.0 point-to-point set protocols isis interface ge-0/0/1.0 level 2 metric 10 set protocols isis interface ge-0/0/1.0 point-to-point set protocols isis interface lo0.0 passive set protocols isis source-packet-routing srgb start-label 16000 set protocols isis source-packet-routing srgb index-range 8000 set protocols isis source-packet-routing node-segment ipv4-index 2 set protocols isis level 1 disable set protocols isis level 2 wide-metrics-only set protocols mpls icmp-tunneling set protocols mpls interface ge-0/0/0.0 set protocols mpls interface ge-0/0/1.0 set interfaces ge-0/0/0 unit 0 family inet address 10.0.2.2/30 set interfaces ge-0/0/0 unit 0 family iso set interfaces ge-0/0/0 unit 0 family mpls set interfaces ge-0/0/1 unit 0 family inet address 10.0.3.2/30 set interfaces ge-0/0/1 unit 0 family iso set interfaces ge-0/0/1 unit 0 family mpls set interfaces lo0 unit 0 family inet address 10.255.0.3/32 set interfaces lo0 unit 0 family iso address 49.0000.0000.0aff.0003.00
SR Global Block(SRGB)の変更後は再起動が必要です。
IS-IS - 動作確認
IS-IS ネイバーの状態と SID Table を確認します。
IOS XR
RP/0/RP0/CPU0:pe01#show isis neighbors Mon Jun 6 18:48:40.985 JST IS-IS 1 neighbors: System Id Interface SNPA State Holdtime Type IETF-NSF p01 Gi0/0/0/0 *PtoP* Up 22 L2 Capable p02 Gi0/0/0/1 *PtoP* Up 21 L2 Capable Total neighbor count: 2 RP/0/RP0/CPU0:pe01#show mpls forwarding Mon Jun 6 18:53:26.322 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 16001 Pop SR Pfx (idx 1) Gi0/0/0/0 10.0.0.2 2529 16002 16002 SR Pfx (idx 2) Gi0/0/0/0 10.0.0.2 5446 16002 SR Pfx (idx 2) Gi0/0/0/1 10.0.1.2 0 16003 Pop SR Pfx (idx 3) Gi0/0/0/1 10.0.1.2 5366 24000 Pop SR Adj (idx 1) Gi0/0/0/1 10.0.1.2 0 24001 Pop SR Adj (idx 3) Gi0/0/0/1 10.0.1.2 0 24002 Pop SR Adj (idx 1) Gi0/0/0/0 10.0.0.2 0 24003 Pop SR Adj (idx 3) Gi0/0/0/0 10.0.0.2 0
Junos
user@pe02> show isis adjacency Interface System L State Hold (secs) SNPA ge-0/0/0.0 p01 2 Up 25 ge-0/0/1.0 p02 2 Up 24 user@pe02> show route protocol isis table mpls.0 mpls.0: 15 destinations, 15 routes (15 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 16 *[L-ISIS/14] 07:36:19, metric 0 > to 10.0.3.1 via ge-0/0/1.0, Pop 16(S=0) *[L-ISIS/14] 07:36:19, metric 0 > to 10.0.3.1 via ge-0/0/1.0, Pop 17 *[L-ISIS/14] 00:22:25, metric 0 > to 10.0.2.1 via ge-0/0/0.0, Pop 17(S=0) *[L-ISIS/14] 00:22:25, metric 0 > to 10.0.2.1 via ge-0/0/0.0, Pop 16000 *[L-ISIS/14] 00:21:54, metric 30 to 10.0.2.1 via ge-0/0/0.0, Swap 16000 > to 10.0.3.1 via ge-0/0/1.0, Swap 16000 16001 *[L-ISIS/14] 00:22:07, metric 20 > to 10.0.2.1 via ge-0/0/0.0, Pop 16001(S=0) *[L-ISIS/14] 00:22:07, metric 20 > to 10.0.2.1 via ge-0/0/0.0, Pop 16003 *[L-ISIS/14] 07:36:19, metric 10 > to 10.0.3.1 via ge-0/0/1.0, Pop 16003(S=0) *[L-ISIS/14] 07:36:19, metric 10 > to 10.0.3.1 via ge-0/0/1.0, Pop
これらの結果より、 IOS XR、Junos 共に LinkState が正しく広告され、 SID Table が生成されたことが確認できました。
VRF、MP-BGP VPNv4 - 機器設定
顧客 A、B の VRF 設定と、経路を広告する MP-BGP L3VPN を設定します。
VPN の各パラメータは下記の通りです。
- AS 番号: 65000
- VRF 100:
- RD/RT 65000:100
- VRF 200:
- RD/RT 65000:200
IOS XR
vrf 100 rd 65000:100 address-family ipv4 unicast import route-target 65000:100 ! export route-target 65000:100 ! ! ! vrf 200 rd 65000:200 address-family ipv4 unicast import route-target 65000:200 ! export route-target 65000:200 ! ! ! interface GigabitEthernet0/0/0/2 vrf 100 ipv4 address 192.168.0.254 255.255.255.0 ! interface GigabitEthernet0/0/0/3 vrf 200 ipv4 address 192.168.0.254 255.255.255.0 ! router bgp 65000 bgp router-id 10.255.0.1 address-family vpnv4 unicast ! neighbor-group ibgp remote-as 65000 update-source Loopback0 address-family vpnv4 unicast ! ! neighbor 10.255.0.2 use neighbor-group ibgp ! neighbor 10.255.0.3 use neighbor-group ibgp ! neighbor 10.255.0.4 use neighbor-group ibgp ! vrf 100 rd 65000:100 address-family ipv4 unicast label mode per-vrf redistribute connected ! ! vrf 200 rd 65000:200 address-family ipv4 unicast label mode per-vrf redistribute connected ! ! !
Junos
set policy-options policy-statement EXPORT-POLICY-100 term ROUTE-TARGET then community add VRF100-65000-RT set policy-options policy-statement EXPORT-POLICY-100 term REDIST-DIRECT from protocol direct set policy-options policy-statement EXPORT-POLICY-100 term REDIST-DIRECT then accept set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65000 from community VRF100-65000-RT set policy-options policy-statement IMPORT-POLICY-100 term ROUTE-TARGET-65000 then accept set policy-options community VRF100-65000-RT members target:65000:100 set policy-options policy-statement EXPORT-POLICY-200 term ROUTE-TARGET then community add VRF200-65000-RT set policy-options policy-statement EXPORT-POLICY-200 term REDIST-DIRECT from protocol direct set policy-options policy-statement EXPORT-POLICY-200 term REDIST-DIRECT then accept set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65000 from community VRF200-65000-RT set policy-options policy-statement IMPORT-POLICY-200 term ROUTE-TARGET-65000 then accept set policy-options community VRF200-65000-RT members target:65000:200 set routing-instances 100 instance-type vrf set routing-instances 100 protocols bgp family inet unicast set routing-instances 100 interface ge-0/0/2.0 set interface ge-0/0/2 unit 0 family inet address 192.168.1.254/24 set routing-instances 100 route-distinguisher 65000:100 set routing-instances 100 vrf-import IMPORT-POLICY-100 set routing-instances 100 vrf-export EXPORT-POLICY-100 set routing-instances 100 vrf-table-label set routing-instances 200 instance-type vrf set routing-instances 200 protocols bgp family inet unicast set routing-instances 200 interface ge-0/0/3.0 set interface ge-0/0/3 unit 0 family inet address 192.168.1.254/24 set routing-instances 200 route-distinguisher 65000:200 set routing-instances 200 vrf-import IMPORT-POLICY-200 set routing-instances 200 vrf-export EXPORT-POLICY-200 set routing-instances 200 vrf-table-label set routing-options router-id 10.255.0.3 set routing-options autonomous-system 65000 set protocols bgp family inet-vpn unicast set protocols bgp group ibgp type internal set protocols bgp group ibgp local-address 10.255.0.3 set protocols bgp group ibgp neighbor 10.255.0.1
MP-BGP VPNv4 - 動作確認
下記2ステップで L3VPN の経路学習と転送動作を確認します。
- BGP から受信した経路を確認
- traceroute + MPLS OAM による Segment List の確認
IOS XR → Junos
Junos 側の VPN ラベルを確認します。
mpls.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden) 18 (1 entry, 1 announced) *VPN Preference: 0 Next hop type: Router, Next hop index: 638 Address: 0x704e02c Next-hop reference count: 2 Next hop: via lsi.0 (100), selected Label operation: Pop Load balance label: None; Label element ptr: 0x780ffb0 Label parent element ptr: 0x0 Label element references: 2 Label element child references: 0 Label element lsp id: 0 Session Id: 0x143 State: <Active Int Ext LsiL3> Age: 51:18 Validation State: unverified Task: RT Announcement bits (2): 1-KRT 3-Resolve tree 3 AS path: I Ref Cnt: 0 (Stale Peers: 16104) Stale - Will time out in -32224 seconds Thread: junos-main user@pe02> show route table mpls.0 label 19 detail mpls.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden) 19 (1 entry, 1 announced) *VPN Preference: 0 Next hop type: Router, Next hop index: 628 Address: 0x704def4 Next-hop reference count: 2 Next hop: via lsi.1 (200), selected Label operation: Pop Load balance label: None; Label element ptr: 0x780ffb0 Label parent element ptr: 0x0 Label element references: 2 Label element child references: 0 Label element lsp id: 0 Session Id: 0x142 State: <Active Int Ext LsiL3> Age: 51:24 Validation State: unverified Task: RT Announcement bits (2): 1-KRT 3-Resolve tree 3 AS path: I Ref Cnt: 0 (Stale Peers: 16104) Stale - Will time out in -32228 seconds Thread: junos-main
ラベル 18 が VRF 100(顧客 A)、19が VRF 200(顧客 B)に対応する VPN ラベルであることが確認できます。
IOS XR が受信した経路と、 traceroute の結果を確認します。
RP/0/RP0/CPU0:pe01#show route vrf 100 Mon Jun 6 19:13:33.372 JST Codes: C - connected, S - static, R - RIP, B - BGP, (>) - Diversion path 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, E - EGP i - ISIS, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, su - IS-IS summary null, * - candidate default U - per-user static route, o - ODR, L - local, G - DAGR, l - LISP A - access/subscriber, a - Application route M - mobile route, r - RPL, t - Traffic Engineering, (!) - FRR Backup path Gateway of last resort is not set C 192.168.0.0/24 is directly connected, 00:44:47, GigabitEthernet0/0/0/2 L 192.168.0.254/32 is directly connected, 00:44:47, GigabitEthernet0/0/0/2 B 192.168.1.0/24 [200/0] via 10.255.0.3 (nexthop in vrf default), 00:02:06 RP/0/RP0/CPU0:pe01#traceroute 192.168.1.254 vrf 100 Mon Jun 6 19:14:06.584 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.0.0.2 [MPLS: Labels 16002/18 Exp 0] 54 msec 4 msec 14 msec 2 192.168.1.254 4 msec 5 msec 2 msec RP/0/RP0/CPU0:pe01#traceroute 192.168.1.254 vrf 200 Mon Jun 6 19:15:22.568 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.0.1.2 [MPLS: Labels 16002/19 Exp 0] 7 msec 10.0.0.2 15 msec 17 msec 2 192.168.1.254 3 msec 9 msec 3 msec
Junos → IOS XR
IOS XR 側の VPN ラベルを確認します。
RP/0/RP0/CPU0:pe01#show mpls forwarding labels 24004 detail Mon Jun 6 19:52:54.388 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 24004 Aggregate 100: Per-VRF Aggr[V] \ 100 2576 Updated: Jun 6 18:30:03.767 Label Stack (Top -> Bottom): { } MAC/Encaps: 0/0, MTU: 0 Packets Switched: 23 RP/0/RP0/CPU0:pe01#show mpls forwarding labels 24005 detail Mon Jun 6 19:53:02.618 JST Local Outgoing Prefix Outgoing Next Hop Bytes Label Label or ID Interface Switched ------ ----------- ------------------ ------------ --------------- ------------ 24005 Aggregate 200: Per-VRF Aggr[V] \ 200 2076 Updated: Jun 6 18:30:03.768 Label Stack (Top -> Bottom): { } MAC/Encaps: 0/0, MTU: 0 Packets Switched: 18
ラベル 24004 が VRF 100(顧客 A)、24005が VRF 200(顧客 B)に対応する VPN ラベルであることが確認できます。
Junos が受信した経路と、 traceroute の結果を確認します。
user@pe02> show route advertising-protocol bgp 10.255.0.1 100.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) Prefix Nexthop MED Lclpref AS path * 192.168.1.0/24 Self 100 I 200.inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden) Prefix Nexthop MED Lclpref AS path * 192.168.1.0/24 Self 100 I user@pe02> show route receive-protocol bgp 10.255.0.1 table bgp.l3vpn.0 bgp.l3vpn.0: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden) Prefix Nexthop MED Lclpref AS path 65000:100:192.168.0.0/24 * 10.255.0.1 0 100 ? 65000:200:192.168.0.0/24 * 10.255.0.1 0 100 ? user@pe02> traceroute 192.168.0.254 routing-instance 100 traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 10.0.3.1 (10.0.3.1) 3.768 ms 1.947 ms 2.121 ms MPLS Label=16000 CoS=0 TTL=1 S=0 MPLS Label=24004 CoS=0 TTL=1 S=1 2 10.0.1.1 (10.0.1.1) 23.648 ms * 3.814 ms user@pe02> traceroute 192.168.0.254 routing-instance 200 traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 10.0.3.1 (10.0.3.1) 6.866 ms 3.196 ms 9.220 ms MPLS Label=16000 CoS=0 TTL=1 S=0 MPLS Label=24005 CoS=0 TTL=1 S=1 2 10.0.1.1 (10.0.1.1) 7.612 ms * 12.066 ms
これにより、目的であった Multi-vendor 環境における L3VPN を実現できました!
まとめ
本記事では、 L3VPN や SR の概要を紹介するとともに、 Multi-vendor 環境における Single-AS での L3VPN の検証結果を紹介しました。
次回の記事では、我々がメインターゲットとして取り組んでいる、 Multi-AS での L3VPN について紹介します。
(2022/06/27 追記) 公開しました:[Multi-AS Segment Routing 検証連載 #2] SR-MPLS L3VPN in Multi-AS
参考資料
Segment Routing 関連技術の解説資料を Segment Routing 入門 として公開しています。
TE、VPN 双方の基礎知識から SR の応用的な技術まで解説していますので、併せてご覧ください。