# パケットフィルタリング
## 定義
パケットフィルタリングとは、ネットワークインターフェースを通過するパケットストリームから、特定の条件(プロトコル・ポート番号・IPアドレス・ペイロードパターン等)を満たすパケットのみを選択的に抽出または遮断する処理である。監視・診断(tcpdump・Wireshark 等)とセキュリティ(ファイアウォール・侵入検知)の2大応用がある。BPF の文脈では主に**前者の選択的キャプチャ**を指す([[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]])。
## フィルタリング位置の設計空間
パケットフィルタリングは「どの層でフィルタするか」で性能特性が大きく変わる。
| 位置 | 方式 | 利点 | 欠点 |
|---|---|---|---|
| ユーザ空間 | 全パケットコピー後にフィルタ | 実装が簡単 | コピーコストが膨大 |
| カーネル内(ソケット層) | ソケット受信前にフィルタ | コピー削減 | カーネル改変が必要 |
| カーネル内(ドライバ層) | NIC ドライバで即時フィルタ | 最小コピー | DMA 設計が必要 |
| XDP(eBPF 拡張) | NIC ドライバのさらに手前 | NIC 処理前にドロップ可 | eBPF サポートが必要 |
BPF はソケット層〜ドライバ層の間でカーネル内フィルタリングを実現し、「合格パケットのみユーザ空間へコピー」する設計を採用した。
## 評価モデルの進化
- **CSPF(1989 頃)**: ブール式をツリーとして評価。短絡評価が困難で速度が出ない。
- **BPF(1993)**: CFG ベースの register VM で評価。短絡評価自然にサポート。CSPF 最大 20 倍高速([[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]])。
- **eBPF JIT(2011〜)**: BPF バイトコードをホスト機械語へ JIT 変換。さらに高速化。
## 横断的知見
- **「最上流でフィルタ」という情報削減原則の起源が BPF にある**: ユーザ空間でフィルタすれば実装は簡単だが全パケットのコピーコストが発生する。BPF はこれをカーネル内に押し上げた。本 wiki の eBPF 系研究群([[eBPF]] の横断的知見参照)が繰り返す「計装層で情報を絞る」設計指針は、BPF の 1993 年の決断に遡る。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]])
- **BPF フィルタ式の「カーネル内での最適化」は、tcpdump という一般利用者向けツールの説明でも明示的に言及される**: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] は、tcpdump(8) のパケットフィルタ式が「処理効率を上げるために BPF を使ってカーネル内で実行される」とし、フィルタ式は一般に BPF バイトコードにコンパイルされ、カーネルがマシンコードに JIT コンパイルできると述べる。これは [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]] が示した「合格パケットのみユーザ空間へコピーする」という 1993 年の設計原則が、30 年後の実務ツールのデフォルト動作として定着していることを示す一次資料であり、原典論文が示す設計思想と実務ツールの説明がどちらも同じ最適化原則(最上流でフィルタ)を独立に強調している。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.6.13、[[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]])
- **パケットキャプチャは観察的分析としては「最後の手段」であり、フィルタリング以前にキャプチャ自体のコストが問題になる**: ch.10 はパケットスニッフィングについて「CPU とストレージにオーバーヘッドがかかり、実施するためのコストが高いので、観察的な分析としては最後の手段である」と位置づけ、共有メモリマップ・BPF によるリングバッファ・AF_XDP でオーバーヘッド削減を図る技法を挙げる。BPF 原典論文が「フィルタ評価の高速化」に焦点を当てるのに対し、ch.10 は「フィルタを通過した後のユーザー空間へのデータ転送コスト」という、フィルタリング設計空間の表(39-42行目)には現れない別のボトルネックを指摘しており、実務では両方のコストが複合する。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.5.6)
## 未解決の問い
- eBPF の XDP(eXpress Data Path)を使った NIC 直前フィルタリングは、BPF の「ソケット層フィルタ」からどのくらいのレイテンシ改善をもたらすか。
- スマート NIC / DPU でオフロードするパケットフィルタリングは、BPF/eBPF のホスト CPU フィルタとどう住み分けるか。
## 関連
- 概念: [[BPF]] / [[eBPF]] / [[カーネル内VM]] / [[テレメトリ]] / [[動的計装]]
- エンティティ: [[Steven McCanne]] / [[Van Jacobson]] / [[Lawrence Berkeley National Laboratory]] / [[Brendan Gregg]]
- ソース: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]]
## 出典
- [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]](BPF の原典。パケットフィルタリングの設計空間と評価モデルの比較)
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.5.6, §10.6.13(tcpdump のBPFフィルタ式コンパイルとパケットキャプチャのオーバーヘッド)