# パケットフィルタリング
## 定義
パケットフィルタリングとは、ネットワークインターフェースを通過するパケットストリームから、特定の条件(プロトコル・ポート番号・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]])
## 未解決の問い
- eBPF の XDP(eXpress Data Path)を使った NIC 直前フィルタリングは、BPF の「ソケット層フィルタ」からどのくらいのレイテンシ改善をもたらすか。
- スマート NIC / DPU でオフロードするパケットフィルタリングは、BPF/eBPF のホスト CPU フィルタとどう住み分けるか。
## 関連
- 概念: [[BPF]] / [[eBPF]] / [[カーネル内VM]] / [[テレメトリ]] / [[動的インストルメンテーション]]
- エンティティ: [[Steven McCanne]] / [[Van Jacobson]] / [[LBNL]]
- ソース: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]]
## 出典
- [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]](BPF の原典。パケットフィルタリングの設計空間と評価モデルの比較)