Documentation
¶
Overview ¶
Package srcpolicy はユーザースペースモード(nftables を使わない転送)向けに、 接続元制限とレート制限を Go で評価する。カーネルモードで nftables が担う評価順 (deny、allow、接続元ごとの meter、新規フローの集約上限、パケットの集約上限。 design.md 6.1 節)を、userspace の中継の手前で同じ順に再現する。
入力は Plan が持つ AdmissionPolicy の IR(internal/policy の RulePolicy)である。IR から 評価器を組み立てる 1 実装への統合(design.md 7a.8 節の Phase 5)までは、評価順をこの パッケージが手で持つ。
Index ¶
- type Policy
- func (p *Policy) AdmitFlow(ruleID string, src netip.Addr, size int) (ok bool, kind string)
- func (p *Policy) AdmitPacket(ruleID string, size int) bool
- func (p *Policy) Drops() []dataplane.Drop
- func (p *Policy) SourceAllowed(ruleID string, src netip.Addr) bool
- func (p *Policy) Update(rules []policy.RulePolicy)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Policy ¶
type Policy struct {
// contains filtered or unexported fields
}
Policy はルール集合から作る評価器。AdmitFlow、AdmitPacket、SourceAllowed、Drops が 読み書きする状態はすべて mu で守る。
func (*Policy) AdmitFlow ¶
AdmitFlow は新しいフロー(TCP の accept、UDP の新しいセッション)を、 deny、allow、per_source、new_flow の順に判定する。通さない場合は落とした種類を返し、 そのルールの drop を 1 パケット size バイトとして数える。未知のルール ID は通す。
func (*Policy) AdmitPacket ¶
AdmitPacket は UDP のデータグラム 1 つを packet_rate で判定する(TCP には使わない)。 落とした場合は kind "packet" として数える。未知のルール ID、packet_rate 未設定の ルールは通す。
func (*Policy) Drops ¶
Drops は前回の呼び出し以降に数えた drop を返して 0 に戻す。nft.ReadDrops がテーブル 差し替えの直前にカーネルのカウンタを読むのと同じ扱いで、呼び出し側が SQLite へ累積する。
func (*Policy) SourceAllowed ¶
SourceAllowed は deny と allow だけを見る。レート制限は新しいフローにだけ意味を持つ ので、進行中のセッションを制限の変更後に切るかどうかの判定には含めない。 未知のルール ID は通す。
func (*Policy) Update ¶
func (p *Policy) Update(rules []policy.RulePolicy)
Update は Plan が持つ AdmissionPolicy の IR のルール(転送するルール、つまり有効でエージェントが 登録済みのルールだけを持つ。internal/planner の Build)から方針を作り直す。消えたルール(削除、 無効化、エージェントの登録の取り消しで転送しなくなったルール)の状態(接続元の表、 バケット)は捨て、残ったルールのうち、レートの設定(Count と Unit)が変わっていないものは バケットと接続元の表をそのまま引き継ぐ。allow/deny の一覧は毎回差し替える(進行中の 判定に対する影響は SourceAllowed の呼び出し側が扱う)。