手当たり次第に書くんだ

飽きっぽいのは本能

VyOS VPP 導入検討:高機能な実運用ルーターに VPP をそのまま適用する難しさ

はじめに

VyOS rolling では VPP dataplane の利用が進みつつあり、従来の Linux kernel dataplane とは異なる高速なパケット処理基盤として注目できます。VPP / DPDK を利用することで、単純な L3 forwarding や特定の dataplane 処理において性能上の利点を得られる可能性があります。

一方で、実運用中のルーターに VPP を導入する場合、単純に「interface を VPP に置き換えればよい」という話にはなりません。特に VyOS の通常機能を組み合わせて、Firewall、NAT、PBR、QoS、OSPF、DHCP、DNS forwarding、VPN などを一台に集約している構成では、VPP 化は interface の置換ではなく、dataplane の責任分界を再設計する作業になります。

本記事では、自宅インフラの物理 VyOS ルーターを対象に、VyOS VPP の導入可能性を検討した結果を整理します。

対象環境の概要

検討対象は、実運用中の物理 VyOS ルーターです。

このルーターは、単純な Ethernet / L3 forwarding 装置ではなく、以下のような複数の機能を同時に担っています。

  • IPv4 / IPv6 dual stack routing
  • OSPF / OSPFv3
  • Static route redistribution
  • Policy Based Routing
  • Firewall
  • NAT44
  • NAT66
  • PPPoE
  • OpenVPN site-to-site
  • GRE tunnel
  • DHCP server
  • DNS forwarding
  • NTP
  • Web proxy
  • QoS
  • management VRF
  • Prometheus exporter
  • LLDP

interface 構成としては、内部側に eth1bond0、外部側に eth4pppoe0、管理系に eth0 + mgmt VRF、VPN / tunnel 系に vtun1000tun1000 が存在します。

このうち特に重要なのが bond0 です。bond0 は単なる内部 uplink ではなく、OSPF / OSPFv3、DHCP、QoS、Firewall trust、PBR の適用点になっています。

最初の仮説

当初は、VPP の導入候補として bond0 が最も自然に見えました。

理由は単純です。bond0 は内部 core 側の高速転送経路であり、MTU 9000 の jumbo frame を使用し、物理 NIC を LACP bonding しているためです。高速 dataplane の恩恵を受ける対象としては、外部 PPPoE 側よりも内部 forwarding 側のほうが適しているように見えます。

しかし、設定を確認すると bond0 は単純な forwarding interface ではありませんでした。

bond0 には IPv4 / IPv6 の Policy Based Routing が直接適用されており、source が public 系 prefix に該当する通信を routing table 10 に振り分けています。そして table 10 の default route は tunnel 側に向いています。

概念的には、以下のような構造です。

bond0 ingress
  ├─ 宛先 private / ULA は通常経路
  ├─ OSPF は通常扱い
  └─ source public は table 10
        ├─ IPv4 default -> tunnel next-hop
        └─ IPv6 default -> tunnel next-hop

つまり bond0 は、高速転送の入口であると同時に、経路制御上の重要な分岐点でもあります。

VPP 化で問題になる点

VyOS VPP を利用する場合、パケット転送の主経路は Linux kernel dataplane ではなく VPP dataplane 側へ移ります。

そのため、Linux kernel 側の interface に適用されている機能は、そのままでは VPP dataplane 上の転送に効きません。

今回の構成では、特に以下が問題になります。

機能現行構成VPP 化時の論点
PBRbond0 ingress に適用pure VPP path では kernel PBR が効かない
FirewallVyOS firewall / nftables 前提VPP path では kernel firewall の適用点を通らない
QoSbond0 egress に適用kernel QoS の前提が崩れる
OSPF / OSPFv3bond0 / tun1000 / lo で動作FRR と VPP / LCP の境界確認が必要
DHCPbond0 / eth1 で listenkernel service への受信経路が論点になる
NAT44pppoe0 masqueradePPPoE と絡むため VPP 化しにくい
NAT66eth4 masqueradeVPP 側での再現性確認が必要
OpenVPNvtun1000VPP の主対象外
management VRFeth0管理アクセス維持のため kernel 側に残すべき

この時点で、VPP 化は「interface を置き換える作業」ではなくなります。

PBR、Firewall、QoS、NAT、service listen、routing protocol の境界をすべて再定義する必要があります。

bond0 を VPP 化した場合の結論

bond0 を pure VPP dataplane 側へ移すと、現行の policy route ... interface bond0 による kernel 側 PBR は、そのままでは効かなくなると判断しました。

