Skip to content

Latest commit

 

History

History
executable file
·
99 lines (65 loc) · 5.56 KB

File metadata and controls

executable file
·
99 lines (65 loc) · 5.56 KB

XDP-ban

見つけて、即ブロック。

eBPF トラフィックサンプリング + ガバナンス付き遮断 —— 単一バイナリで。

English · 中文 · 日本語 · 한국어


多くのツールはトラフィックを見る遮断するかのどちらかで、両方はできず、しかも背後に重厚なスタックを必要とします。XDP-ban はその両方を、コピーして実行するだけの単一静的バイナリで実現します。

eBPF でミラートラフィックをサンプリングし、ホストに何が来ているかを可視化し、遮断します —— 本物の承認フロー・四眼原則・ロール権限・監査ログを通じて。遮断はカーネルの XDP 層で実行され、しつこい攻撃者にはブロック時間が段階的に延長されます。

特徴

  • 見つけて即ブロック —— ミラートラフィックへの 1/N パケットサンプリングとワンクリック遮断。
  • ガバナンス —— 承認フロー、四眼原則、ロール権限、改ざん不可の監査ログ、ワンタイムのメール承認リンク。
  • 段階的ブロック —— 常習者はブロック時間が段階的に延長、最終的に恒久ブロック。
  • 範囲ブロック —— 国 / AS 番号で送信元レンジを選択し、指定した単一ホストを保護。送信前に影響範囲をプレビューしクォータ検証。
  • 純粋な XDP 実行 —— nftables も iptables も経由せず、エージェントが eBPF マップを直接書き換え。
  • 単一バイナリ —— 純 Go、CGO_ENABLED=0、外部 DB 不要。コピーして実行。

構成

2 つのバイナリ、それぞれ独立してデプロイ可能:

バイナリ 役割 root 必須
xdp-ban コントロールプレーン + エンフォースメント:Web UI、承認、SQLite、XDP マップを書く 必要
xdp-sampler 観測:ミラーポートで 1/N サンプリングしフローを報告 必要

サンプリングはアウトオブバンドです。トラフィックの複製を観測し、常に XDP_PASS を返します。

xdp-ban は以前、コントロールプレーンと独立した xdp-agent エンフォーサーに 分かれていました(後者はコントロールプレーン自身の HTTP API をポーリングして 指示を取得)。両者は統合され、xdp-ban 自身が XDP 遮断プログラムをロード・ アタッチし、承認済みの遮断をデータベースに対して直接実行します(ローカル HTTP のラウンドトリップなし)。どのインターフェースにアタッチするかは -iface <ifname>(業務用 NIC、ミラーポートではない)で指定します。

クイックスタート

make bpf     # eBPF オブジェクトをコンパイル(clang 必須)
make build   # xdp-ban + xdp-sampler をビルド

sudo ./xdp-ban -iface eth0    # http://localhost:8080  (既定 admin / admin12345 — 必ず変更)

データは単一の xdpban.db ファイルに保存。バックアップはファイルをコピーするだけ。

データプレーン(root、実際に処理を行うホスト上で):

sudo ./xdp-sampler -d eth1 -url http://<control>:8080/api/v1/samples -n 100 -key <API_KEY>

範囲ブロック(国 / AS)

「AS4134 から 10.0.1.100 への通信をすべて遮断」には IP プレフィックス DB が必要です。IPv4 テーブルは約 120 万エントリあるため、バイナリには同梱しません

curl -O https://iptoasn.com/data/ip2asn-v4.tsv.gz
XDPBAN_PREFIX_DB=./ip2asn-v4.tsv.gz ./xdp-ban

2 つの制約は意図的なもので、バックエンドで強制されます:

  • ターゲットは単一ホスト(/32)のみ。 カーネルは LPM_TRIE送信元の最長一致を行います。ターゲットにもプレフィックスを許すと二次元の最長一致が必要になり、LPM_TRIE では表現できません。
  • 送信前に影響範囲のプレビューとクォータ検証が必須。 1 か国で数万プレフィックスに展開されることがあります。UI が正確なテーブルエントリ消費量と IPv4 空間の占有率を表示し、過大な選択は拒否、異常に広い範囲は明示的な確認を要求します(確認は監査ログに記録)。

ソースからビルド

make bpf      # clang → cmd/{xdpban,xdp-sampler}/obj/*.o、go:embed で埋め込み
make build    # xdp-ban + xdp-sampler
make check    # go vet + go test -race
make dist     # linux/{amd64,arm64} のクロスコンパイル + SHA256SUMS

エンジニアリングノート(並行性モデル、エラー処理規約、Go/eBPF 境界、実測のプロファイリング結果)は ENGINEERING.md を参照。

現状

コントロールプレーンと両データプレーンはビルド可能で、go vetgo test -race を通過し、HTTP 経由のエンドツーエンド検証済みです。XDP のスループットとパケットあたりコストは実機で未計測です —— ベンチマークスクリプトは提供しますが、数値は主張しません。

ライセンス

Apache-2.0。LICENSE を参照。