nft

package
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 19, 2026 License: MIT Imports: 13 Imported by: 0

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

View Source
const TableName = "wgft"

TableName は vpsd 専用のテーブル名。他のテーブルには一切触れない。

Variables

This section is empty.

Functions

func Apply

func Apply(plan planner.Plan, relayListening map[uint16]bool, cfg Config) error

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 Comment

func Comment(ruleID, kind string) string

Comment はルールの行に付けるコメント。差し替えのたびにハンドルは振り直されるので、 カウンタの持ち主はこのコメントで特定する。

func DeleteTable

func DeleteTable() error

DeleteTable は table inet wgft を削除する。他のテーブルには触れない。 すでに無ければ何もしない(撤去を手作業の途中からでも走らせられるように)。

Types

type Config

type Config struct {
	WGInterface string // wg0
}

Config は生成に必要な、Plan 以外の情報。

type Drop

type Drop struct {
	RuleID  string
	Kind    string // deny | allow | per_source | src_flow | new_flow | packet
	Packets uint64
	Bytes   uint64
}

Drop はルールごと・種類ごとの累積 drop 数(コメントで識別する)。

func ReadDrops

func ReadDrops() ([]Drop, error)

ReadDrops は filter_pre の各 drop 行のカウンタを、コメントから読む(仕様 6.1 節)。 テーブル差し替えの直前に呼び、増分を SQLite に累積する。テーブルがなければ空を返す。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL