linux

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: 15 Imported by: 0

Documentation

Overview

Package linux は、VPS と(将来の Phase 7 の)agent の kernel backend が共通に使う、Linux ホスト側の 前段検査と sysctl の読み書きを持つ(設計文書 7a.7 節)。他テーブルの forward/input/DNAT の検査、 bind 中のポートの検査、ip_forward と conntrack テーブルの sysctl がここに属する。自動では何も 書き換えず(ip_forward を除く。EnableIPForward のみ)、拒否か警告と提示に留める。

このパッケージは internal/dataplane/linuxkernel を import しない(その逆に、linuxkernel がこの パッケージを import する)。table inet wgft のような、カーネル backend の実装詳細である名前は 引数として受け取り、自分では知らない。

Index

Constants

View Source
const (
	HookForward = "forward"
	HookInput   = "input"
)

HookForward と HookInput は Finding.Hook の値である。

View Source
const ConntrackMinMax = 65536

ConntrackMinMax は、これを下回ると ConntrackUsage.Finding/StartupWarning が警告する nf_conntrack_max。メモリの量から出した値ではなく、wgft が運用上の最低の推奨値として定める (設計文書 7a.10 節「kernel 側の保護」)。接続元ごとの meter の上限(65535 件)と同じ桁で、 メモリの小さい VPS の既定値(16384 など)を拾う。

View Source
const IPForwardPath = "/proc/sys/net/ipv4/ip_forward"

IPForwardPath は net.ipv4.ip_forward の sysctl ファイル(仕様 6.1 節)。

Variables

View Source
var (
	ConntrackMaxPath   = "/proc/sys/net/netfilter/nf_conntrack_max"
	ConntrackCountPath = "/proc/sys/net/netfilter/nf_conntrack_count"
)

ConntrackMaxPath と ConntrackCountPath は conntrack テーブルの上限と現在の件数(仕様 6.1 節)。 nf_conntrack が未ロードなら読めない。テストが差し替えられるよう変数にする。

Functions

func EnableIPForward

func EnableIPForward() (changed bool, err error)

EnableIPForward は net.ipv4.ip_forward を確認し、1 でなければ 1 にする(仕様 6.1 節)。 すでに 1 なら何も書かず changed=false を返す。0 を読んだうえで 1 に書けたときだけ changed=true。 今の値を読めなかったときは、1 を書けても changed=false とする。0 だったとは言えないので、wgft が 変えたと記録しないためである。書き込みに失敗したとき(読み取り専用の /proc、seccomp/LSM で 塞がれている場合など)は err を返す。 1 にした値を 0 に戻す処理はここには無い(呼び出し側の責務ではなく、そもそも持たない)。

func IPForwardStatus

func IPForwardStatus() (value string, openErr error, err error)

IPForwardStatus は net.ipv4.ip_forward を書き込まずに読む、読み取り専用の検査 (`server check` コマンド、仕様 6.1 節)。value が "1" でなければ、EnableIPForward の実際の 書き込みと同じ開き方(O_WRONLY で開いて書かずに閉じる)で書けるかを probe し、開けなければ openErr にその理由を返す(value が "1" のときは probe せず openErr は nil)。

func InputPortSuggestions

func InputPortSuggestions(pr proto.PortRange, p proto.Proto, ownTable string) ([]string, error)

InputPortSuggestions は、input の base chain が既定で落とす構成で、かつ pr/proto への明示的な accept がまだ無いとき、その accept を足す行を提示する。呼び出し元は 3 種類ある。カーネルモードの プロキシルール(vpsd 自身が中継で受けるポート。単一ポートに限る。仕様 6.2 節)、ユーザー空間モードの 全ルール(範囲を含む。仕様 6.3 節)、vpsd 自身が待ち受ける 2 つのポート(WireGuard の UDP、 agent API の TCP。仕様 4 節)である。最後のものは実機の Debian 13(input が policy drop で SSH の TCP 22 しか accept していない構成)で見つかった。改訂の記録を参照。 ownTable は自分の table(kernel backend では table inet wgft)の名前で、検査から除く。

func ReadIPForward added in v1.2.0

func ReadIPForward() (on bool, err error)

ReadIPForward は net.ipv4.ip_forward が 1 かどうかを読む。

func WriteIPForward added in v1.2.0

func WriteIPForward() error

WriteIPForward は net.ipv4.ip_forward に 1 を書く。読み取り専用の /proc や、seccomp か LSM で 塞がれている場合は誤りを返す。

