CloudEdge SAM トランスポートレイヤリング
CloudEdge SAM では、アドレスモビリティのルートを WireGuard の AllowedIPs に入れません。

WireGuard は AllowedIPs を cryptokey routing の状態として扱います。送信パケットは内側の宛先アドレスからピアを選び、受信パケットは復号後の内側ソースアドレスがそのピアに許可されている場合のみ受け入れます。これは WireGuard としては正しい動作ですが、BGP やルートリフレクター、ECMP によって /32 がピア間を移動する SAM モビリティとは相容れません。
推奨レイヤー構成
信頼済みのオンプレミスやホームアンダーレイでは、IPIP または GRE を直接使えます。
physical underlay
IPIP or GRE tunnel
SAM overlay packets
暗号化が必要な場合は、WireGuard をエンドポイント専用レイヤーとして配置し、その上に IPIP または GRE を載せます。
physical underlay
WireGuard endpoint transport
IPIP or GRE tunnel
SAM overlay packets
この構成では、WireGuard ピアの AllowedIPs には 10.252.0.2/32 のようなルーター間エンドポイントプレフィックスだけを入れます。192.168.123.10/32 のような SAM プレフィックスは BGP、カーネル FIB、SAM リソースが扱います。
プロトコル選択
SAM が IPv4 モビリティプレフィックスを運ぶ場合は、まず IPIP を使ってください。現在の SAMTransportProfile の例では IPIP がデフォルトの配送面です。トンネルオーバーヘッドが最小で、WireGuard の cryptokey routing と SAM のルートモビリティの分離を維持できるためです。暗号化が必要な場合は、AllowedIPs にトランスポートエンドポイントアドレスのみを含む WireGuard インターフェースの上で IPIP を動かしてください。
GRE は、IPv4 以外のプロトコル識別、GRE キー、またはより強力な FreeBSD 相互運用性が必要な場合に使います。
VXLAN、Geneve、GRETAP は、L2 セマンティクスが明示的に必要でない限り避けてください。SAM は選択的な L3 アドレスモビリティなので、L2 オーバーレイヘッダーは通常不要です。
FOU と GUE は物理アンダーレイで UDP カプセル化が有用な場合に役立ちますが、WireGuard の内側で使うと、物理ネットワークが見るのは WireGuard の UDP だけなので、物理アンダーレイの負荷分散を改善せずにオーバーヘッドだけが増えます。
設定のエルゴノミクス
低レベルリソースは DHCP/IPAM セーフなエンドポイントに対応できなければなりません。TunnelInterface は local や remote をリソースの status から導出でき、運用者が DHCP 管理のアドレスを静的設定に重複して書く必要がないようにすべきです。アンダーレイアドレスが routerd の外で管理されている場合(ライブイメージの DHCP クライアントなど)は、採用済みインターフェースの status を使います。
apiVersion: hybrid.routerd.net/v1alpha1
kind: TunnelInterface
metadata:
name: tun-k8s-rt02
spec:
mode: ipip
localFrom:
resource: Interface/mgmt
field: primaryIPv4
remote: 192.168.1.53
trustedUnderlay: true
primaryIPv4 にはプレフィックス長が含まれる場合があります(例: 192.168.1.32/24)。トンネルコントローラーは ip tunnel が要求するアドレス形式に解決します。Interface/... の status ソースを使う場合、リンクコントローラーがインターフェースの status を同じ状態データベースに公開する必要があります。通常の routerd serve はこのコントローラーを実行しますが、トンネルの単体テストでは link と tunnel の両方を含めてください。
SAMTransportProfile
一般的な SAM トポロジでは SAMTransportProfile を使って、以下の不変条件を維持しながら低レベルの TunnelInterface、エンドポイント /32 ルート、BGPPeer リソースを生成できます。
- WireGuard の
AllowedIPsにはトランスポートエンドポイントプレフィックスのみを含む。 - SAM モビリティの
/32は WireGuard ピアに注入しない。 - IPIP/GRE エンドポイントアドレスは DHCP/IPAM 由来の status フィールドから取得可能。
- MTU と MSS の挙動はトランスポートモードごとに明示的。
spec.selfNodeRef はすべてのルーターに必須です。決定論的な /31 内部アドレス導出に使う安定した識別子であり、routerd はホスト名や BGP ルーター ID からの推定は行いません。
addressingMode: edge-index(デフォルト)は、spec.peersFromが参照する共有SAMNodeSetを使います。routerd はその node set をソートし、順序なしノードペアにランクを付け、innerPrefixからランク順に/31を割り当てます。addressingMode: pair-stableは各ノードペアの安定ハッシュから/31スロットを導出します。共有 node set を変えずに、adjacency selector で実際のピア(例: RR ノード)だけを選べます。
本番ファブリックでは、衝突確率を考慮して innerPrefix のサイズを決めてください。/24 は /31 スロットが 128 個しかなく、ハッシュ + mod 方式では中程度のエッジ数で衝突する可能性があります。可能であれば /20 以上を使ってください。
SAMNodeSet は共有されるモビリティ配置とトランスポートトポロジを表します。MobilityPool.spec.members はローカルの所有権/捕捉 overlay だけを持ち、SAM トランスポートの BGP ピアトポロジではありません。
apiVersion: mobility.routerd.net/v1alpha1
kind: SAMNodeSet
metadata:
name: lab-nodes
spec:
nodes:
- nodeRef: pve-rt
site: pve
role: onprem
routeReflector: true
samEndpoint: 10.99.0.1
- nodeRef: k8s-rt
site: k8s
role: cloud
samEndpoint: 10.99.0.2
---
apiVersion: mobility.routerd.net/v1alpha1
kind: SAMTransportProfile
metadata:
name: lab-sam-transport
spec:
selfNodeRef: pve-rt
mode: ipip
innerPrefix: 10.255.1.0/24
addressingMode: pair-stable
underlayInterface: wg-hybrid
localEndpointFrom:
resource: Interface/wg-hybrid
field: primaryIPv4
bgp:
routerRef: BGPRouter/mobility
peerASN: 64512
timersPreset: fast
# ルートリフレクターのコアルーターでのみ設定してください。
routeReflectorClient: true
routeReflectorClusterID: 192.168.1.38
# local MobilityPool を持たない transit RR は、mobility /32 の境界を
# ここで明示します。汎用 BGPRouter import policy は transit authority ではありません。
importPolicy:
allowedPrefixes: [192.168.123.0/24]
allowedPrefixLengthMin: 32
allowedPrefixLengthMax: 32
peersFrom:
- resource: SAMNodeSet/lab-nodes
nodeRefs: [k8s-rt]
SAMTransportProfile に直接 peer または topology のリストはありません。共有の identity と endpoint はすべて SAMNodeSet に置き、nodeRefs では transport peer にする非 self node だけを選択します。nodeRefs を省略すると、samEndpoint を持つすべての非 self node を選びます。
MobilityPool planning を実行しない static RR にも、leaf 所有 route 用の狭い FIB authority が必要です。生成済み RR-client BGPPeer は、この profile の明示的な /32 import policy と peer identity から authority を導出し、global BGP policy へは fallback しません。この明示 policy がない RR role は validation で拒否されます。この役割のために no-capture placeholder pool を作らないでください。RR と leaf profile は 1 つの完全な共有 SAMNodeSet を使い、nodeRefs で hub-spoke adjacency を選ぶか、pair-stable を使って derived /31 peer address を cutover 前に確認してください。
クリーンアップ
プロファイルは self node ごとに DynamicConfigPart を 1 つ書きます。ピアの削除はその part を新しい生成リソースセットに置き換えます。プロファイルを削除すると空のアクティブ part になり、生成されたトンネル、BGP ピア、エンドポイントルートが実効設定から消えます。
クリーンアップは通常のライフサイクル GC パスが担当します。desired set は動的 SAM 生成後の実効ビューなので、プロファイルが存在する限り生成されたトランスポートリソースは保持され、プロファイルの出力から消えた後にのみ GC 対象になります。生成された TunnelInterface、BGPPeer、IPv4Route リソースは独自の owner/status レコードを保持し、汎用 GC プランナーとリソース固有の teardown 契約を通じて解体されます。
関連 Issue
- #194: SAM モビリティプレフィックスを WireGuard
AllowedIPsから切り離す。 - #196:
TunnelInterfaceエンドポイントをリソースの status から取得可能にする。 - #197: コンパクトな SAM アンダーレイトランスポートプロファイルを追加する。
参考資料
- WireGuard の概念と cryptokey routing: https://www.wireguard.com/
- Linux トンネルリンクタイプ: https://man7.org/linux/man-pages/man8/ip-link.8.html
- FreeBSD GRE: https://man.freebsd.org/gre/4