はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
また、先日参加したSRv6ワークショップでクレランスさんがSRv6をめちゃくちゃ推していたのですが、SR-MPLSはどうなんだ?と思い、CMLでSR-MPLSの動作確認をしました。
ちなみにCiscoのクレランスさんがセグメントルーティング(主にSRv6)を理解するためには、この本がいいとおっしゃっていました笑
記事一覧(SR-MPLSシリーズ)
-
技術
【SRv6/SRMPLS】SR-MPLS(概要:SID/FEC)
-
技術
【セグメントルーティング(SR)実践編】SR-MPLS TE Anycast SIDをCMLで実装してみた話
-
技術
【セグメントルーティング(SR)実践編】SR-MPLS TE Dynamic pathをCMLを使って実装してみた話
-
技術
【セグメントルーティング(SR)実践編】SR-MPLS TE Explicit pathについて
-
ネットワーク
【ネットワーク入門:セグメントルーティング】SRv6(エンドファンクション・トランジットファンクション)
-
ネットワーク
【ネットワーク入門編】SRv6をまとめてみた(概要)
SR-MPLS TE(Traffic Engineering)とは
SR-MPLSのTE(トラフィックエンジニアリング)とは、「ネットワークの利用状況や品質を考慮し最適化することを目的とした機能」です。
具体的には、「指定したリンク(区間)やノード(ルータ)を経由するExplicit Path」や「通信帯域(Bandwidth)、通信遅延(Latency)を基にしたメトリックを利用し最適経路を定める機能」等があります。
IOS-XRでは、主にsegment-routing配下に設定することで制御が可能となります。
SR-MPLS TE Explicit pathの動作確認
動作確認の検証構成図
今回、SR-MPLS TEのExplicit Pathを利用した構成は以下となります。
TReXはトラフィックジェネレータを指し、Router1・Router6のルータはIOS、Router2~Router5はIOS-XRで構築しています。(Router2~Router5でSR-TEを実現)
SRTEを適用する前のトラフィックフローは?(事前確認)
SR-TEの設定投入前の状態は、Router2とRouter4を経由するフローとなっています。
では、本当にこのフローなのか、Router1からRouter6宛にTracerouteによる状態確認を行います。
Tracerouteのログは以下の通りとなっており、これは想定通りとなります。
ちなみに「192.168.1.1」は、Router1-Router2間、「10.2.0.2」はRouter2ーRouter4間、「192.168.3.2」はRouter4-Router6間のアドレスとなっております。
Router1#traceroute 192.168.6.1
Type escape sequence to abort.
Tracing the route to 192.168.6.1
VRF info: (vrf in name/id, vrf out name/id)
1 192.168.1.1 [AS 10] 1 msec 3 msec 3 msec
2 10.2.0.2 [AS 10] 4 msec 2 msec 3 msec
3 192.168.3.2 [AS 10] 2 msec * 1 msec
Explicit Pathの設定を投入してみよう
では、本題となるSR-TE Explicit Pathの設定を投入していきます。
今回投入する設定では、以下のトラフィックフローとなることを想定しています。
SR-TEやExplicit Pathの設定は、一般的に始点となるルータ(Router2)に設定することでTEを適用することができます。
では、設定方法を1つずつみていきましょう。
Segment-Listの設定
Segment-Listとは、「通過するルータや区間を指定するためのリスト」になります。
このリストに設定すると、Index値の小さいルータや区間から順番に最短経路を通過することになります。
また、このリストに設定できるのは、ルータ固有値となる「Prefix-SID」やIFごとに自動生成される「Adj-SID」、「Anycast-SID」になります。
一般的な設定コマンドは以下の通りとなります。
(config)# segment-routing traffic-eng
(config-sr-te)# segment-list <セグメントリスト名>
(config-sr-te-sl)# index <Index値> mpls label < prefix-sid | adj-sid | anycast-sid >
今回の例である「segment-list BLUE」では、Prefix-SID「16003→16005→16004」と指定しています。
具体的な設定コマンドは以下を見てもらえればわかると思います。
RP/0/RP0/CPU0:Router2(config)#segment-routing traffic-eng
RP/0/RP0/CPU0:Router2(config-sr-te)#segment-list BLUE
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 10 mpls label 16003
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 20 mpls label 16005
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 30 mpls label 16004
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#exit
RP/0/RP0/CPU0:Router2(config-sr-te)#segment-list GREEN
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 10 mpls label 16004
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#exit
RP/0/RP0/CPU0:Router2(config-sr-te)#segment-list RED
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 10 mpls label 16004
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 20 mpls label 16005
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#index 30 mpls adjacency 192.168.4.2
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#commit
RP/0/RP0/CPU0:Router2(config-sr-te-sl)#end
上記の設定により「Segment-List」の設定完了です。
Segment-Listの設定後はPolicyの作成
「Segment-List」作成後は、「segment-routing traffic-eng」配下にPolicyを作成しExplicit Pathを適用します。
Policyの一般的な設定コマンドは、以下の通りとなっています。
(config)# segment-routing traffic-eng
(config-sr-te)# policy <ポリシー名>
(config-sr-te-policy)# color <カラー値> end-point <ipv4|ipv6> <IPアドレス>
(config-sr-te-policy)# autoroute include <ipv4|ipv6> <all | x.x.x.x/x >
(config-sr-te-policy)# candidate-paths
(config-sr-te-policy-path)# preference <preference値>
(config-sr-te-policy-path-pref)#explicit segment-list <Segment-List名>
(config-sr-te-pp-info)# weight <weight値>
上記の各設定については、以下で説明していきます。
color値とは?
color値とは「同一ルータ上に存在する複数のSRTEポリシーを識別するために利用する値」になります。
この値はBGPのExtended Community(RFC4360)で広報(別途記事作成予定)されています。
(config)# segment-routing traffic-eng
(config-sr-te)# policy <ポリシー名>
(config-sr-te-policy)# color <カラー値> end-point <ipv4 | ipv6> <IPアドレス>
上記の通り、各ルータ(ノード)で付与されたColor値を持った経路に対するTEの動作を定義するために利用します。
例えば、Router2上でRouter4をエンドポイントとしたPolicyの設定を行う場合、以下のような設定になります。
(config-sr-te-policy)# color 10 end-point ipv4 10.1.0.4
これはRouter4から各ルータ(ノード)に広報する経路に対しColor値を10と定義しているため、「color 10」となっています。
これが他のColor値を利用する場合は、当然他の値になります。
意外と盲点となる「autoroute include」
「autoroute include <オプション>」は、SRTE Policyに対しIGP経路(全Prefixや特定Prefix)を連携する際に利用します。(再配送みたいなものです)
(config)# segment-routing traffic-eng
(config-sr-te)# policy <ポリシー名>
(config-sr-te-policy)# autoroute include <ipv4|ipv6> <all | x.x.x.x/x >
このConfigはIPv4とIPv6の両方が指定できます。
また、「all or 特定のPrefix」を指定することで、どのIGP経路をSRTE Policyに適用するか指定することが可能となります。
他にも以下のメトリック種別の指定ができるようです。
項目 | 詳細 |
default(何もなし) | デフォルトのメトリック種別(最短経路) |
autoroute metric constant | Absolute Metric(コスト変更) ※Router1-Router2のコストを10から100に変更 |
autoroute metric relative | Relative Metric(コスト増減) ※Router1-Router2のコスト10から-2を行い、8に変更 |
正直、経験がないだけですが、上記のメトリック種別の変更はあまり利用する機会がないと思います。
Explicit-Pathの指定に必須となる「candidate-paths」
「candidate-paths」は、「Explicit-Pathの指定に必須となり、Segment ListやWeighted Segment Listの紐付け」を行います。
(config-sr-te-policy)# candidate-paths
(config-sr-te-policy-path)# preference <preference値>
(config-sr-te-policy-path-pref)#explicit segment-list <Segment-List名>
(config-sr-te-pp-info)# weight <weight値>
上記では、「candidate-paths」配下に3つの設定を行っています。
項目 | 詳細 |
preference <preference値> | パスに対する優先度の定義 ※値が大きい程、優先度が高くなる |
explicit segment-list <Segment-List名> | Segment Listの指定 ※ここに指定したListがExplicit Pathとなります。 |
weight <weight値> | トラフィック量の比重指定 ※複数のSegment Listを指定した場合のトラフィック分散に利用 |
具体的なConfig例
ここまで設定するConfigについて説明したので、より具体的なConfigを見ていきましょう。
RP/0/RP0/CPU0:Router2(config)#segment-routing traffic-eng
RP/0/RP0/CPU0:Router2(config-sr-te)#policy POLICY_TEST
RP/0/RP0/CPU0:Router2(config-sr-te-policy)#color 10 end-point ipv4 10.0.1.4
RP/0/RP0/CPU0:Router2(config-sr-te-policy)#autoroute include all
RP/0/RP0/CPU0:Router2(config-sr-te-policy)#candidate-paths
RP/0/RP0/CPU0:Router2(config-sr-te-policy-path)#preference 100
RP/0/RP0/CPU0:Router2(config-sr-te-policy-path-pref)#explicit segment-list BLUE
RP/0/RP0/CPU0:Router2(config-sr-te-pp-info)#weight 10
RP/0/RP0/CPU0:Router2(config-sr-te-policy-path-pref)#explicit segment-list GREEN
RP/0/RP0/CPU0:Router2(config-sr-te-pp-info)#weight 10
RP/0/RP0/CPU0:Router2(config-sr-te-pp-info)#commit
RP/0/RP0/CPU0:Router2(config-sr-te-pp-info)#end
文章で書くとわかりづらいと思うので、上記設定の要点を以下にまとめてみました。
項目 | 詳細 |
Policy名 | POLICY_TEST |
color値 | 10 |
Endpoint | Router4(10.0.1.4) ※Nexthopが「10.0.1.4」の経路に対し、Policyを適用 |
autoroute inclue | 全経路を反映 |
candidate-paths | 2つのSegment List(BLUE/GREEN)を適用 – Preference:100 – weight:BLUE/GREEN共に1:1となる割合 |
設定した後は動作確認をしてみよう!(修正中)
上記設定を投入後の状態変化について、ログから確認していきたいと思います。
まず、トラフィック変動から見てみたいと思います。
Router2のトラフィック量は、Gi0/2(Router1向け)が200packet入ってきていることがわかります。
そして、Gi0/1のトラフィック量は200から26まで減ってきているのでGi0/0に切り替わっていることがわかります。
RP/0/RP0/CPU0:Router2#show interfaces gigabitEthernet 0/0/0/2 | in rate
Fri May 5 14:16:00.242 UTC
5 minute input rate 149000 bits/sec, 194 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
RP/0/RP0/CPU0:Router2#show interfaces gigabitEthernet 0/0/0/1 | in rate
Fri May 5 14:16:03.189 UTC
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 133000 bits/sec, 174 packets/sec
RP/0/RP0/CPU0:Router2#show interfaces gigabitEthernet 0/0/0/1 | in rate
Fri May 5 14:16:04.511 UTC
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 20000 bits/sec, 26 packets/sec
RP/0/RP0/CPU0:Router2#show interfaces gigabitEthernet 0/0/0/0 | in rate
Fri May 5 14:16:09.036 UTC
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 164000 bits/sec, 198 packets/sec
また、RIBの状況を見てもTEの設定が適用されていることがわかります。
「10.0.1.4」や「10.0.1.5」宛の部分は、IF名ではなくSR-TEのポリシー名となっております。
これは、設定投入後に生成されるトンネルのIF名となっております。
RP/0/RP0/CPU0:Router2#show route ipv4
Fri May 5 14:16:50.034 UTC
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
B 10.0.1.1/32 [20/0] via 192.168.1.2, 00:43:29
L 10.0.1.2/32 is directly connected, 00:45:30, Loopback0
O 10.0.1.3/32 [110/11] via 10.1.0.2, 00:14:14, GigabitEthernet0/0/0/0
[110/31] via 10.2.0.2, 00:14:14, GigabitEthernet0/0/0/1 (!)
O 10.0.1.4/32 [110/11] via 10.0.1.4, 00:01:20, srte_c_10_ep_10.0.1.4
O 10.0.1.5/32 [110/21] via 10.0.1.4, 00:01:20, srte_c_10_ep_10.0.1.4
[110/21] via 10.1.0.2, 00:01:20, GigabitEthernet0/0/0/0
[110/0] via 10.2.0.2, 00:01:20, GigabitEthernet0/0/0/1 (!)
B 10.0.1.6/32 [200/0] via 10.0.1.4, 00:43:19
C 10.1.0.0/30 is directly connected, 00:44:59, GigabitEthernet0/0/0/0
L 10.1.0.1/32 is directly connected, 00:44:59, GigabitEthernet0/0/0/0
C 10.2.0.0/30 is directly connected, 00:44:59, GigabitEthernet0/0/0/1
L 10.2.0.1/32 is directly connected, 00:44:59, GigabitEthernet0/0/0/1
O 10.3.0.0/30 [110/20] via 10.0.1.4, 00:01:20, srte_c_10_ep_10.0.1.4
O 10.4.0.0/30 [110/20] via 10.1.0.2, 00:14:29, GigabitEthernet0/0/0/0
[110/30] via 10.2.0.2, 00:14:29, GigabitEthernet0/0/0/1 (!)
C 192.168.1.0/30 is directly connected, 00:44:59, GigabitEthernet0/0/0/2
L 192.168.1.1/32 is directly connected, 00:44:59, GigabitEthernet0/0/0/2
B 192.168.2.0/30 [200/0] via 10.0.1.3, 00:14:29
B 192.168.3.0/30 [200/0] via 10.0.1.4, 00:43:19
O 192.168.4.0/30 [110/30] via 10.0.1.4, 00:01:20, srte_c_10_ep_10.0.1.4
[110/30] via 10.1.0.2, 00:01:20, GigabitEthernet0/0/0/0
[110/0] via 10.2.0.2, 00:01:20, GigabitEthernet0/0/0/1 (!)
B 192.168.5.0/30 [20/0] via 192.168.1.2, 00:43:29
B 192.168.5.2/32 [20/0] via 192.168.1.2, 00:43:29
B 192.168.6.0/30 [200/0] via 10.0.1.4, 00:43:19
そして、segment-routingのshowコマンドからもわかるようにBLUEが有効となっており、GREENが無効となっていることがわかります。
この設定により、「Router3」と「Router5」経由でトラフィックが流れるようになります。
RP/0/RP0/CPU0:Router2#show segment-routing traffic-eng policy
Fri May 5 14:17:20.902 UTC
SR-TE policy database
---------------------
Color: 10, End-point: 10.0.1.4
Name: srte_c_10_ep_10.0.1.4
Status:
Admin: up Operational: up for 00:01:51 (since May 5 14:15:29.483)
Candidate-paths:
Preference: 100 (configuration) (active)
Name: POLICY_TEST
Requested BSID: dynamic
Protection Type: protected-preferred
Maximum SID Depth: 10
Explicit: segment-list BLUE (valid)
Weight: 10, Metric Type: TE
16003 [Prefix-SID, 10.0.1.3]
16005
16004
Preference: 50 (configuration)
Name: POLICY_TEST
Requested BSID: dynamic
Protection Type: protected-preferred
Maximum SID Depth: 10
Explicit: segment-list GREEN (invalid)
Weight: 10, Metric Type: TE
Attributes:
Binding SID: 24006
Forward Class: Not Configured
Steering labeled-services disabled: no
Steering BGP disabled: no
IPv6 caps enable: yes
Invalidation drop enabled: no
障害試験(リンク障害・ノード障害)
Explicit Pathの設定完了後は、障害による動作確認を行いたいと思います。
今回、実施した障害はリンク障害・ノード障害となります。
リンク障害はIFをShutdownし、ノード障害は筐体を落とすとアップまで時間がかかるので全IFをShutdownし孤立させる方法で実施しました。
リンク障害
リンク障害は、「Router2ーRouter3間」のリンクを切断してみました。
結果は、Router3への到達性が失われたわけではないため、最終的にBLUEが有効のままとなり、Router4/Router5を経由し、Router3に到達し、Router5に戻り、Router4へ流れていました。
つまり、Explilcit Pathの設定では、到達性がある場合、その条件が有効となってしまうため、非効率的な運用となってしまう場合があります。
このケースを防ぎたい場合は、segment-listでPrefix-SIDではなく、Adj-SIDで指定することで想定通りの動作に切り替わることが確認取れています。
切断後のRouter2でのshowコマンドは以下の通りとなります。
how segment-routing traffic-eng policy name srte_c_10_ep_10.0.1.4
Sun May 7 03:08:35.314 UTC
SR-TE policy database
---------------------
Color: 10, End-point: 10.0.1.4
Name: srte_c_10_ep_10.0.1.4
Status:
Admin: up Operational: up for 03:38:09 (since May 6 23:30:25.969)
Candidate-paths:
Preference: 100 (configuration) (active)
Name: POLICY_TEST
Requested BSID: dynamic
Protection Type: protected-preferred
Maximum SID Depth: 10
Explicit: segment-list BLUE (valid)
Weight: 10, Metric Type: TE
16003 [Prefix-SID, 10.0.1.3]
16005
16004
Preference: 50 (configuration)
Name: POLICY_TEST
Requested BSID: dynamic
Protection Type: protected-preferred
Maximum SID Depth: 10
Explicit: segment-list GREEN (invalid)
Weight: 10, Metric Type: TE
Attributes:
Binding SID: 24007
Forward Class: Not Configured
Steering labeled-services disabled: no
Steering BGP disabled: no
IPv6 caps enable: yes
Invalidation drop enabled: no
ノード障害
ノード障害では、Router3への到達性がなくなるため、BLUEからGREENに無事に切り替わっておりました。
このことからExplicit Pathでは、各ノードもしくはIFへの到達性が鍵となり、障害の状況によっては輻輳や意図しないループ等を生み出す可能性があると言えるので、設計には十分気をつける必要があります。
最後に
今回は、SR-MPLS TEのExplicit Pathの実装編として、IOS-XR・CMLを使った例をまとめました。
次回は、SR-MPLS TEのDynamic Pathの実装編を投稿していきたいと思います。
その後に、SR-MPLSの概要についてまとめていきたいとおもいます。
SR-TEについては、以下の教材がおすすめかと思います!
-
技術
【SRv6/SRMPLS】SR-MPLS(概要:SID/FEC)
-
技術
【セグメントルーティング(SR)実践編】SR-MPLS TE Anycast SIDをCMLで実装してみた話
-
技術
【セグメントルーティング(SR)実践編】SR-MPLS TE Dynamic pathをCMLを使って実装してみた話
-
技術
【セグメントルーティング(SR)実践編】SR-MPLS TE Explicit pathについて
-
ネットワーク
【ネットワーク入門:セグメントルーティング】SRv6(エンドファンクション・トランジットファンクション)
-
ネットワーク
【ネットワーク入門編】SRv6をまとめてみた(概要)
コメント