Types

type Bound

type Bound map[proto.Proto]map[uint16][]netip.Addr

Bound はプロトコルごとの、公開側で bind 中のポート → bind アドレスの一覧。 ループバックだけに bind しているものは含めない(SSH のポートを塞ぐ事故を防ぐための検査なので、外から見えるものだけ)。

func BoundPorts

func BoundPorts() (Bound, error)

BoundPorts は /proc/net/{tcp,tcp6,udp,udp6} を読む。TCP は LISTEN だけ、UDP は bind されていれば待ち受けとみなす。

func (Bound) Conflicts

func (b Bound) Conflicts(p proto.Proto, r proto.PortRange) map[uint16][]netip.Addr

Conflicts は範囲内で bind 中のポートを返す。

type ConntrackUsage

type ConntrackUsage struct {
	Max       int
	Count     int
	HaveCount bool
}

ConntrackUsage は conntrack テーブルの使用状況。Count は nf_conntrack_count が読めたときだけ有効 (HaveCount)。

func ReadConntrackUsage

func ReadConntrackUsage() (ConntrackUsage, error)

ReadConntrackUsage は ConntrackMaxPath/ConntrackCountPath を読む。Max が読めなければ err を返す。 Count は読めなくても(HaveCount=false のまま)成功として返す。

func (ConntrackUsage) Finding

func (u ConntrackUsage) Finding() *Finding

Finding は上限が小さいときの警告を作る。足りていれば nil。メモリの figures(MiB、エントリ 1 件の バイト数、bucket 数)は出さない。ラボで測った値は kernel の版、設定、エントリの種類で変わるため、 提示には使わない(設計文書 7a.10 節「kernel 側の保護」)。65536 は wgft が運用上の最低の推奨値と して定める値であり、カーネルにとって正しい値という意味ではない。

func (ConntrackUsage) StartupWarning added in v0.5.0

func (u ConntrackUsage) StartupWarning() string

StartupWarning は Finding と同じ判定を、server の起動ログ向けの短い 1 行にする。上限が足りて いれば空文字を返す。ip_forward と同じ場所(Run が起動時に検査する Findings)で使う (設計文書 7a.10 節)。

type DNAT

type DNAT struct {
	Where string
	Proto proto.Proto     // 不明なら ""
	Ports proto.PortRange // Unknown なら無意味
	// ポートが判定できなかった(無名 set を読めない、式の形が未知)。
	// 衝突の判定では「同じプロトコルなら全ポートと衝突する」扱いにはせず、警告だけにする
	Unknown bool
}

DNAT は他テーブルの nat prerouting にある DNAT 1 件。

type Finding

type Finding struct {
	// Hook は所見が見つかったフックである(HookForward、HookInput)。どちらでもない所見では空である。
	// エージェントは forward の所見だけを、自分の転送の向きに合わせた文言で示す
	Hook    string
	Where   string   // "ip filter FORWARD" のようなチェーンの場所
	Problem string   // 何が起きるか
	Suggest []string // 足す行(コマンドの形)
}

Finding は警告 1 件と、管理者に提示する手作業の行。

func (Finding) String

func (f Finding) String() string

String は Findings を「どこ: 何が問題か」と提示する行の形にする。

type Report

type Report struct {
	Findings []Finding
	DNATs    []DNAT
}

Report は検査の結果。

func Inspect

func Inspect(wgIface, ownTable string) (*Report, error)

Inspect は wgft(または agent の kernel backend)以外の全テーブルの base chain を調べる。 ownTable は自分の table の名前で、検査から除く。

func (*Report) DNATConflicts

func (r *Report) DNATConflicts(p proto.Proto, pr proto.PortRange) []DNAT

DNATConflicts は (proto, range) に重なる他テーブルの DNAT を返す。ポート不明のものは返さない。

type UDPTimeouts

type UDPTimeouts struct {
	Timeout       int // nf_conntrack_udp_timeout(既定 30)
	TimeoutStream int // nf_conntrack_udp_timeout_stream(既定 120)
}

UDPTimeouts は VPS の conntrack の UDP タイムアウト 2 値(秒)。全体状態でエージェントに渡す(仕様 4 節)。

func ReadUDPTimeouts

func ReadUDPTimeouts() (UDPTimeouts, error)

ReadUDPTimeouts は起動時に sysctl を読む。

Jump to

Keyboard shortcuts

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