さて、今回はvJunos-routerでSegment Routingを検証してみます。
Segment Routingと言っても、MPLS Labelを使った「SR-MPLS」とIPv6拡張ヘッダーを使った「SRv6」の2種類あります。
今回はSR-MPLSの方のSegment Routingをしてみたいと思います。
この記事では、主に設定と確認に着目して検証するので、Segment RoutingやSR-MPLSの詳しい概要や用語の説明はしません。
NTTコミュニケーションズさんのプレゼンに詳しく書いてあるので、そちらをご覧ください。
今回、初めてSR-MPLSを検証するので、細かく確認をしていきたいと思います。
1. SR-MPLS 構成
まずTopology(物理構成とIP Addressing)を考えます。
TopologyはL2VPN/L3VPNなCE-PE-P-PE-CE構成を作ります。
ただ、1本でCE間がつながった物理接続も面白くないので以下のようにしました。

一応、IP Addressも記載していますが、Label Switchingでパケット転送するので、あんまり意味はないかも…。
なお、疑似SP(Service Provider)網内のIGPはIS-ISを使います(OSPFに比べて新機能の実装が早い=Bugが少なそうってことで)
先ほどのTopologyに書き加えると以下の感じです。

2. SR-MPLS 設定
では、設定投入をしていきます。
まず、疑似SP網内のvJR-01~vJR-06にてお互いのLoopback Addressを学習するため、各ルーターでIS-ISを動かします。
一例としてvJR-01の設定だけ載せときます。
//vJR-01 set interfaces ge-0/0/1 unit 0 family iso set interfaces ge-0/0/2 unit 0 family iso set interfaces lo0 unit 0 family iso address 49.0001.0000.0000.0001.00 set protocols isis interface ge-0/0/1.0 level 1 disable set protocols isis interface ge-0/0/2.0 level 1 disable set protocols isis interface lo0.0 passive set protocols isis level 2 wide-metrics-only
他のルーターではLo0.0のNSAP Addressを変えるのと、動かしたいインターフェイスを追加するくらいでほぼコピペでOKです。
続いてMPLSの設定をします。
各インターフェイスでMPLSを有効にするだけです。LDPやRSVPの設定は必要ありません。
こちらも一例としてvJR-01の設定だけ載せときます。
//vJR-01 set interfaces ge-0/0/1 unit 0 family mpls set interfaces ge-0/0/2 unit 0 family mpls set protocols mpls interface ge-0/0/1.0 set protocols mpls interface ge-0/0/2.0
次に、vJR-01とvJR-06間でCEネットワーク(111.111.111.0/24、221.221.221.0/24、222.222.222.0/24)の経路情報を交換するためにBGP Peeringを行います。

