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
- Variables
- func EnableIPForward() (changed bool, err error)
- func IPForwardStatus() (value string, openErr error, err error)
- func InputPortSuggestions(pr proto.PortRange, p proto.Proto, ownTable string) ([]string, error)
- type Bound
- type ConntrackUsage
- type DNAT
- type Finding
- type Report
- type UDPTimeouts
Constants ¶
const ConntrackMinMax = 65536
ConntrackMinMax は、これを下回ると ConntrackUsage.Finding/StartupWarning が警告する nf_conntrack_max。メモリの量から出した値ではなく、wgft が運用上の最低の推奨値として定める (設計文書 7a.10 節「kernel 側の保護」)。接続元ごとの meter の上限(65535 件)と同じ桁で、 メモリの小さい VPS の既定値(16384 など)を拾う。
const IPForwardPath = "/proc/sys/net/ipv4/ip_forward"
IPForwardPath は net.ipv4.ip_forward の sysctl ファイル(仕様 6.1 節)。
Variables ¶
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 ¶
EnableIPForward は net.ipv4.ip_forward を確認し、1 でなければ 1 にする(仕様 6.1 節)。 すでに 1 なら何も書かず changed=false を返す。0→1 に書けたときは changed=true。 書き込みに失敗したとき(読み取り専用の /proc、seccomp/LSM で塞がれている場合など)は err を返す。 1 にした値を 0 に戻す処理はここには無い(呼び出し側の責務ではなく、そもそも持たない)。
func IPForwardStatus ¶
IPForwardStatus は net.ipv4.ip_forward を書き込まずに読む、読み取り専用の検査 (`server check` コマンド、仕様 6.1 節)。value が "1" でなければ、EnableIPForward の実際の 書き込みと同じ開き方(O_WRONLY で開いて書かずに閉じる)で書けるかを probe し、開けなければ openErr にその理由を返す(value が "1" のときは probe せず openErr は nil)。
func InputPortSuggestions ¶
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)の名前で、検査から除く。
Types ¶
type Bound ¶
Bound はプロトコルごとの、公開側で bind 中のポート → bind アドレスの一覧。 ループバックだけに bind しているものは含めない(SSH のポートを塞ぐ事故を防ぐための検査なので、外から見えるものだけ)。
func BoundPorts ¶
BoundPorts は /proc/net/{tcp,tcp6,udp,udp6} を読む。TCP は LISTEN だけ、UDP は bind されていれば待ち受けとみなす。
type ConntrackUsage ¶
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 {
Where string // "ip filter FORWARD" のようなチェーンの場所
Problem string // 何が起きるか
Suggest []string // 足す行(コマンドの形)
}
Finding は警告 1 件と、管理者に提示する手作業の行。
type Report ¶
Report は検査の結果。
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 を読む。