こんにちは.最近は呪術廻戦をアニメで見て漫画を全巻揃えてしまいました.いつになってもバトル漫画は良いものです.今回はNTTコミュニケーションズさんにより開催されたインターンシップに参加して二週間ネットワークをゴニョゴニョしてきました.

# 参加まで

# 応募

本インターンシップの存在は友人に教えられて知りました.インターンシップの内容が非常に興味深いものばかりだったためどのポストに応募するか非常に悩みましたが次世代キャリアネットワーク(Autonomous Network)開発エンジニアというポストに応募することにしました.業務内容はSegment Routingを用いたネットワーク構築や制御の検証/開発というものでした.

# 選考

選考はエントリーシートを提出してから何回かの面接・面談を経て合格の連絡をいただきました. Segment Routingなどルーティングプロトコルに関して完全に素人なのに選んでいただきありがたかったです.

# 本番まで

インターンシップ本番までにインターンシップで使用するMacと大量のお菓子と飲み物が届きました.残念ながら写真を撮り忘れてしまいましたが非常に美味しくいただきました.

# 取り組んだこと

上述しましたが僕が今回参加させていただいたポストは次世代キャリアネットワーク(Autonomous Network)開発エンジニアです. 業務内容は次世代商用インフラを想定した検証ネットワークの構築というものでした.SRv6という新しい経路制御技術を用いてネットワークを構築・経路制御を検証しました.

# 背景

本検証の背景としてコストの課題があります.NTTコミュニケーションズのように,サービスや目的ごとに個別のネットワークを所有することは運用コストや設備コストがかかります.本検証では,複数のネットワークを統一して構築・運用することでコストを削減することを目指します.そこで有用だと考えられる技術がSRv6です.SRv6は既存のIPv6網を使用して構築することができ,シンプルなネットワーク構成を保つことができます.また,Function機能などを有しており拡張性などにも優れています.そのため,今回のインターンシップではSRv6を用いたネットワークの検証を行いました.

# SRv6

軽くSRv6という技術について触れます.SRv6に関して僕は有識者ではないためここは資料を参考に概要程度に留めます.詳細は参考資料を参照ください.

# 概要

SRv6とはSegment Routing IPv6の略です.名前の通りセグメントルーティングを実現する技術で,そのデータプレーンにIPv6を使用します. セグメントルーティングではルーティングポリシーに合わせた経路や各ノードの行う処理の情報をパケットに格納して転送することでより柔軟な経路制御を実現することができます. セグメントルーティングを実現する手法としてMPLSを利用するSR-MPLSとIPv6を利用するSRv6があります.今回SR-MPLSについては触れません(詳しくないので). SRv6ではIPv6の拡張ヘッダを用いてSRH(SR Header)を付与します.SRHに経路ポリシーを定義することでSRv6を解釈できるネットワーク内で柔軟に経路制御を行うことができます. また,SRv6においてパケットの処理方法を識別する識別子(SID)はIPv6アドレスを使用します.

SRv6 SIDには

  • Locator: セグメントをペアレントノードへRouteするためのビット
  • Function: ペアレントノードにおいて取られるActionを示すビット
  • Argument(Optional): 最後のビットはFunctionで参照される引数

の三つのフィールドがあります. ここで僕が驚いたことはIPv6アドレス自体にFunctionなどの役割を持たせていることです.アドレスにアドレス以外の役割を持たせることに慣れるのに時間がかかりました. Functionフィールドにパケットが到着したノードが行うべき処理を定義することで様々な機能を実現しています.

# 特徴

SRv6の特徴をいくつか紹介します.

  • データプレーンにIPv6を使用
    • SRv6に対応していないIPv6ネットワークをそのまま土管として使用することができる
    • IPv6アドレスをSIDとして使用
  • SRHの付与方法にはEncapulationモードとInsert(Inline)モードがある
    • EncapモードはIPv4などに対応可能
    • Insertモードはヘッダのオーバーヘッド削減
  • SRv6 functionによる高い拡張性
    • Well known functionがいくつか定義されている
    • 任意の機能を追加可能

# SRv6のユースケース

# VPN

SRv6を使用することでIPv6ネットワークをアンダーレイネットワークとしてオーバーレイネットワークを構築することができます.オーバーレイネットワークを構築することでネットワークを柔軟に分割することが可能になります.

# Traffic Engineering

Traffic Engineeringはポリシーに従い経路を柔軟に制御する技術のことを指します.SRv6を用いてトラフィックエンジニアリングを実現することで目的に合わせたネットワークの運用が可能になります.

# Service Function Chaining

Service Function Chainingはネットワーク上の機器を特定の順番で繋ぎ,サービスとして提供する技術です.特定のソースからのパケットに対して飲みファイアウォールを通したいというような状況で有効です.

# 参考資料

# 検証

今回検証したのは以下についてです.

  • [VPN] End.DT6というSRv6 Functionを使用したIPv6 over IPv6のL3VPNの実現
  • [VPN] End.DX4を使用したIPv4 over IPv6のL3VPNの実現
  • [TE] SRv6を用いた柔軟な経路制御
  • [SFC] End.ATを使用したService Function ChainingとそのXDP実装の検証

検証環境としてUbuntu20.04.2 LTS / Linux Kernel 5.4.0-65-generic, iproute2-ss200127を使用しました. 検証内容についてそれぞれを軽く紹介します.

# End.DT6というSRv6 Functionを使用したIPv6 over IPv6のL3VPNの実現

今回の検証では図のようなネットワークを検証に用いました. ntt-fig1 検証ネットワークではTenant-AとTenant-Bという二つのテナントが用意されていて,二つのテナントは同一のSR domain(SRv6が有効なネットワーク)に接続されています.Tenant-A, BはそれぞれRouter-1, 4でVRF A, Bにより分離されています. 今回はEnd.DT6というFunctionを用いて属するVRFに応じて任意に異なる経路を選択できるように設定し疎通を検証しました. SRv6の設定追加に関してはLinuxのiproute2を使用します.詳細は割愛しますがいくつかのSRv6 Functionに対応しています. End.DT6を使用したper-VRF IPv6 over IPv6 L3VPNのフローは以下です.

  • SE domainの入り口に到着したIPv6パケットに対して宛先を判断してH.Encap(もしくはH.Insert)によりSRHを付加します.
  • 各ノードはSRHを参照し次のノードを判断して転送を行います.(End)
  • End.DT6は付加されたSRHをDecapし,対応するVRFの経路表を参照して転送を行います.
# 結果

End.DT6を使用したL3VPNは問題なく実現することができました. 例として hostA-1, hostB-1にfd00:100::2, hostA-2, hostB-2にfd00:200::2のように同一のアドレスを割り当てて,

hostA-1(hostB-1)<fd00:100::2> -> hostA-2(hostB-2)<fd00:200::2>
1

に対してpingを飛ばすと意図したホストにそれぞれ届くことが確認できました. 検証ではpingtcpdumpを使用して確認しました.

一方で,今回検証したper-VRF IPv6 over IPv6 L3VPNではSRHの付加方式ににはH.Encap(Encapモード)とH.Insert(Insertモード)があります.今回使用したiproute2ではEncapモードは正常に動作しますが,Insertモードは実装が完全ではなくInsert自体は行われますが,出口で正常にDecapが行われないということが判明しました.

# End.DX4を使用したIPv4 over IPv6のL3VPNの実現

検証ネットワークとして図のようなネットワークのTenant-Cを使用しました. ntt-fig2 End.DX4を使用したper-CE Ipv4 over IPv6 L3VPNのフローは以下です.

  • SE domainの入り口に到着したIPv6パケットに対して宛先を判断してH.Encapを行う.
  • 各ノードはSRHを参照し次のノードを判断して転送を行います.(End)
  • End.DX4は付加されたSRHをDecapし,予め設定されたNext Hopに対して転送を行います.
