最近の注目トピック

eBPF いーびーぴーえふ

Linuxカーネル観測可能性パフォーマンス監視セキュリティネットワークトレーシング
eBPFについて教えて

簡単に言うとこんな感じ!

OS(Linux)の超深い部分に、安全に「小さなプログラム」を差し込める仕組みだよ! カーネルを改造せずに、ネットワークの監視・セキュリティチェック・パフォーマンス計測が爆速でできちゃうんだ。Kubernetesクラウドネイティブ界隈で今めちゃくちゃ注目されてるって感じ!


eBPFとは

eBPF(extended Berkeley Packet Filter) は、Linuxカーネル(OSの中核部分)の動作を変えることなく、カーネル内で任意のプログラムを安全に実行できる革新的な技術です。従来、カーネルの挙動をカスタマイズするにはカーネルモジュールを書いてOSに組み込む必要があり、バグが混入するとシステム全体がクラッシュする危険がありました。eBPFはその問題を解決し、検証済みの小さなプログラム(BPFプログラム)をカーネル内のフックポイントに安全に注入できる仕組みを提供します。

名前の由来は1992年に登場した「BPF(Berkeley Packet Filter)」で、もともとはネットワークパケットのフィルタリング専用技術でした。2014年以降に大幅に拡張(extended)され、ネットワーク以外のあらゆるカーネルイベントをフックできるようになったため「eBPF」と呼ばれるようになりました。現在は単に「BPF」と呼ばれることも多いです。

実務では、Kubernetesクラスターの観測(何が遅いかリアルタイムで把握する)、セキュリティポリシーの適用(不審なシステムコールをブロックする)、高速ネットワーク処理ファイアウォールロードバランサーをカーネル内で動かす)などに活用されています。CiliumやFalco、Datadogなどの著名なツールがeBPFを核心技術として採用しています。


eBPFの仕組みと構造

eBPFプログラムがカーネル内で動くまでには、以下のステップを踏みます。

ステップ内容
① 作成C言語などでeBPFプログラムを記述
② コンパイルLLVMなどでeBPFバイトコードに変換
③ 検証(Verify)カーネルのVerifierが安全性を厳密にチェック(無限ループ・メモリ違反を拒否)
JITコンパイルバイトコードをCPUネイティブ命令に変換し高速化
⑤ アタッチカーネル内のフックポイント(イベント発生箇所)に紐付け
⑥ 実行対応するイベントが起きるたびにカーネル内でプログラムが実行される

フックポイントの種類

eBPFプログラムをアタッチできる主な場所は以下の通りです。

フックの種類代表的な用途
kprobe / kretprobeカーネル内の任意の関数の呼び出し・戻りを捕捉
tracepointカーネルが定義した安定的なトレースポイント
XDP(eXpress Data Path)NIC(ネットワークカード)レベルで最速にパケット処理
TC(Traffic Control)ソケット寄りの層でパケットの加工・フィルタリング
LSM(Linux Security Modules)セキュリティポリシーをカーネルレベルで強制
uprobeユーザー空間アプリの関数呼び出しをカーネルから観測

マップ(BPF Maps)

eBPFプログラムはカーネル内で動きますが、その結果をユーザー空間のアプリと共有する仕組みが BPF Maps です。ハッシュマップ・配列・リングバッファなど複数の型があり、監視ツールはここからメトリクスを読み取ります。


歴史と背景

  • 1992年 — BSD UNIX用に「BPF(Berkeley Packet Filter)」が論文発表。tcpdump などのパケットキャプチャに採用
  • 1997年 — Linuxカーネル 2.1.75 にBPFが取り込まれる
  • 2014年 — Alexei Starovoitov が Linux 3.18 に eBPF実装。レジスタ数・命令セットを大幅拡張しネットワーク以外でも利用可能に
  • 2016年 — Cilium プロジェクト誕生。eBPFをKubernetesのネットワーク基盤に活用する先駆けとなる
  • 2018年 — Facebook(現Meta)が Katran(XDPベースのロードバランサー)をOSSとして公開。大規模活用が実証される
  • 2020年 — Linuxカーネル 5.8 でeBPFの機能が大きく充実(リングバッファ追加など)
  • 2021年eBPF Foundation が Linux Foundation 傘下に設立(Google・Meta・Microsoft・Isovalent参加)
  • 2022年以降 — Windowsへの移植(eBPF for Windows)も進み、OSを超えた技術標準になりつつある

eBPFを使う主要ツール・プロジェクト比較

eBPFを活用した代表的なツールを用途別に整理します。

ツール名用途カテゴリ概要
Ciliumネットワーク / セキュリティKubernetesのネットワークプラグイン(CNI)。サービスメッシュにも対応
Falcoセキュリティ検知不審なシステムコールをリアルタイム検知。CNCFプロジェクト
Pixie可観測性コード変更不要でKubernetesアプリを自動インストルメント
bpftraceデバッグ / トレースawk風の高レベル言語でカーネル内をワンライナー調査
BCC(BPF Compiler Collection)開発ツールキットPythonやLuaからeBPFプログラムを書けるフレームワーク
KatranロードバランサーMeta製。XDPで超高速L4ロードバランシング
Datadog Agent監視 SaaSeBPFでエージェントレスに近い形でメトリクス収集

eBPFとカーネルモジュールの比較

eBPF vs カーネルモジュール eBPF ✅ 安全:Verifierが事前検証 ✅ 動的ロード(再起動不要) ✅ バグでもシステム継続 ⚠️ 制約あり(メモリ・命令数) 用途: 監視・セキュリティ・NW処理 カーネルモジュール ⚠️ 検証なし:バグで即クラッシュ ⚠️ ロードにroot権限+再起動も ✅ 制約なし・フル機能 ✅ デバイスドライバ等も可能 用途: ドライバ・ファイルシステム等 eBPFは「安全性と柔軟性のバランス」が最大の特徴

eBPFプログラムの処理フロー

eBPFプログラムがカーネルで動くまで ① 作成 C / Rust等 ② コンパイル BPFバイトコード ③ 検証 Verifier確認 ④ JIT変換 ネイティブ命令 ⑤ アタッチ&実行 フックポイントで動作 ❌ 危険なら拒否 Verifier(③)が安全でないプログラムをカーネルロード前に弾くのがeBPFの核心

関連する規格・RFC

※ eBPFはIETF RFC等の標準規格ではなくLinuxカーネルのサブシステムとして発展してきましたが、XDP関連の動作はRFCで参照されています。

規格・参照内容
Linux Kernel Docs: BPFLinuxカーネル公式BPFドキュメント
RFC 9293TCP仕様(XDP/eBPFベースのTCP処理の文脈で参照される)

関連用語