セグメントルーティングとは?

セグメントルーティング(Segment Routing) とは、ソースルーティング(Source Routing)によるパケットフォワーディング(Packet Forwarding)技術です。具体的には、

  • パケットを送信する発側ノード(ソースノード:Source Node)は、着側ノード(Destination Node)までの経路と経由するノードにおける処理を、転送順序で、セグメント情報として定義します。
  • セグメント情報として定義される、経由するノードにおける処理としては、例えば、以下のような処理があります。
    • セグメント情報がエンコーディングされたヘッダ情報の削除処理を行う(Decapsulation処理)
    • ノードで定義された別のルーティングテーブルを確認して転送処理を行う(Look up処理)、など。

これまでの基本的なルーティング方式では、さまざまなルーティングプロトコル処理により、各ノードでルーティングテーブルを構築します。例えば、ネットワーク上の任意の発着間で、リンクコストの合計値が最小となる経路でパケットが転送されるよう、各ノードにおいて、ルーティングテーブルが構築されます。発側ノードから送出されたパケットの着側アドレスをもとに、各ノードでは、構築されたルーティングテーブルを参照し、次に転送されるべき最適なノードに向けて、パケットがフォワーディングされます。これに対し、セグメントルーティングでは、事前に策定したルーティングポリシー(例えば、「この着側ノードに対し、策定した経路にそってパケットを転送する」、「このノード・リンクには、決して経由させないで、着側ノードにパケットを転送する」、など。)を、セグメント情報を用いて定義し、発側ノードで、このポリシーをパケットにインプリメントすることで、ネットワークサービス管理者は、さまざまな転送ポリシーを実現できる、ということが大きなメリットとなります。

