前回の記事の構成をベースに実際に流れるパケットを見ながらSRv6 L3VPNの挙動を理解していきたいと思う
構成
前回の構成のままだとloop構成で少し分かりにくいので、XR01とXR05の間をshutして直線構成にした
XR01上のvrf 1からXR05上のvrf 1へのpingパケットが到達すればSRv6 L3VPNが実現していることになる
挙動の確認手順としては、前回構築した構成からXR02のconfigを削除して、ステップごとにconfig投入後の挙動を確認していく
SRv6 L3VPNを実現させるためのざっくりしたステップ
1. Locator Prefixの設定
まずは各RouterにてSRv6 SIDを構成するLocatorの定義を行う
投入configは以下
conf
segment-routing
srv6
locators
locator MAIN
micro-segment behavior unode psp-usd
prefix fcbb:bb00:2::/48
commit
今回は参照configがuSIDのため、uSID設定にて確認する。Full-Length SIDとの詳細な挙動比較は別途実施予定
ちなみに、Full-Length SIDでの設定は以下となる
conf
segment-routing
srv6
locators
locator MAIN
prefix fcbb:bb00:2:2::/64
commit
uSIDからFull-Length SIDへの設定変更として"micro-segment behavior unode psp-usd"だけを削除したconfigで設定しようとしたらerrorとなった。format含めて細かい確認はuSID挙動確認時に。なのでprefixをcommitが通るように少し変更してあげる必要あり
locator設定前後での状態確認コマンドは主に3種類。コマンドと設定前後の差分は以下
左がconfig投入後、右がconfig投入前
show segment-routing srv6 locator
show segment-routing srv6 sid all
Locatorを定義するとuNのFunction SID(Node SID)が自動で割り当てられる
Behavior一覧は以下参照
show segment-routing srv6 manager
SRv6が有効になり、Locator情報が反映されている
またRIB上(show route ipv6)からもconfig投入後にSIDを確認することができる。
これでGlobal上でのSRv6設定は完了
2. ISISによるLocator(SID)の広報
Locator設定後は、自身のLocatorもしくはFunction含めたSID情報をSRv6 Domainの他のRouterに通知してあげる必要がある。IS-IS SRv6 ExtensionのSRv6 Locator TLVを利用して通知している。今回はsubTLVを利用してSIDを通知している形となる。
投入configは以下(Interface設定はSRv6とは関係ないため省略)
conf
router isis 1
is-type level-1
net 49.0.0.2.00
address-family ipv6 unicast
metric-style wide
segment-routing srv6
locator MAIN
commit
config投入前(左)とconfig投入後(右)のR1とR2との間のパケットをキャプチャしてみると、LSPに新たにType 27のSRv6 Locatorが追加されている
詳細を確認すると、Locator情報とBehavior情報が通知されている。通知されているBehavorはuN(END)
ちなみにLocator設定を実施した際は自動的にuN(END)が割り当てられたが、ISIS配下にSRv6設定を行うとuA(END.X)が自動割り当てされる
最初このuAに関してもSRv6 Locatorにて通知されるものだと思っていたので、該当箇所をかなり確認してみたが一向に見つからず、色々調べてみても見つからずどゆこと?と思いながら改めてパケットを確認してみるとSRv6 Locatorではなく、Multi Topology IS Reachability(Type 222)のsubTLVにて通知されていた
show isis database verbosで確認するリンクステートデータベース上にもuNとuAが設定されていることが確認できる
R1のRIBを確認すると、R2で設定したLocatorが登録されている
これでISISによるLocator(SID)の広報は完了
3. BGPによるSID(function:uDT4)の広報
SRv6 Domain上でL3VPN機能を利用するためには、uDT4(END.DT4)のfunctionを利用する。uDT4のSIDを受け取ったルータは特定のIPv4テーブル、ここではvrf 1のテーブルを参照する形でL3VPNが実現する。R1がR5にパケットを飛ばす時はR5におけるuDT4のSIDをdst addressに指定してパケット転送することで、R5がパケットを受信した際にuDT4のbehaviorを実行することでL3VPNの挙動となる。
投入configは以下
(今更だが普通にconfig削除からのstep毎のconfig投入はR5で実施すればよかった)
config
router bgp 1
bgp router-id 1.0.0.2
address-family vpnv4 unicast
address-family vpnv6 unicast
neighbor fcbb:bb00:1::1
remote-as 1
update-source Loopback0
address-family vpnv4 unicast
address-family vpnv6 unicast
vrf 1
rd 1:1
address-family ipv4 unicast
segment-routing srv6
locator MAIN
alloc mode per-vrf
redistribute connected
commit
bgp配下にSRv6の設定を実施するとuDT4が定義される
UPDATE Messageにて広報される
最初、uDT4のSID fcbb:bb00:2:e002:: がSRv6 Service Sub-TLVsのSRv6 SID Valueに格納されると思っていたが、Locatorの値が入っており、どこをみてもe002が見た当たらずこちらもかなり探してかなり悩んだ。
色々調べてみた所、下記資料をみてもしかしてと思い、MP_REACH_NLRIのLabel Stackの値を確認して、今回設定されている917536を16進数に変換するとe002となり、uDT4のSIDはLabel Stackに格納されていることがようやく分かった。
BGP-LSを全く理解してない状態でSRv6の勉強始めてしまっているので、ここらへんも今後勉強予定
show bgpコマンドでも確認。R2でuDT4が定義されていること、R1でuDT4のSIDを受信していることが確認できる
Behavior:63なのでuDT4のSIDを受領していることが確認できる
show bgp vpnv4 unicast received-sids コマンドでも各vpnv4 addressのSIDを確認することができる
これでBGPによるSID(function:uDT4)の広報が完了し、SRv6 L3VPN環境構築が完了
4. 疎通確認
R1 vrf1 (1.1.1.1)から R5 vrf1 (1.1.1.5)へのpingを実施
問題なし
パケットを確認
R1-R2間
IPv4 AddressがIPv6でカプセル化されており、IPv6ヘッダのdst addressがR5におけるuDT4のSIDになっている。
今回の構成ではdstの書き換えは発生せずにR2/R3/R4でも同じIPv6ヘッダにてパケット転送が行われている
次はuSIDの仕組みをもう少しちゃんと理解したい
最終的にはcisco liveドキュメントのSRv6関連の資料全てに目を通して何が書いてあるかを理解できるようにまではなりたい