[Multi-AS Segment Routing 検証連載 #1] SR-MPLS L3VPN in Single-AS

サマリ

  • 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)を提供しています。

  1. PE1 は顧客 A からパケットが送られた際、顧客 A を示す VPN ラベル(SID: 24001)を付与するとともに、事前に定義した SR Policy に従い、 P1 → P2 → PE2 という経路を示す TE ラベルとなる Segment List (16004/16003)を付与し、 P1 へと転送します。
  2. P1 は パケットに付与された Segment List の先頭要素(Active Segment)を参照し、処理します。ここでは P2 を示す SID(16004)が付与されているため、ラベルを Pop することで Active Segment を進めるとともに、 P2 へと転送します。
  3. P2 は Active Segment を参照し、 Active Segment を進めると共に、 PE2 へとパケットを転送します。
  4. 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 の経路学習と転送動作を確認します。

  1. BGP から受信した経路を確認
  2. 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 の応用的な技術まで解説していますので、併せてご覧ください。

© NTT Communications Corporation All Rights Reserved.