//vJR-01 set routing-options autonomous-system 101 set policy-options policy-statement EXPORT_BGP_R6 term 0011 from protocol direct set policy-options policy-statement EXPORT_BGP_R6 term 0011 from route-filter 111.111.111.0/24 exact set policy-options policy-statement EXPORT_BGP_R6 term 0011 then accept set policy-options policy-statement EXPORT_BGP_R6 term 9991 then reject set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 1.1.1.1 set protocols bgp group INTERNAL neighbor 6.6.6.6 export EXPORT_BGP_R6
//vJR-06 set routing-options autonomous-system 101 set policy-options policy-statement EXPORT_BGP_R1 term 0011 from protocol direct set policy-options policy-statement EXPORT_BGP_R1 term 0011 from route-filter 221.221.221.0/24 exact set policy-options policy-statement EXPORT_BGP_R1 term 0011 then accept set policy-options policy-statement EXPORT_BGP_R1 term 0021 from protocol direct set policy-options policy-statement EXPORT_BGP_R1 term 0021 from route-filter 222.222.222.0/24 exact set policy-options policy-statement EXPORT_BGP_R1 term 0021 then accept set policy-options policy-statement EXPORT_BGP_R1 term 9991 then reject set protocols bgp group INTERNAL type internal set protocols bgp group INTERNAL local-address 6.6.6.6 set protocols bgp group INTERNAL neighbor 1.1.1.1 export EXPORT_BGP_R1
なお、CE間の通信を行う際、vJR-02~vJR-05はLabel Switchingにてパケット転送するのでCEネットワークの経路情報を学習する必要はありません。
ここからいよいよSR-MPLSの設定をしていきます。
まず、SR-MPLSを利用するためにEnhanced IP Network Services-modeを有効にします。
//vJR-01 ~ vJR-06 set chassis network-services enhanced-ip
この設定をcommitした後、いったんルーターの再起動が必要になります。
//vJR-01 ~ vJR-06 run request system reboot yes
次に、各ルーターにてSRGB(Segment Routingで使うLabelの範囲)を定義します。
今回はキリよく10000から5000のレンジで定義します(Labelの範囲は10000~14999)
//vJR-01 ~ vJR-06 set protocols isis source-packet-routing srgb start-label 10000 set protocols isis source-packet-routing srgb index-range 5000
続いて各ルーターの(IPv4の)Index値を定義します。
今回は40xで採番します。
SRGBは10000起番なので、Node SIDは+10000足された値になります。
| ルーター名 | IPv4 Index | Node SID |
|---|---|---|
| vJR-01 | 401 | 10401 |
| vJR-02 | 402 | 10402 |
| vJR-03 | 403 | 10403 |
| vJR-04 | 404 | 10404 |
| vJR-05 | 405 | 10405 |
| vJR-06 | 406 | 10406 |
//vJR-01 set protocols isis source-packet-routing node-segment ipv4-index 401
//vJR-02 set protocols isis source-packet-routing node-segment ipv4-index 402
//vJR-03 set protocols isis source-packet-routing node-segment ipv4-index 403
//vJR-04 set protocols isis source-packet-routing node-segment ipv4-index 404
//vJR-05 set protocols isis source-packet-routing node-segment ipv4-index 405
//vJR-06 set protocols isis source-packet-routing node-segment ipv4-index 406
最後にTraffic Engineering(Static LSP)の設定を行います。
今回はCE間(vJR-11からvJR-21 or vJR-22への通信で)vJR-01からvJR-06へパケット転送する際、vJR-01→vJR-03→vJR-05→vJR-04→vJR-06を通るようなPathを定義します。
Topologyに通信フローを書き加えるとこんな感じです。