これは今回の検討における最も重要な結論です。

bond0 は単純な L3 forwarding interface ではありません。source prefix に応じて table 10 へ振り分ける policy routing の入口です。そのため、bond0 を VPP 化する場合は、PBR 相当の処理を VPP 側、LCP 境界、Linux routing table、FRR のいずれで保持するかを再設計する必要があります。

つまり、bond0 は性能面では VPP 導入候補に見えますが、制御面では初期移行対象にしにくい interface です。

PPPoE / outside 側はさらに難しい

外部接続側には eth4pppoe0 があります。

IPv4 は pppoe0 で NAT masquerade、IPv6 は eth4 側で autoconf と NAT66 masquerade を利用しています。また outside 側 firewall の入口にもなっています。

ここを VPP 化しようとすると、少なくとも以下が同時に絡みます。

  • PPPoE
  • IPv6 autoconf
  • NAT44
  • NAT66
  • outside firewall
  • MSS adjust
  • default route
  • ISP 側接続性

これは初期検証対象として重すぎます。実運用ルーターの外部接続を VPP 化するには、得られる利点に対して失う制御点と検証負荷が大きすぎます。

VPP が向く領域

今回の検討から、VPP が向く領域はかなり明確になりました。

VPP は、以下のような用途には適しています。

  • 単純な高速 L3 forwarding
  • DPDK NIC を使った dataplane 検証
  • VPP ACL で完結できる通信制御
  • 条件が合う場合の NAT44
  • GRE / VXLAN / IPsec など、VPP 側の機能範囲に収まる tunnel 処理
  • CNF / NFV dataplane の研究
  • 既存ルーターから分離した検証用 forwarding path

逆に、以下のような構成では導入難度が高くなります。

  • Linux kernel firewall に強く依存している
  • interface ingress に PBR を適用している
  • QoS を kernel dataplane 側で実装している
  • PPPoE が外部接続の中心になっている
  • NAT44 / NAT66 / firewall / VPN / DHCP / DNS を一台に統合している
  • FRR と service listen の境界を維持する必要がある
  • 管理系 VRF を含む実運用ルーターである

最終判断

今回の物理 VyOS ルーターに対して、VyOS VPP を本番 dataplane として導入することは採用しません。

理由は以下です。

  • bond0 に PBR が適用されている
  • VPP 化すると kernel dataplane 上の PBR がそのままでは効かない
  • firewall / QoS / conntrack / service listen の前提が崩れる
  • outside 側は PPPoE / NAT44 / NAT66 / firewall が密結合している
  • OpenVPN / GRE / management VRF も含む統合ルーターである
  • VPP 化による性能上の利点より、制御機能の再設計負荷が大きい
  • interface 置換ではなく dataplane 責任分界の再設計になる

したがって、本番ルーターとしての VPP 導入は見送ります。

今後の扱い

VyOS VPP は、本番ルーター構成には組み込まず、研究・検証テーマとして保持します。

具体的には、以下のような範囲で扱います。

  • 未使用 NIC または検証 VLAN での VPP interface 検証
  • VPP / DPDK / hugepage / LCP の挙動確認
  • VPP bonding の検証
  • VPP ACL の検証
  • VPP NAT44 の検証
  • VPP GRE / VXLAN の検証
  • CNF / NFV dataplane 研究との接続

一方で、以下は対象外とします。

  • 現行物理ルーター全体の VPP 化
  • bond0 本番 interface の直接 VPP 化
  • pppoe0 / outside 側の VPP 化
  • management VRF の VPP 化
  • OpenVPN / NAT66 / QoS / PBR を含む統合移行

まとめ

VyOS VPP は強力な dataplane 技術ですが、既存の VyOS ルーター構成に対して常にそのまま適用できるものではありません。

特に、PBR、Firewall、QoS、NAT、PPPoE、VPN、DHCP、DNS forwarding、OSPF / OSPFv3 などを一台に統合している実運用ルーターでは、VPP 化は高速化のための単純な置換ではなく、dataplane 全体の責任分界を再設計する作業になります。

VPP は、単純で高速な forwarding path や CNF / NFV dataplane の検証には有効な候補です。しかし、現在のような高機能な統合ルーターに対しては、まず Linux kernel dataplane 側の制御機能との依存関係を分解し、VPP に任せる領域を限定する必要があります。

今回の検討では、その境界が明確になりました。

VyOS VPP 導入検討:高機能な実運用ルーターに VPP をそのまま適用する難しさ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る