conntrack

package
v1.2.0 Latest Latest
Warning

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

Go to latest
Published: Sep 26, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package conntrack は、外から入って DNAT されたフローを Plan に収束させる(仕様 6.1 節、 設計文書 7a.8 節 Phase 3)。「宣言状態に収束させる」1 手順だけを持つ:Dump → 判定 → 削除。 nftables テーブルの差し替えの後に走らせる。internal/dataplane/linuxkernel の一部で、 internal/vpsd を import しない(設計文書 7a.7 節)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Converge

func Converge(rules []Rule, wgNet netip.Prefix) (int, error)

Converge は対象のフローを Dump し、現在のルールで許されないものを削除する。削除数を返す。

Types

type AgentResult added in v1.2.0

type AgentResult struct {
	// Kept は、今の公開に合うので残したフローの数である。
	Kept int
	// Removed は、ポートが宣言から消えたので消したフローの数である。ルールの削除と無効化、
	// エージェントの無効化がこれに当たる。
	Removed int
	// Retargeted は、ポートの実効宛先の宣言が変わったので消したフローの数である。
	Retargeted int
	// NotAllowed は、宣言は変わらないが DNAT の宛先が今の許可一覧の外にあるので消したフローの数である。
	NotAllowed int
	// Failed は、消すべきだったが削除に失敗したフローの数である。
	Failed int
}

AgentResult は 1 回の収束の結果である。数は、wgft のフローと見分けたものだけを数える。

func ConvergeAgent added in v1.2.0

func ConvergeAgent(prev []nft.AgentPublication, cur nft.AgentPublication, scope AgentScope) (AgentResult, error)

ConvergeAgent は、エージェントのホストの conntrack を公開 cur に収束させる(設計文書 7b.4 節)。

prev は、cur より前の公開を古い順に並べた列である。最後に収束を済ませた公開と、その後に公開したが 収束が済んでいない公開を入れる。wgft のフローかどうかは、DNAT の宛先がこの列か cur の宛先に合うかで 見分けるので、列が空なら何も消さない。呼び出し側は、収束が済むまで列を状態ファイルに残す。 残さないと、収束が済まないまま再起動したときに、記録より前の公開のフローを見分けられない。

conntrack を読めなかった場合と、エントリの削除に失敗した場合は誤りを返す。削除の失敗では、 他のフローの削除は続け、結果の数も返す。呼び出し側は同じ prev と cur で試し直す。

func (AgentResult) Deleted added in v1.2.0

func (r AgentResult) Deleted() int

Deleted は消したフローの数である。

func (AgentResult) String added in v1.2.0

func (r AgentResult) String() string

String はログの 1 行に載せる要約である。

type AgentScope added in v1.2.0

type AgentScope struct {
	// Local は wgft0 のアドレス(エージェントのトンネルアドレス)である。
	Local netip.Addr
	// Peer は vpsd のトンネルアドレスである。wgft0 のピアの AllowedIPs はこのアドレスの /32 だけなので、
	// wgft0 から入るパケットの送信元は必ずこのアドレスになる。
	Peer netip.Addr
	// AllowTarget は宛先の許可一覧の判定である(nft.AgentConfig.AllowTarget と同じもの)。nil なら制限しない。
	AllowTarget func(netip.AddrPort) bool
}

AgentScope は、エージェントのホストの conntrack のうち wgft0 から入ったフローを見分ける値と、 残すフローの宛先を判定する許可一覧である。

type Rule

type Rule struct {
	Proto      proto.Proto
	ListenPort proto.PortRange
	AgentAddr  netip.Addr // DNAT 先(エージェントのアドレス)
	// Policy は接続元 deny/allow(design.md 7a.9 節)。planner.PortPlan.Policy の写しで、接続元以外の
	// レート等の項目はこの収束の判定に使わない。
	Policy policy.RulePolicy
	// Keep は、nil でなければ Policy の deny/allow の代わりに接続元を判定する。fail-closed に
	// したルールの直前の Active の値を、新しい宣言の接続元制限とあわせて判定するのに使う(設計文書 7a.3 節)。
	Keep func(src netip.Addr) bool
}

Rule は収束の判定に使う、ルールの部分集合。カーネルモードで有効なものだけを渡す。

func RulesFromPlan

func RulesFromPlan(plan planner.Plan) []Rule

RulesFromPlan は、Plan の Transparent(カーネルモード)のポートから収束の判定材料を作る (design.md 6.1, 7a.8 節 Phase 3)。Plan.Ports は無効なルールとエージェントが未登録のルールを 既に除いているので、ここでは検査し直さない。

Jump to

Keyboard shortcuts

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