# 結果

こちらも同様に問題なく動作しました.

# SRv6を用いた柔軟な経路制御

こちらでは上で作成したEnd.DT6, End.DX4の設定を施したネットワークに対して様々な経路を定義して定義通りに転送されるかを検証しました.

# ループを作ってみる

経路定義にてループを定義してみました.通常のネットワークではループを定義することはできないのでこのような定義ができるのはSRならではと言えます. 具体的には

hostA-1 -> router-1 -> router-2 -> router-3 -> router-1 -> router-2 -> router-4 -> hostA-2
1

のような経路を定義して疎通が確認できました.

# SRv6非対応なIPv6ノードにSRv6パケットを転送させる

SRv6の特徴にIPv6ネットワークをバックボーンのネットワークとして使用できることがあります. SRv6はIPv6ヘッダの宛先アドレスを書き換えながら転送を行うため,SR domain内にSRv6非対応なノードが存在していたとしても,そのノードには単なるIPv6パケットとして認識されるため正常に転送を行うことが可能です. 具体的にrouter-2に対してSRv6を無効化して

hostA-1 -> router-1 -> router-4 -> hostA-2
1

のようなSRv6の経路を設定してもrouter-1, router-4間のバックボーンネットワークで最短経路としてrouter-2を経由するように定義されているためパケットは

hostA-1 -> router-1 -> (router-2) -> router-4 -> hostA-2
1

という風に転送されました.

# End.ATを使用したService Function ChainingとそのXDP実装の検証

2019 ShowNetのNOCにより,IPv4パケットに対しService Function Chainingを実現するためのFunctionとしてEnd.ATが提案されています. こちらはiproute2には実装されていないため,NTTコミュニケーションズのedenさんが作成されたXDPを用いた実装を使用して検証しました. リポジトリはこちら edenden/end.ac (opens new window) 検証ネットワークはEnd.DX4で使用したネットワークを使用しました. router-5でEnd.ATのプログラムを動作させて検証します. End.ATはService Function Chainingを実現するためにSR domain外で動作するFunction(サービス)にパケットを転送する機能を提供します.そのためにEnd.ATでは一度SRHをDecapしてFunctionにパケットを渡します.この時,Functionから帰ってくるパケットに対してもう一度SRHを適切に付加する必要があるためSRHをキャッシュしておきDecapしたIPv4パケットのTOSフィールドに識別値を埋め込んで送出します.帰ってきたパケットのTOSフィールドを確認して対応するSRHをもう一度付加することで正常な転送を実現しています.

# 結果

XDPを使用するプログラムを動作させることは特別な設定が必要だったり特定用途に限定して実装してるため動作させることに少し苦労しましたが社員の方々にサポートしていただきながらなんとか検証することができました. 実際にService Function Chainingが動作していることを確認できてよかったです. また,XDPのプログラムを自分で変更して動作させることに挑戦しました.IPv4のTosフィールドに書き込まれる値を変更して動作させることには成功したものの挙動そのものを変更させることはタイムアップとなってしまいました.残念です.

# まとめ

今回はSRv6という新しい技術で自分自身前提となる知識もほとんどない技術に挑戦させていただく機会をいただきました. 新しい技術を学ぶことはいつでも楽しいものです. 今回のインターンシップを通してネットワークやパケット処理に対して興味が深まりました. 貴重な機会をいただいたNTTコミュニケーションズ様に感謝します. また,メンターの方をはじめとした社員の方々には全日程リモート開催にもかかわらず懇親会やLT会など期間中様々な企画を開催していただきありがとうございました. 最後に本ブログを執筆するために資料の使用を快く許諾していただきましてありがとうございます.非常に楽しいインターンシップでした.