午前2時のネットワーク刷新:なぜSRv6なのか?
時刻は午前2時。私は、ついに限界を迎えつつあるレガシーなMPLSコアを見つめていました。LDPのフラップがマイクロループを引き起こし、トラフィックエンジニアリングのために構築したRSVP-TEトンネルは管理上の悪夢と化していました。最新の100Gバックボーンを拡張する中で、20年前のプロトコルに固執し続けるのは負け戦であると悟ったのは、まさにこの瞬間でした。
業界は急速にSegment Routing over IPv6 (SRv6)へとシフトしています。従来のMPLSとは異なり、SRv6は個別のラベルシグナリングプロトコルを必要としません。IPv6ヘッダー自体を使用して、「セグメント」と呼ばれる命令を運びます。お使いのハードウェアがIPv6をルーティングできるのであれば、フルプログラマブルなネットワークへの道のりはすでに半分終わったようなものです。Linuxでこれをマスターすることは、特定のベンダーのハードウェアロックインから脱却し、柔軟でオープンなインフラを構築するための最良の方法です。
SRv6 vs. 従来のMPLS:パラダイムシフト
パケットを転送する方法が根本から変わろうとしています。従来のMPLSは、脆弱な32ビットラベルのスタックに依存しています。経路上のすべてのルーターは、LDPやBGP-LUを使用して、それらのラベルが何を意味するかを合意しなければなりません。SRv6は、128ビットのIPv6アドレス自体を命令セットとして使用することで、この複雑さを解消します。
主な違い
- 従来のMPLS: LDP/RSVPを必要とします。すべてのホップで状態(ステート)を維持します。ベンダー間でラベルの不一致が発生すると、トラブルシューティングは頭痛の種になります。
- SR-MPLS: LDPを排除しますが、MPLSデータプレーンは維持します。妥協案としては悪くありませんが、古いチップセットではラベル深度の制限に依然として悩まされます。
- SRv6: ラベルは不要です。「セグメント識別子」(SID)は単なる標準的なIPv6アドレスです。MPLSを認識するアンダーレイを必要とせず、ネイティブな到達性とエンドツーエンドのプログラマビリティが得られます。
実環境におけるメリットとデメリット
本番環境のコアを移行する前に、実際の導入現場で見られるトレードオフを検討する必要があります。
メリット
- 運用の簡素化: ついにLDPとRSVPを廃止できます。IGP (IS-ISまたはOSPFv3) だけが重役を担います。
- きめ細かなトラフィックエンジニアリング: 宛先IPv6プレフィックスを変更するだけで、低遅延の音声トラフィックを特定のパスに誘導できます。
- 統合されたモニタリング: すべてがIPv6です。既存のNetflowコレクターやWiresharkフィルターは、MPLSスタックの下を覗き込む必要がないため、そのまま動作します。
デメリット
- MTUオーバーヘッド: これが最大の課題です。Segment Routing Header (SRH) に追加されるSIDごとに16バイトが加算されます。5つのSIDを含むパスの場合、MTUが80バイト失われます。
- ハードウェアオフロード: LinuxカーネルはソフトウェアでSRv6を完璧に処理しますが、Intel i350のような古いNICはカプセル化をオフロードしません。これにより、10Gbps以上のリンクではCPU使用率が急上昇する可能性があります。
推奨セットアップ
SRv6のサポートはLinuxカーネル5.4以降で成熟してきました。しかし、安定した本番環境のためには、SRH処理ロジックの既知のバグを避けるため、5.15以降を推奨します。
- OS: Ubuntu 22.04 LTS または Debian 12
- ルーティングスイート: FRRouting (FRR) バージョン 8.5 以上
- カーネル: 5.15以上(
CONFIG_IPV6_SEG6_LWTUNNELが有効であること)
実装:SRv6ノードの設定
このセットアップでは、LinuxノードをSRv6 LER (Label Edge Router) として設定します。コントロールプレーンにはIS-ISを使用し、このノード固有ের命令に使用されるIPv6ブロックである「ロケーター(Locator)」を定義します。
ステップ 1: カーネルの準備
IPv6フォワーディングを有効にし、インターフェースでSRv6パケットを処理するようにカーネルに明示的に指示する必要があります。以下のコマンドを実行してください:
# IPv6フォワーディングを有効化
sudo sysctl -w net.ipv6.conf.all.forwarding=1
# バックボーンインターフェース(例:eth0)でSRv6処理を有効化
sudo sysctl -w net.ipv6.conf.eth0.seg6_enabled=1
sudo sysctl -w net.ipv6.conf.lo.seg6_enabled=1
ステップ 2: FRRoutingのインストール
ディストリビューションのデフォルトパッケージは使用しないでください。高度なSRv6機能に対しては古すぎることが多いためです。代わりにFRRの公式リポジトリを使用します。
curl -s https://deb.frrouting.org/frr/keys.asc | sudo apt-key add -
FRR_REPO="deb https://deb.frrouting.org/frr $(lsb_release -s -c) frr-stable"
echo "$FRR_REPO" | sudo tee /etc/apt/sources.list.d/frr.list
sudo apt update && sudo apt install frr frr-pythontools
ステップ 3: SRv6ロケーターの定義
ロケーターは、ノードの機能を象徴するアドレスのプールです。/etc/frr/daemons を編集して isisd=yes に設定し、FRRシェル (vtysh) に入ります。
conf t
!
segment-routing
srv6
locators
locator MAIN
prefix 2001:db8:1::/64
exit
!
exit
!
ステップ 4: IS-ISとSRv6の連携
IS-ISは、他のルーターがあなたのセグメントに到達する方法を知るために、ネットワークの残りの部分にロケーターを広報する必要があります。以下の設定を使用します:
router isis 1
net 49.0001.0000.0000.0001.00
is-type level-2-only
topology ipv6-unicast
!
segment-routing srv6
locator MAIN
!
interface eth0
ipv6 router isis 1
isis network point-to-point
exit
!
ステップ 5: データプレーンの確認
魔法はカーネルのlocalsidテーブルで起こります。ここでOSは、入ってきたIPv6 SIDを、トラフィックのデカプセル化やVRFへのクロス接続などの特定のアクションにマッピングします。
# 有効なSRv6 localsidを表示
ip -6 sr localsid show
期待される出力: 2001:db8:1::1 dev lo action End。これにより、ルーターがそのアドレス宛のパケットを標準的なホストパケットではなく、SRv6エンドポイントとして処理することが確認できます。
現場からの総括
LinuxでSRv6を導入するには、プレフィックスに対する考え方を変える必要があります。もはや静的な回線を管理しているのではなく、プログラマブルなアドレス空間を管理しているのです。最初のテストセグメントを移行したとき、すぐに得られたメリットは可視性でした。ルーティングテーブルはすっきりし、LDPネイバーのタイムアウトを追いかける必要もなくなりました。プライベートクラウドや地域ISPを構築しているのであれば、LinuxとFRRoutingは、現代の5Gコアを支える技術を習得するための最も費用対効果の高い道を提供してくれます。

