SRv6 L3VPNのconfig(IOS-XR)をコマンド/パケットを見ながら理解してみた

前回の記事の構成をベースに実際に流れるパケットを見ながらSRv6 L3VPNの挙動を理解していきたいと思う

https://qiita.com/gemunopedy/items/74906279084c86413386

## 構成
前回の構成のままだとloop構成で少し分かりにくいので、XR01とXR05の間をshutして直線構成にした
XR01上のvrf 1からXR05上のvrf 1へのpingパケットが到達すればSRv6 L3VPNが実現していることになる
挙動の確認手順としては、前回構築した構成からXR02のconfigを削除して、ステップごとにconfig投入後の挙動を確認していく

![スクリーンショット 2024-10-16 13.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/4cfb04b6-8c30-6729-807b-cae117fb46bd.png)

## 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が通るように少し変更してあげる必要あり

![スクリーンショット 2024-10-19 12.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/cb01c6cf-e1c8-29bb-5fd2-cc9a5edfb0b1.png)





locator設定前後での状態確認コマンドは主に3種類。コマンドと設定前後の差分は以下
左がconfig投入後、右がconfig投入前
```
show segment-routing srv6 locator
```
![スクリーンショット 2024-10-19 12.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/3a581a12-ca0b-9280-0383-8d6c005b30a5.png)
設定したLocatorが表示されるようになった

```
show segment-routing srv6 sid all
```
![スクリーンショット 2024-10-19 12.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/5798651c-e638-66a0-472e-e663eb78e73c.png)
Locatorを定義するとuNのFunction SID(Node SID)が自動で割り当てられる
Behavior一覧は以下参照
![スクリーンショット 2024-10-19 12.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/3a4c68e7-dcd8-4e7f-a708-7cb7f9588d52.png)

https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2024/pdf/BRKSPG-2203.pdf

```
show segment-routing srv6 manager
```
![スクリーンショット 2024-10-19 12.36.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/c4ef7b50-4a84-ceb3-7765-3378f9838c53.png)

SRv6が有効になり、Locator情報が反映されている

またRIB上(show route ipv6)からもconfig投入後にSIDを確認することができる。

![スクリーンショット 2024-10-19 12.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/2d861d4c-3f7a-d455-cab7-ff4202a1abc1.png)

これで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が追加されている

![スクリーンショット 2024-10-19 14.16.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/b8701fcf-ab42-1f2f-f51c-954f609e0242.png)

詳細を確認すると、Locator情報とBehavior情報が通知されている。通知されているBehavorはuN(END)

![スクリーンショット 2024-10-19 14.31.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/90887422-a77e-5374-2a7d-73f63d0b02b1.png)

ちなみにLocator設定を実施した際は自動的にuN(END)が割り当てられたが、ISIS配下にSRv6設定を行うとuA(END.X)が自動割り当てされる

![スクリーンショット 2024-10-19 14.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/87be864d-6e54-9a2e-74c4-14da7b018bbf.png)

![スクリーンショット 2024-10-19 15.00.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/7b9e1644-a0ee-b351-a4bc-29dd4b42d036.png)


最初このuAに関してもSRv6 Locatorにて通知されるものだと思っていたので、該当箇所をかなり確認してみたが一向に見つからず、色々調べてみても見つからずどゆこと？と思いながら改めてパケットを確認してみるとSRv6 Locatorではなく、Multi Topology IS Reachability(Type 222)のsubTLVにて通知されていた

![スクリーンショット 2024-10-20 0.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/5bd6030c-e522-1178-125e-17ed2a7f77c5.png)

show isis database verbosで確認するリンクステートデータベース上にもuNとuAが設定されていることが確認できる

![スクリーンショット 2024-10-20 0.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/4293065e-a545-6532-8d22-37c23003a4a9.png)

R1のRIBを確認すると、R2で設定したLocatorが登録されている

![スクリーンショット 2024-10-20 0.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/353cab35-a758-60f6-9115-c611ed60b953.png)

これで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が定義される

![スクリーンショット 2024-10-20 2.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/0b4d5241-ae0e-822d-9700-b74b56ac1727.png)

UPDATE Messageにて広報される

![スクリーンショット 2024-10-20 2.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/6523a51f-0ccf-dc13-cd87-9997cb155de4.png)

![スクリーンショット 2024-10-20 2.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/20ab6614-de6a-d2be-70a3-04744718f10c.png)

最初、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の勉強始めてしまっているので、ここらへんも今後勉強予定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/87068c57-54d5-a3e5-1353-72660eba79d6.png)

https://www.ciscolive.com/c/dam/r/ciscolive/global-event/docs/2024/pdf/BRKMPL-2203.pdf

show bgpコマンドでも確認。R2でuDT4が定義されていること、R1でuDT4のSIDを受信していることが確認できる

R2
![スクリーンショット 2024-10-20 2.57.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/36c6ff11-095f-5f65-16e7-aa2403ba5b1a.png)

R1
![スクリーンショット 2024-10-20 3.04.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/1fa6d9ee-f2a1-8645-73c3-872883eb6f46.png)

![スクリーンショット 2024-10-20 3.03.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/449cbcaa-3ea5-43b8-52e0-fc67e8c8a217.png)

Behavior:63なのでuDT4のSIDを受領していることが確認できる
show bgp vpnv4 unicast received-sids コマンドでも各vpnv4 addressのSIDを確認することができる

![スクリーンショット 2024-10-20 3.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/402910cf-91c5-f6ef-dd8f-894681511746.png)

これでBGPによるSID(function:uDT4)の広報が完了し、SRv6 L3VPN環境構築が完了

## 4. 疎通確認
R1 vrf1 (1.1.1.1)から R5 vrf1 (1.1.1.5)へのpingを実施
問題なし
![スクリーンショット 2024-10-20 3.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/f4a98e95-45fe-0310-f00f-47af1668829b.png)

パケットを確認
R1-R2間
![スクリーンショット 2024-10-20 3.15.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83723/0a6a9284-f7d3-5076-8d2d-e197b2fe5a27.png)
IPv4 AddressがIPv6でカプセル化されており、IPv6ヘッダのdst addressがR5におけるuDT4のSIDになっている。
今回の構成ではdstの書き換えは発生せずにR2/R3/R4でも同じIPv6ヘッダにてパケット転送が行われている


次はuSIDの仕組みをもう少しちゃんと理解したい
最終的にはcisco liveドキュメントのSRv6関連の資料全てに目を通して何が書いてあるかを理解できるようにまではなりたい