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