Documentation
¶
Overview ¶
Package nft は、Plan から VPS の table inet wgft を組み立てて適用する(仕様 6.1 節、設計文書 7a.2 節)。 internal/dataplane/linuxkernel の nftables 実装で、internal/vpsd を import しない(設計文書 7a.7 節)。
Apply/emit は internal/planner.Plan と、frontend が実際に待ち受けている Relay ポートの集合 (design.md 7a.2 節の dataplane.Desired.RelayListening に当たる Runtime 側の入力)だけから組み立てる。 Plan は無効なルールとエージェントが未登録のルールを既に除いているので、ここでは検査し直さない (設計文書 7a.8 節 Phase 3:「ルール集合から nftables を組み立てる」から「Plan から組み立てる」への移行)。
nft が暗黙に足す条件(udp dport の前の meta l4proto、ip saddr の前の meta nfproto)を 自分で入れ、ポート範囲は nft と同じく gte / lte の 2 つの比較で表す。 これで生成したテーブルの `nft list` が、同じ内容を `nft -f` で流したものと一致する(実験で確認)。
Index ¶
Constants ¶
const TableName = "wgft"
TableName は vpsd 専用のテーブル名。他のテーブルには一切触れない。
Variables ¶
This section is empty.
Functions ¶
func Apply ¶
Apply はテーブル全体を 1 トランザクションで差し替える。 「空テーブルの追加 → 削除 → 定義」の順にするので、テーブルがまだない初回でも失敗しない。 conntrack のエントリは差し替えの影響を受けず、既存のセッションは切れない。 生成の途中で失敗すると未送信のメッセージが Conn に残るので、Conn は呼び出しごとに作って捨てる。
relayListening は、vpsd がプロキシモードの待ち受けを実際に開いているポート(design.md 7a.2 節の dataplane.Desired.RelayListening)。Relay のルールは、ここにあるポートだけに接続元 IP ごとの 上限の行を持つ。bind に失敗したポートでは、同じポートの別のプロセスへの通信に wgft の上限を 掛けてしまうため(仕様 6.1 節)。nil なら行を持たない。
これは Prepare/Commit の契約(design.md 7a.2 節)のうち Commit の部分でしかない:組み立てが 失敗しても Flush していないので何も公開されず、Flush 自体はカーネル側で不可分なので、 失敗すれば旧いテーブルのまま残る。kernel backend の Prepare が何も確保しないのはこのため。
func DeleteTable ¶
func DeleteTable() error
DeleteTable は table inet wgft を削除する。他のテーブルには触れない。 すでに無ければ何もしない(撤去を手作業の途中からでも走らせられるように)。