SRv6について2021年までに取集した情報を整理して入門書を作りました。 とりあえずSRv6に触れたい方向けの内容になっています。
1. SRv6 概要
1.1. SRv6 とは
SRv6とは「Segment Routing over IPv6」の略でセグメントルーティングとIPv6を合わしたNW技術になります。 2017年あたりから多くの https://www.janog.gr.jp/meeting/janog43/program/srv6 SRv6を理解するには主に「セグメントルーティング」と「IPv6」を理解する必要があります。
1.1.1. セグメントルーティング
セグメントルーティングとはソース情報(送信元)をベースとして、トラフィックを細かく管理(トラフィックエンジニアリング)することができるネットワークプロトコルです。
ざっくりとしたイメージは以下となります。
セグメントルーティングでは、ソースから様々なトラフィック制御(ルーティング、QoSなど)が可能になるため、アプリケーションなどと連携するSDNがとても容易になります。
1.1.2. IPv6
IPv6は128ビット長のパケットで 340×1兆×1兆×1兆 のIP割り当てが可能です。(IPv4は43億ほど) 事実上世界中で一意に使われても枯渇することがないとされています。
既に大規模DCやインターネット回線など広く使われており、最近では一般コンシューマ向けのIPv6に対応したモデムやルータなどもよく見かけるようになりました。
http://www.worldipv6launch.org/measurements/
1.2. どういうところで使われているのか?
既に多くのITインフラで利用がはじまってます。
- データセンタ
- 固定回線
- キャリア回線(モバイル回線)
など IPv6には「拡張ヘッダー」と呼ばれる自由に機能を詰め込めるスペースがあり、これを使用することにより SRv6 が実現します。 そのため、プラットフォームがIPv6に対応していればSRv6を利用することができ、導入し易いようです。
1.3. 今どういう状況?
新しい技術でまだまだ発展途上だが、すでに採用済み、検討中の企業は多数。
2. SRv6 詳細
詳細については以下
2.1. SRv6の仕組み
SRv6の主な仕組み
- SRv6は下記の通り、IPv6ヘッダー内の拡張ヘッダーにセグメントルーティングヘッダー(SRH)を付加することによって実現されている
https://www.rfc-editor.org/rfc/rfc8754.html
- Segment List について
p23~p27参照
2.2. SRv6 Function
SRv6対応ルータでは様々なコントロールが可能です。
https://tools.ietf.org/html/draft-ietf-spring-srv6-network-programming-28#page-10
function | 説明 |
---|---|
End | Endpoint function The SRv6 instantiation of a Prefix SID [RFC8402] |
End.X | Endpoint with Layer-3 cross-connect The SRv6 instantiation of an Adj SID [RFC8402] |
End.T | Endpoint with specific IPv6 table lookup |
End.DX6 | Endpoint with decapsulation and IPv6 cross-connect Te.g. IPv6-L3VPN (equivalent to per-CE VPN label) |
End.DX4 | Endpoint with decaps and IPv4 cross-connect Te.g. IPv4-L3VPN (equivalent to per-CE VPN label) |
End.DT6 | Endpoint with decapsulation and IPv6 table lookup Te.g. IPv6-L3VPN (equivalent to per-VRF VPN label) |
End.DT4 | Endpoint with decapsulation and IPv4 table lookup Te.g. IPv4-L3VPN (equivalent to per-VRF VPN label) |
End.DT46 | Endpoint with decapsulation and IP table lookup Te.g. IP-L3VPN (equivalent to per-VRF VPN label) |
End.DX2 | Endpoint with decapsulation and L2 cross-connect Te.g. L2VPN use-case |
End.DX2V | Endpoint with decaps and VLAN L2 table lookup Te.g. EVPN Flexible cross-connect use-case |
End.DT2U | Endpoint with decaps and unicast MAC L2 table lookup Te.g. EVPN Bridging unicast use-case |
End.DT2M | Endpoint with decapsulation and L2 table flooding Te.g. EVPN Bridging BUM use-case with ESI filtering |
End.B6.Encaps | Endpoint bound to an SRv6 policy with encapsulation TSRv6 instantiation of a Binding SID |
End.B6.Encaps.Red | End.B6.Encaps with reduced SRH TSRv6 instantiation of a Binding SID |
End.BM | Endpoint bound to an SR-MPLS Policy TSRv6 instantiation of an SR-MPLS Binding SID |
2.3. SRv6 Control Plane
SRv6は宛先(終端)にアクセスするのに、宛先までのセグメントIDと各セグメントID間のIPv6ルーティングによって宛先に到達することができます。 あらかじめトポロジ全体のセグメントIDがわかっていれば良いですが、手動で全パターンを終端に設定していくのは大変です。 通常のIPルーティングと同じでSRv6にもコントロールプレーンがいくつか使えます。
<手動でやる場合の絵を書く>
<自動でやることのメリットを絵にする>
2.4. Flex-Algo (Flexible Algorithm)
セグメントIDをグループ化することによって、各グループに応じたルーティングが可能になります。グループ化すると広報するセグメントIDはグループ内でのやりとりになります。 またこのようなに理論的にネットワーク分割することをネットワークスライシングと呼びます。
https://5g-innovation.com/report/networkslicing-2019-event-report2/
2.5. TI-LFA
障害発生時の高速経路切替(ここではlocal repairを想定)のことで、SRではTI-LFA(Topology Independent – Loop Free Alternate)という機能でこれを実現しています。
2.6. SRv6 OAM (Operation, Administration, and Maintenance)
ping や traceroute といったトラブルシュートなどに役立てるためのSRv6機能のこと。
2.6. 今後のSRv6
- データセンタ、固定回線、キャリア回線、IoTなどに浸透していき、高度で複雑なサービスチェイニングを必要とした多くの端末、環境下でSRv6、またはSR-MPLSが利用し始めると思われる
- 最初はソフトウェア対応から進んだSRv6でしたが、様々なネットワークハードウェアで対応が進むと思われる(CiscoではSRv6-EVPN対応している模様( https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/93x/vxlan/configuration/guide/b-cisco-nexus-9000-series-nx-os-vxlan-configuration-guide-93x/m-configuring-seamless-integration-of-evpn-with-l3vpn-srv6-93x.html))
- SRv6ではホップ数分のSegment List(128bit)をEncapしなければならない事情から、パケット増大の懸念が指摘されてきました。その対策として「SRm6」が提案されています(https://tools.ietf.org/html/draft-bonica-spring-srv6-plus-06)
3. SRv6を実際に使う
現在 SRv6 は主に以下の方法でハンズオンが可能
3.1. iproute2
iproute2 はLinuxで使えるネットワークユーティリティです。 実は日頃使っているipコマンドのことで、既にSRv6を設定するために必要な機能が備わっています。
root@linux:~# ip -6 route help Usage: ip route { list | flush } SELECTOR ip route save SELECTOR (~ snip ~) ENCAPTYPE := [ mpls | ip | ip6 | seg6 | seg6local ] ENCAPHDR := [ MPLSLABEL | SEG6HDR ] SEG6HDR := [ mode SEGMODE ] segs ADDR1,ADDRi,ADDRn [hmac HMACKEYID] [cleanup] SEGMODE := [ encap | inline ] ROUTE_GET_FLAGS := [ fibmatch ]
設定には以下のように全てまたは特定のethのカーネル設定が必要になります。
sysctl net.ipv6.conf.all.forwarding=1 sysctl net.ipv6.conf.all.seg6_enabled=1 sysctl net.ipv6.conf.default.seg6_enabled=1 sysctl net.ipv6.conf.eth1.seg6_enabled=1 # 以下コマンドで事後確認 sysctl -a | grep seg6
echo 100 localsid1 >> /etc/iproute2/rt_tables echo 200 localsid2 >> /etc/iproute2/rt_tables echo 300 localsid3 >> /etc/iproute2/rt_tables echo 400 localsid4 >> /etc/iproute2/rt_tables
以下設定で encap、transit、decap それぞれが可能
ip -6 route add 2001:db10::/64 encap seg6 mode encap segs 2001:db2::2,2001:db5::2,2001:db8::2 dev eth1 table localsid1
ip -6 route add 2001:db2::2/128 encap seg6local action End dev eth1
ip -6 route add 2001:db2::1/128 encap seg6local action End.DX6 nh6 2001:db1::1 dev eth1 table localsid1
またコマンド変数の意味は以下になります また、Namespaceと組み合わせて使用することも可能です Namespaceと組み合わせれば一台のホスト上で仮想的に複数台のノードの定義と紐付けが可能になります
【ハンズオンツール】
以下githubハンズオンツール(構築/デモ手順はリポジトリ内にあります) https://github.com/vn-cdr/srv6-netns-demo
git clone <git repository> cd srv6-netns-demo vagrant up vagrant ssh sudo su - bash scripts/01_create-namespaces.sh bash scripts/02_create-quagga.sh bash scripts/03_create-ospf6.sh bash scripts/04_create_srv6.sh
パケットキャプチャで取得した際に下記の通りSRv6 Headerが確認できます
3.2. VPP
FD.ioプロジェクトで管理されているOSS仮想ルータ。 様々な機能を有している仮想ルータですが、RAMを大きく使用するため、個人にて検証する際には注意。 https://docs.fd.io/vpp/17.07/srv6_doc.html
3.3. CML (Cisco Model Lab)
CMLはCiscoの様々なルータを自由に構成して検証できる、サンドボックスツールです。 CMLを使えば Nexus-9000v や XRv-9000、ASAv など個人では大きな壁であった、NW-OS使用までの環境を瞬時に用意できます。 https://developer.cisco.com/docs/modeling-labs/#!faq/faq---cisco-modeling-labs-v2x
XRv9000 では利用できるバージョンが既にSRv6に対応しており、個人でSRv6環境を構築できます。
RP/0/RP0/CPU0:xrkv-0#show segment-routing srv6 manager Fri Apr 30 01:23:03.725 UTC Parameters: SRv6 Enabled: Yes Encapsulation: Source Address: Configured: 2001:db2::1 Default: 2001:db22::2 Hop-Limit: 255 Traffic-class: Default Config Op Mode: SRv6 SID Base Blocks: 2001:db2:2200::/40 Summary: Number of Locators: 1 (1 operational) Number of SIDs: 2 (0 stale) Max SIDs: 8000 OOR: Thresholds: Green 400, Warning 240 Status: Resource Available (0 cleared, 0 warnings, 0 full) Platform Capabilities: SRv6: Yes TILFA: Yes Microloop-Avoidance: Yes End Functions: End (PSP) End.X (PSP) End.DX4 End.DT4 End.OP uN (PSP/USD) uA (PSP/USD) uDT6 uDT4 Transit Functions: T T.Insert.Red T.Encaps.Red Security rules: SEC-1 SEC-2 SEC-3 Counters: CNT-1 CNT-3 Signaled parameters: Max-SL : 3 Max-End-Pop-SRH : 3 Max-T-Insert : 3 sids Max-T-Encap : 4 sids Max-End-D : 4 Configurable parameters (under srv6): Encapsulation: Source Address: Yes Hop-Limit : value=Yes, propagate=No Traffic-class : value=Yes, propagate=Yes Max SIDs: 8000 SID Holdtime: 30 mins RP/0/RP0/CPU0:xrkv-0#show segment-routing srv6 ? locator Locator information manager SID Manager information sid SID information across all locators(cisco-support) trace Show trace data for SID Manager RP/0/RP0/CPU0:xrkv-0#
XRv9000を使用したSRv6-EVPNは近日中に検証したいと思います。
以上