従来のフォワーディング方式でも、トラフィックエンジニアリング技術として、転送経路のポリシーを設定し、RSVP-TE(Resource Reservation Protocol - Traffic Engineering、 MPLS-TE(Multi-Protocol Label Switching - Traffic Engineering)などの複雑な通信制御プロトコルを用いて、冗長性のある経路や負荷分散を図るポリシーを実現します。しかし、セグメントルーティングでは、これら複雑な通信制御プロトコルを組み合わせて、ポリシーを実現する従来の方式に比べ、より柔軟に、経路ポリシーを定義・導入することが可能になるため、今後有用なフォワーディング技術として注目されています。

セグメントルーティングのフォワーディングプレーン

セグメントルーティングでは、セグメント情報をパケットヘッダーにエンコードすることで、ソースルーティングを実現します。このセグメント情報を組みこむ方法として、2つの方法があります。

一つは、MPLSのラベル(Label)を用いたSR-MPLS(Segment Routing - Multi-Protocol Label Switching)による方式です。この方式では、セグメント情報は、MPLSのラベルとして表現されます。経由するノード、リンクを示すセグメント情報を順番にMPLSのラベルを用いて、これをスタックしていきます。MPLSによるセグメントルーティングでは、管理するドメイン内(例えば、AS(Autonomous System)ドメイン)で共通して利用するSRGB (Segment Routing Global Block) というセグメント値ブロックを定義します。各ノードでは、SRGBから、ドメイン内でユニークなセグメント値が定義されます。加えて、各ノードでは、転送すべきリンクを示すローカルなセグメント値も定義することができます。これら情報は、リンクステート(Link-State)タイプのIGP(Interior Gateway Protocol) ルーティングプロトコル(例えば、IS-IS(Intermediate System to Intermediate System) 、 OSPF(Open Shortest Path First)など)、または、ASドメイン間をまたがって、BGP-LS(Border Gateway Protocol – Link State)などのプロトコルを用いて、ネットワーク全体に伝えられます。各ノード、または、策定したポリシーに従う経路計算を専門に行うノードでは、グラフとしてのノード、リンクの接続構成と設定されたリンクコストからなるネットワーク全体構成情報(Link State情報)を把握し、策定した転送ポリシーに従い、経路を計算します。発側ノードでは、計算結果に従い、セグメント情報を定義したMPLSラベルを作成、これをスタックして、MPLSネットワークにこれを転送します。図1に簡単な事例を示します。

図1 SR-MPLSの例

図1では、5つのノードから構成されるネットワークがあります。各ノードのインデックスにSRGBとして定義したブロックの初期値16000を加えた値が、各ノードを示すセグメント値(SID : Segment Identifier)となります。例えば、図1のノード1では、SIDとして16001が定義されています。また、図1のノード4では、ノード5に向けたリンクを示すローカルなセグメント情報(24001)が定義されています。このネットワークでは、セグメント情報を伝搬する手段として、OSPFのようなLink-State型のルーティングプロトコルが動作し、各ノード間をMPLSによるLSP(Label Switched Path)が設定されたアンダーレイネットワークが機能しているとします。セグメントルーティングによる転送ポリシーを定義しなければ、ノード1を発側ノードとし、ノード5を着側ノードとするLSPの経路は、各リンクコストが同一であれば、最小コストの経路となる、ノード1、ノード2、ノード5の順番の経路となるLSPになります。

ここで、ネットワーク管理者は、ネットワークの負荷を分散させるために、例えば、ノード1において、ノード5へ転送するトラフィックに対して、ノード4を経由する転送ポリシーを導入するとします。この場合、発側ノードであるノード1では、16004、26001のラベルを付けて、セグメントルーティングを行うこととします。ノード1は、16004のラベルを受けて、ノード4に向けてパケットを送出します。この場合、SID(16004)のノード4への経路は2経路あることから(ノード1、ノード2、ノード4を経由するLSPとノード1、ノード3、ノード4を経由するLSP)、 負荷分散が実現されます。次にノード4に到着すると、26001のラベルを参照し、ノード4で定義されたローカルセグメントが意味するリンクに、到着したパケットをフォーワードします。結果、最終的に、着側のノード5にパケットが到着します。

通常のMPLSネットワークで同様なトラフィックエンジニアリング処理を実現しようとすると、RSVP-TEなどの制御信号を送受信する仕組を必要とすることに対し、セグメントルーティングでは、経路計算結果を発側ノードでセグメント情報を示すラベルを設定すればよく、従来のMPLSトラフィックエンジニアリングと比べ、軽量で柔軟性に富むということが言えます。

もう一つの方法は、IPv6の拡張ヘッダを利用するSRv6と呼ばれる方法になります。経由するノード、パケット処理を定義した識別子は、SRv6の場合、IPv6アドレスになります。転送ポリシーとして、経由するノード、パケット処理を定義したIPv6アドレスを順番に、SRH(Segment Routing Extension Header)に格納します。IPv6パケットのアウターヘッダ(Outer Header)には、SRHで定義されたアドレスが、定義したIPv6アドレスがノードを経由するたびに、設定されます。SRHに定義された、SRv6機能が有効化された、アドレスにパケットが到着すると、そこで定義された処理が実行されます。SRHにその次に定義されたアドレスを、アウターヘッダの着側IP アドレスとして設定し、パケットがフォワーディングされます。この処理を繰り返し、SRHで定義されたアドレスとそこで行われる処理が実行されたあと、最終的なオリジナルの着側ノードにパケットがフォワーディングされます。

図2では、SR-MPLSと同様な5つのノードから構成されるIPv6のネットワークがあります。各ノードのインタフェースには、IPv6アドレスが定義されています。図2は、IPv4のサイト間を結ぶVPN(Virtual Private Network)の事例を示しています。ノード1のLAN側インタフェースの先には、10.0.1.0/24のプレフィックスを所有するLANセグメントが接続されています。一方、ノード5のLAN側インタフェースの先には、10.0.2.0/24のプレフィックスを持つLANセグメントが接続されています。この2つのLANセグメントをSRv6の機能を使って、VPNとして機能させる事例となります。

図2 SRv6によるVPNサービスの例

SRv6では、到着したパケットに対する処理として、さまざまな処理が定義され、Linux上に実装が行われています。今回のコラムでは、すべてを紹介しませんが、事例としてIPv4VPNで用いられるパケット処理機能として、End.DX4を紹介します。図2は、IPv4 VPNの事例となります。図2では、IPv4プレフィックスのLANセグメントがノード1、ノード5の両端に接続されています。このサイト間で、疎通を可能とするためには、SRv6の機能を用いて、以下のようなSRHを定義することで、実現をします。

LAN1セグメントが接続されたノード1は、エッジルータとして機能します。図2では、LAN1から、[S:10.0.1.10、D:10.0.2.10]というヘッダをもつパケットがノード1に到着します。ここで、Sは、発側アドレス、Dは着側アドレスを意味します。後述するENCAP処理を実行できるように、SRv6機能が有効化されたノード1では、IPv4パケットをカプセル化して、SRHとIPv6のアウターヘッダを設定します(ENCAP処理)。図2では、ノード1の上に、説明のために、各ヘッダの情報が簡易に記述されています。IPv4のヘッダの上には、SRHとして2つのIPv6アドレスが定義されています。SRHの上には、最初に経由するアドレスとして、SRHの中のSID:4::2が、アウターヘッダとして設定されています。SRHの2つのアドレスは、SID:4::2は、最初に経由するノードのインタフェースアドレス、次の、SID:2002:10:0:2::1は、その次に経由するアドレスを意味します。ここで、SID:2002:10:0:2::1は、パケット処理を意味する識別子(localsid)となります。詳細については、後述します。図2では、上記ENCAP処理を実現するためのiproute2[3]によるコマンドを記載しています。

ノード1から上記のように、SRHを加えたパケットは、アウターヘッダで指定されたアドレスに向けてネットワークを疎通します。図2の場合、ノード1からノード5によって構成されたネットワークでは、OSPFv6、IS-ISといったLink State型のルーティングプロトコルを用いて、アンダーレイネットワークが構成されているとします。パケットは、アウターヘッダで定義された、ノード5のインタフェースに定義されたアドレス4::2に向けて転送されます。

ノード5では、後述するDECAP処理を実行できるように、SRv6機能を有効化します。ノード5のインタフェース4::2に到着したパケットは、SRHで定義された残りのSID:2002:10:0:2::1をアウターヘッダとします。SID:2002:10:0:2::1は、ノード5内で、定義されたパケット処理を意味する識別子(Localsid) になります。ノード5では、SID:2002:10:0:2::1に向けて到着したパケットに対して、(a) SRHヘッダを取る、(b)SRHヘッダを取ったIPv4パケットを、定義したNext Hopに向けて、定義したインタフェースにフォワーディングする、というパケット処理(DECAP処理)を行います。これをSRv6の設定記述として、SRv6の機能として実装されたEnd.DX4というコマンドを用いて、ルーティングテーブルで定義することで、処理を有効化します。図2では、上記DECAP処理を実現するためのiproute2によるコマンドを記載しています。DECAP処理により取り出されたIPv4パケットは、ノード5に接続されたLANセグメントに転送されます。

なお、図2では、LAN1からLAN2に向けて必要な設定のみ、説明のために記載していますが、レスポンスを返すために、逆方向に対しても、同様な設定を行う必要があります。また、SRv6で、IPv4VPNを実現するには、Linuxのシステムコマンドを用いて、すべてのノードにおいて、IPv6 Forwarding機能の有効化、また、ノード1、ノード5では、Segment Routing機能の有効化、IPv4において、rp_filter機能の無効化の設定が必要になります。

ここまで、SRv6によるVPNサービスの主にデータプレーンの機能を中心に説明しました。上記の例のように、IPv4VPNサービスを実現するには、ENCAP処理、DECAP処理を定義した設定をルーティングテーブルに設定する必要があります。これら設定情報をマニュアルでエッジルータに設定する、または、コントロールプレーンとして、エッジルータ間でこれら情報を共有し、ソフトウエアにより、設定を行うサービス制御を開発し、VPNサービスを実現します。

MPLSでも、VPNを実現することは可能です。この場合、VPNユーザーのLANセグメントが接続するPE(Provider Edge)ルータ間において、RSVP-TEなどのプロトコルを用いて、LSPを設定すること、MP-BGP(Multi-Protocol BGP)によりPEルータ間で、LANセグメントのプレフィックスを交換することが必要になります。また、自ノードとPEルータにおいての接続設定が必要になります。これらは、コアネットワークのサービス事業者への設定依頼事項となり、変更するまでのタイムラグが発生することが想定されます。SRv6によるVPNでは、コアネットワークがIPv6に対応していれば、接続するエッジル―タでSRv6機能を有効化し、必要なパケット処理など、設定内容をVPNユーザーが自分で設定することが可能であるため、コアネットワークのサービス事業者に設定依頼をすることなく、VPNユーザーの状況に応じて、対応できる柔軟性があります。

セグメントルーティングの主な利用事例

セグメントルーティングは、上記の転送方式の特徴を生かして、さまざまなサービスが提案され、導入を進めているところもあります。ここでは、3つの事例を簡単に紹介します。

多様なトラフィックエンジニアリング

セグメントルーティングでは、さまざまな転送ポリシーを定義することで、多様なトラフィックエンジニアリングを実現することができます。例えば、転送ポリシーにより、以下のような経路を設定したりします。

  • 低遅延サービスを提供する経路、
  • 広帯域のサービスを提供する経路、
  • IGPのコスト合計が最小となる経路、
  • トラフィックエンジニアリング用に定義したコスト合計が最小となる経路、
  • 指定した特定のノードの通過を禁じた経路、
  • 発着ノード間において、Disjointな複数経路、など

このように、さまざまなパケット転送ポリシーを定義することで、多様で、きめ細かなトラフィックエンジニアリングを実現することができます。図3では、低遅延経路と広帯域経路の2つをそれぞれBlue, Greenの色分けを定義して設定したトラフィックエンジニアリングの例です。例えば、遠隔操作アプリケーションのトラフィックを低遅延経路に、動画配信アプリケーションのトラフィックには、帯域の広い経路を用意するなどの利用形態が考えられます。

図3 SR-MPLSによるトラフィックエンジニアリング(SR-TE)の例

このように、通信経路に適用するさまざまなポリシーに対して、セグメントルーティングによるトラフィックエンジニアリング機能を、グループごとに定義、ネットワークリソースをグループごとにスライスすることができます。また、IGPの拡張機能としてFlex-Algoと呼ばれる、マルチトポロジルーティング技術も開発が進んでいます[4]。遅延重視、ベストエフォートなど、経路計算アルゴリズムごとに、ネットワークトポロジ情報データベースを所有して、サービスごとにパス制御するという方式として期待されます。

このような多様なトラフィックエンジニアリングを実現するために、エッジルータではなく、専用の機器にネットワーク情報を集約し、さまざまな転送ポリシーを定義し、最適な経路を計算、計算結果をエッジルータに引き継ぐ機能も開発されています。これらの話題は、別の機会とします。

VPN(IPv4, IPv6)

図2で説明のための事例として紹介したように、IPv6が動作するコアネットワークにSRv6機能が有効化されたエッジノードを接続し、オーバーレイの形で、VPNサービスを実現することができます。図2の事例では、IPv4のVPNを紹介しましたが、もちろん、IPv6のVPNサービスを提供することも可能です。先に記述したIPv4VPN用に、パケットのDECAP処理を行うEnd.DX4に対し、IPv6用には、End.DX6というDECAP機能が実装されています。VPNをテナントごとに分け、DECAP処理後に、それぞれテナントごとに定義されたルーティングテーブルをLookupすることが可能なEnd.DT6という機能も実装されています。SRv6に関係したこれらパケット処理機能は、Linuxのカーネルのバージョンにより、実装済のもの、開発中のものとあります。

サービスチェイニング

SRv6では経由するノードを指定できること、各ノードで定義されたルーティングテーブルをLookupすることができることから、さまざまなサービスを提供するノードが、SRv6対応であれば、これら各種サービスを行うノードを数珠繋ぎに経由させて一連のサービスを提供するサービスチェイニングを行うことができます。例えば、IPS (Intrusion Prevention System) 、 IDS (Intrusion Detection System) 、Firewallなどのセキュリティサービスを経由するような事例も考えられます。図4にサービスチェイニングのイメージ図を示します。経路とこれに対応するSRHとアウターヘッダの関係を示しています。SRHヘッダには、ノードがSRv6対応でない場合でも、SREXT[5]というSR機能を拡張した機能をもつノードを経由することで、サービスノードとの間で、一時的にSRHを預かり、次のノードに移る際に、これを再度ヘッダに設定する機能の開発事例も報告されています。

図4 SRによるサービスチェイニング

まとめ

今回は、セグメントルーティングの基本となる概念、主に、データプレーンにおける機能に関する基本的な内容について説明しました。

SR-MPLSについては、

  • さまざまなポリシーを考慮した経路計算を行う機能との組み合わせ、具体的には、ネットワーク全体の構成情報を集約し、ポリシーにそった経路計算とこれをネットワークで実現するために、発ノードに必要や情報を提供するフレームワーク
  • セグメントルーティングで構成されたトンネルをドメイン間で紡ぐスティッチング
  • ネットワークスライシング、など、

また、SRv6では、

  • End.DX4について、説明のための事例として紹介しましたが、他にもさまざまな機能が、Linuxに実装されていますし、開発中のものもあります。
  • Linux上での具体的な設定方法や事例、など

といった、今回のコラムでは紹介しきれていない内容も多々あります。これら詳細は、また別の機会とします。

SRv6のデータプレーンを定義するために必要な設定をマニュアルで設定するのではなく、ソフトウエアで、これを定義、実現することが不可欠となります。現在、SDIソリューション担当では、NTT研究所との技術的な連携体制を通じて、セグメントルーティングに関するノウハウ、技術の蓄積を図っています。

Reference

Segment Routingに関しては、さまざまなサイトで技術紹介、事例が紹介されています。ここで、主要な2つのサイトを紹介します。

本文中で出てきた、iproute2、Flex Algo、SRextに関するURLを参考として以下に記します。

Writer Profile

ソフトウェアソリューション事業本部
ソフトウェア基盤事業部 SDIソリューション担当
プリンシパル
山田 博司