//vJR-01 set protocols source-packet-routing segment-list TO-R6-PRIMARY HOP02 label 10405 set protocols source-packet-routing segment-list TO-R6-PRIMARY HOP03 label 10404 set protocols source-packet-routing segment-list TO-R6-PRIMARY HOP04 label 10406 set protocols source-packet-routing source-routing-path TO-R6 to 6.6.6.6 set protocols source-packet-routing source-routing-path TO-R6 primary TO-R6-PRIMARY
以上で設定は完了です。
3. SR-MPLS 確認
動作確認を行います。
尺の都合でvJR-01のみ中心に確認します。
まず、さらっとIS-ISとBGPの経路学習の確認をします。
//vJR-01
lab@vJR-01# run show route protocol isis
inet.0: 20 destinations, 20 routes (20 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
2.2.2.2/32 *[IS-IS/18] 00:10:04, metric 10
> to 12.12.12.2 via ge-0/0/1.0
3.3.3.3/32 *[IS-IS/18] 00:09:38, metric 10
> to 13.13.13.3 via ge-0/0/2.0
4.4.4.4/32 *[IS-IS/18] 00:09:41, metric 20
> to 12.12.12.2 via ge-0/0/1.0
5.5.5.5/32 *[IS-IS/18] 00:09:16, metric 20
> to 13.13.13.3 via ge-0/0/2.0
6.6.6.6/32 *[IS-IS/18] 00:09:10, metric 30
> to 12.12.12.2 via ge-0/0/1.0
to 13.13.13.3 via ge-0/0/2.0
<snip>
lab@vJR-01# run show bgp summary
Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 1 Peers: 1 Down peers: 0
Table Tot Paths Act Paths Suppressed History Damp State Pending
inet.0
2 2 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
6.6.6.6 101 30 28 0 0 11:28 Establ
inet.0: 2/2/2/0
<snip>
lab@vJR-01# run show route protocol bgp
inet.0: 20 destinations, 20 routes (20 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
221.221.221.0/24 *[BGP/170] 00:09:36, localpref 100, from 6.6.6.6
AS path: I, validation-state: unverified
> to 13.13.13.3 via ge-0/0/2.0, Push 10406, Push 10404, Push 10405(top)
222.222.222.0/24 *[BGP/170] 00:09:36, localpref 100, from 6.6.6.6
AS path: I, validation-state: unverified
> to 13.13.13.3 via ge-0/0/2.0, Push 10406, Push 10404, Push 10405(top)
<snip>IS-ISでLoopback Addressの経路交換とBGPでCEネットワークの経路交換ができてます。
(BGPの経路情報は若干ネタバレな表示となってますが後ほど説明します…)
次にSR-MPLSの確認をしていきます。
まず、SRGBのレンジを確認します。
//vJR-01 lab@vJR-01# run show mpls label usage Label space Total Available Applications LSI 994984 994982 (100.00%) BGP/LDP VPLS with no-tunnel-services, BGP L3VPN with vrf-table-label Block 994984 994982 (100.00%) BGP/LDP VPLS with tunnel-services, BGP L2VPN Dynamic 9994984 994982 (100.00%) RSVP, LDP, PW, L3VPN, RSVP-P2MP, LDP-P2MP, MVPN, EVPN, BGP, SPRING-TE Static 48576 48576 (100.00%) Static LSP, Static PW Effective Ranges Range name Shared with Start End Dynamic 16 9999 Dynamic 15000 999999 Static 1000000 1048575 SRGB 10000 14999 ISIS Configured Ranges Range name Shared with Start End Dynamic 16 9999 Dynamic 15000 999999 Static 1000000 1048575 SRGB 10000 14999 ISIS
「SRGB」の行に設定通り10000~14999が割り当てれることが確認できます。
次にIS-ISのステータスを確認します。
//vJR-01
lab@vJR-01# run show isis overview | no-more
<snip>
Source Packet Routing (SPRING): Enabled
SRGB Config Range :
SRGB Start-Label : 10000, SRGB Index-Range : 5000
SRGB Block Allocation: Success
SRGB Start Index : 10000, SRGB Size : 5000, Label-Range: [ 10000, 14999 ]
Node Segments: Enabled
Ipv4 Index : 401
SRv6: Disabled
Post Convergence Backup: DisabledSPRING(≒ SR-MPLS)が有効になっていることが確認できます。また、ここでも設定したSRGBのレンジが確認できます。
続いてIS-ISのネイバー状態を確認します。
//vJR-01 lab@vJR-01# run show isis adjacency extensive vJR-02 Interface: ge-0/0/1.0, Level: 2, State: Up, Expires in 8 secs Priority: 64, Up/Down transitions: 1, Last transition: 00:20:20 ago Circuit type: 2, Speaks: IP, IPv6, MAC address: 50:1:0:2:0:1 Topologies: Unicast Restart capable: Yes, Adjacency advertisement: Advertise LAN id: vJR-02.02, IP addresses: 12.12.12.2 Level 2 IPv4 Adj-SID: 16 Transition log: When State Event Down reason Sun May 4 03:59:25 Up Seenself vJR-03 Interface: ge-0/0/2.0, Level: 2, State: Up, Expires in 6 secs Priority: 64, Up/Down transitions: 1, Last transition: 00:19:53 ago Circuit type: 2, Speaks: IP, IPv6, MAC address: 50:1:0:3:0:1 Topologies: Unicast Restart capable: Yes, Adjacency advertisement: Advertise LAN id: vJR-03.02, IP addresses: 13.13.13.3 Level 2 IPv4 Adj-SID: 17 Transition log: When State Event Down reason Sun May 4 03:59:51 Up Seenself
ネイバー毎にAdj-SID(Adjacency SID)が生成されてるのが確認できますね。
続いてIS-IS Link-state Databaseを確認します。
めっちゃ出力行数があるので、一例でvJR-02の情報のみ確認します。
//vJR-01
lab@vJR-01# run show isis database extensive
<snip>
vJR-02.00-00 Sequence: 0x9, Checksum: 0xa327, Lifetime: 988 secs
IPV4 Index: 402
Node Segment Blocks Advertised:
Start Index : 0, Size : 5000, Label-Range: [ 10000, 14999 ]
IS neighbor: vJR-02.02 Metric: 10
Two-way fragment: vJR-02.02-00, Two-way first fragment: vJR-02.02-00
LAN IPv4 Adj-SID: 16, Weight: 0, Neighbor: vJR-01, Flags: --VL--
IS neighbor: vJR-03.03 Metric: 10
Two-way fragment: vJR-03.03-00, Two-way first fragment: vJR-03.03-00
LAN IPv4 Adj-SID: 18, Weight: 0, Neighbor: vJR-03, Flags: --VL--
IS neighbor: vJR-04.02 Metric: 10
Two-way fragment: vJR-04.02-00, Two-way first fragment: vJR-04.02-00
LAN IPv4 Adj-SID: 17, Weight: 0, Neighbor: vJR-04, Flags: --VL--
IP prefix: 2.2.2.2/32 Metric: 0 Internal Up
IP prefix: 12.12.12.0/24 Metric: 10 Internal Up
IP prefix: 23.23.23.0/24 Metric: 10 Internal Up
IP prefix: 24.24.24.0/24 Metric: 10 Internal Up
<snip>vJR-02のIndex値やAdj-SIDが確認できます(このコマンドでvJR-01~vJR-06の情報が確認できます)
続いてTraffic Engineeringの設定の確認をします。
//vJR-01 lab@vJR-01# run show spring-traffic-engineering lsp To State LSPname 6.6.6.6 Up TO-R6
設定したsource-routing-path「TO-R6」が適用できていることが確認できます。
なお、routeオプションで設定したSegment-Listも確認できます。
//vJR-01 lab@vJR-01# run show spring-traffic-engineering route To Source SR Override Pref/Pref LSP Name Segment Lists 6.6.6.6 Static configuration 100 / 100 TO-R6 TO-R6-PRIMARY
続いて、Routing Tableを確認していきます。
まず、inet.3(MPLSで学習した経路情報。BGP Protocol next hop解決の際にLookupされる)を確認します。
//vJR-01
lab@vJR-01# run show route table inet.3
inet.3: 5 destinations, 6 routes (5 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
2.2.2.2/32 *[L-ISIS/14] 00:25:11, metric 10
> to 12.12.12.2 via ge-0/0/1.0
3.3.3.3/32 *[L-ISIS/14] 00:24:44, metric 10
> to 13.13.13.3 via ge-0/0/2.0
4.4.4.4/32 *[L-ISIS/14] 00:24:46, metric 20
> to 12.12.12.2 via ge-0/0/1.0, Push 10404
5.5.5.5/32 *[L-ISIS/14] 00:24:12, metric 20
> to 13.13.13.3 via ge-0/0/2.0, Push 10405
6.6.6.6/32 *[SPRING-TE/8] 00:24:12, metric 1, metric2 30
> to 13.13.13.3 via ge-0/0/2.0, Push 10406, Push 10404, Push 10405(top)
[L-ISIS/14] 00:24:09, metric 30
> to 12.12.12.2 via ge-0/0/1.0, Push 10406
to 13.13.13.3 via ge-0/0/2.0, Push 10406各Loopback Addressについて、L-IS-IS(Labeled IS-IS)にて経路情報を学習しています。
また、vJR-06(6.6.6.6)宛はTraffic Engineeringの設定の通り、SPRING-TEのEntryが追加されています。
続いて、mpls.0(MPLSでLabel Switchingする際のRouting Table)を確認します。
//vJR-01
lab@vJR-01# run show route table mpls.0 | no-more
mpls.0: 17 destinations, 17 routes (17 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
0 *[MPLS/0] 00:26:47, metric 1
to table inet.0
0(S=0) *[MPLS/0] 00:26:47, metric 1
to table mpls.0
1 *[MPLS/0] 00:26:47, metric 1
Receive
2 *[MPLS/0] 00:26:47, metric 1
to table inet6.0
2(S=0) *[MPLS/0] 00:26:47, metric 1
to table mpls.0
13 *[MPLS/0] 00:26:47, metric 1
Receive
16 *[L-ISIS/14] 00:26:15, metric 0
> to 12.12.12.2 via ge-0/0/1.0, Pop
16(S=0) *[L-ISIS/14] 00:26:15, metric 0
> to 12.12.12.2 via ge-0/0/1.0, Pop
17 *[L-ISIS/14] 00:25:48, metric 0
> to 13.13.13.3 via ge-0/0/2.0, Pop
17(S=0) *[L-ISIS/14] 00:25:48, metric 0
> to 13.13.13.3 via ge-0/0/2.0, Pop
10402 *[L-ISIS/14] 00:26:15, metric 10
> to 12.12.12.2 via ge-0/0/1.0, Pop
10402(S=0) *[L-ISIS/14] 00:26:15, metric 10
> to 12.12.12.2 via ge-0/0/1.0, Pop
10403 *[L-ISIS/14] 00:25:48, metric 10
> to 13.13.13.3 via ge-0/0/2.0, Pop
10403(S=0) *[L-ISIS/14] 00:25:48, metric 10
> to 13.13.13.3 via ge-0/0/2.0, Pop
10404 *[L-ISIS/14] 00:25:50, metric 20
> to 12.12.12.2 via ge-0/0/1.0, Swap 10404
10405 *[L-ISIS/14] 00:25:16, metric 20
> to 13.13.13.3 via ge-0/0/2.0, Swap 10405
10406 *[L-ISIS/14] 00:25:13, metric 30
to 12.12.12.2 via ge-0/0/1.0, Swap 10406
> to 13.13.13.3 via ge-0/0/2.0, Swap 10406各Adjacency SIDやNode SID宛の経路情報があることが確認できます。
(先ほども見ましたが)CEネットワークの経路情報を確認します。
lab@vJR-01# run show route 220./6
inet.0: 20 destinations, 20 routes (20 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
221.221.221.0/24 *[BGP/170] 00:17:00, localpref 100, from 6.6.6.6
AS path: I, validation-state: unverified
> to 13.13.13.3 via ge-0/0/2.0, Push 10406, Push 10404, Push 10405(top)
222.222.222.0/24 *[BGP/170] 00:17:00, localpref 100, from 6.6.6.6
AS path: I, validation-state: unverified
> to 13.13.13.3 via ge-0/0/2.0, Push 10406, Push 10404, Push 10405(top)「Push 10406, Push 10404, Push 10405(top)」の表記があり、LabelをPushする動作となっています。
設定したTraffic Engineering通りにStackされてますね。
意図通り(Next-hopでvJR-03→)vJR-05→vJR-04→vJR-06の経路でパケット転送されそうです。
最後にCE(vJR-11)からPingを飛ばして各Linkでパケットキャプチャーして確認します。
まずvJR-01~vJR-03間のパケットを見てみます。

「10405」「10404」「10406」のLabelがStackされてますね。
続いて、vJR-03~vJR-05間のパケットを見てみます。

「10405」はPopされて「10404」「10406」のLabelがStackされてます。
続いて、vJR-05~vJR-04間のパケットを見てみます。

「10404」はPopされて「10406」のLabelのみStackされてます。
最後にvJR-04~vJR-06間のパケットを見てみます。

「10406」はPopされて(MPLSヘッダーがない)L2とL3ヘッダーのみのフレームになってますね。
無事、定義した経路でMPLS LabelによってSegment Routingされてました。
ちなみに、今回はvJR-01→vJR-06(vJR-11→vJR-21 or vJR-22)方向のみSegment Routingさせているので、戻りのパケットもTraffic Engineeringさせたい場合はvJR-06に設定が必要になります。
という訳でSR-MPLSを使ったパケット転送の検証ができました!!
今回は以上です。ここまでお読みくださり、ありがとうございました!!!!
4. 参考資料
書籍 Cisco Press 「Segment Routing for Service Provider and Enterprise Networks」
Juniper Documentation - MPLS Applications User Guide - Segment Routing LSP Configuration
www.juniper.net
Juniper DocumentationのUser Guide色々