
2026/01/26 0:13
**Show HN:** *Netfence – eBPF フィルター用の Envoy のようなツール*
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
Netfenceは、LinuxのcgroupsとネットワークインターフェースにeBPFフィルタープログラムを注入してネットワークポリシーを強制する軽量デーモンです。承認されたドメインのDNS解決を自動的に行い、その解決結果からIPホワイトリストを構築し、未知のIPへのトラフィックをすべてドロップします—スループットに影響を与えることはありません。デーモンはgRPC経由で中央制御プレーンと通信し、
ALLOW *.pypi.orgやCIDRブロック(例:10.0.0.0/16)などのルールを SetMode, AllowCIDR, DenyCIDR, RemoveCIDR, SetDnsMode, AllowDomain, DenyDomain, RemoveDomain, BulkUpdate などのRPCメソッドでプッシュします。ポリシーモードには disabled, allowlist, denylist, block‑all があり、ルールはIPv4/IPv6 CIDRに対して任意のTTLを指定できます。
各アタッチメント(VMまたはコンテナ)は、それぞれ専用のDNSサーバーを受け取り、ドメインホワイトリスト/ブラックリストを特異性ベースでマッチング(より具体的なものが優先)して強制します。VM/コンテナがDNSクエリを実行すると、Netfenceはそれを解決し、得られたIPをeBPFフィルタに追加し、ホストから離れる前にホワイトリストにないトラフィックをドロップします。また、デーモンは
DaemonService というローカルgRPC API を公開しており、インターフェースのアタッチ・デタッチ・一覧表示が可能です。CLIコマンドも同様の操作を行います。
起動時に各アタッチメントは
Subscribed メッセージを制御プレーンへ送信し、SubscribedAck を待ちます。設定されたタイムアウト(デフォルト5 秒)内に確認応答が来ない場合、デーモンは変更をロールバックします。制御プレーンは各アタッチメントからのハートビートを処理し、生存状態を維持しつつ同じ双方向ストリーム (ControlPlane.Connect) を介して設定更新を送信します。
自動DNS解決、アタッチメント別eBPFフィルター、および堅牢なgRPCベースのポリシーエンジンを統合することで、Netfenceはオペレーターに対し、クラウドネイティブワークロード向けにDNS変更に自動的に適応する高精度でパフォーマンスフレンドリーなネットワーク制御を提供します。
本文
Netfence – eBPF フィルタデーモン
Envoy xDS と同様に eBPF フィルタを制御します。
- Netfence は VM/コンテナホスト上でデーモンとして動作し、cgroup やネットワークインターフェースへ自動的に eBPF フィルタプログラムを注入します。
- 許可済みドメインを解決して IP アリロール(allow‑list)を構築する DNS サーバーも備えています。
- デーモンは中央制御プレーン(gRPC)に接続し、バックエンドと allow/deny リストを同期します。
制御プレーンからは以下のようなルールがプッシュされます。
ALLOW *.pypi.org ALLOW 10.0.0.0/16
これらはアタッチされたインターフェース/cgroup に適用され、VM/コンテナが DNS を問い合わせると Netfence が解決結果を eBPF フィルタに追加し、ホストから外部へ流れる前に未知の IP へのトラフィックをドロップします。パフォーマンスに影響はありません。
主な機能
- ネットワークインターフェース(TC)または cgroup への eBPF フィルタのアタッチ
- ポリシーモード:disabled、allowlist、denylist、block‑all
- IPv4/IPv6 CIDR を TTL のオプション付きでサポート
- アタッチごとの DNS サーバーとドメイン allow/deny リスト
- ドメインルールはサブドメインを許可し、特異度に応じてマッチ(より具体的なものが優先)
- 解決済みドメインは自動で IP フィルタへ登録
- デーモンとアタッチメントのメタデータに VM ID、テナントなどを紐付け可能
- アタッチごとの DNS クエリを制御プレーンへプロキシして判断
設計・構成図
+------------------+ +--------------------------------+ | Control Plane |<-------> | デーモン(ホスト毎) | | (gRPC) | ストリーム | | +------------------+ | +------------------------+ | | | DNS サーバー | | | | (アタッチごと) | | | +------------------------+ | +--------------------------------+ | +---------------+-------------+ | | TC フィルタ(veth, eth) Cgroup フィルタ (コンテナ)
各アタッチメントにはデーモンが割り当てるユニークな DNS アドレス(ポート)がプロビジョニングされます。
コンテナ/VM はそのアドレスを DNS として設定します。
ホスト単位
デーモン起動
# デフォルト設定で開始 netfenced start # カスタム設定ファイルで開始 netfenced start --config /etc/netfence/config.yaml
ステータス確認
デーモンは以下の機能を持ちます。
- ローカル gRPC API(
)でフィルタのアタッチ/デタッチを行うDaemonService - 制御プレーンへ双方向ストリーム(
)で接続するControlPlane.Connect - eBPF プログラムをロード・管理する
アタッチメント単位
オーケストレーションシステムはデーモンのローカル API を呼び出します。
gRPC
DaemonService.Attach( interface_name: "veth123", metadata: {vm_id: "abc"} ) // または DaemonService.Attach( cgroup_path: "/sys/fs/cgroup/…", metadata: {container_id: "xyz"} )
CLI
# ネットワークインターフェース(TC)にアタッチ netfenced attach --interface veth123 --metadata vm_id=abc # cgroup にアタッチ netfenced attach --cgroup /sys/fs/cgroup/... --metadata container_id=xyz # メタデータ付きでアタッチ netfenced attach --interface eth0 --metadata tenant=acme,env=prod
デーモンは対象に eBPF フィルタをアタッチし、制御プレーンへ
Subscribed{id, target, type, metadata}
を送信して
SubscribedAck(mode、CIDR、DNS ルール)を待ちます。タイムアウト(デフォルト 5 秒、
control_plane.subscribe_ack_timeoutで設定可)が発生した場合はロールバックしアタッチが失敗します。ターゲットの削除を監視して
Unsubscribed を自動送信します。
CLI デタッチ & リスト
netfenced detach --id <attachment-id> netfenced list # 現在のページを表示 netfenced list --all # すべてのページを取得
制御プレーン API(実装する側)
ControlPlane.Connect を双方向ストリームとして実装します。
デーモンから受信
| メッセージ | 用途 |
|---|---|
(接続時/再接続時) | 現在のアタッチメント一覧を取得 |
| 新規アタッチメント追加 |
| アタッチメント削除 |
| Heartbeat with stats | 生存確認・メトリクス |
デーモンへ送信
| メッセージ | 用途 |
|---|---|
| への応答 |
| 必須 – デーモンはこれを待ってから成功とする |
| IP フィルタポリシー変更 |
, , | CIDR ルール |
| DNS フィルタモード変更 |
, , | ドメインルール |
| 全状態同期 |
デーモンが
Subscribed を受け取ると、応答の SubscribedAck が来るまでブロックし、呼び出し元に成功を返します。これにより、トラフィックが流れ始める前に初期設定が確実に適用されます。メタデータで VM/テナント/コンテナを特定し、適切なルールを応答してください。