$30 off During Our Annual Pro Sale. View Details »

eBPF関連用語メモ

 eBPF関連用語メモ

eBPF関連の言葉について簡単にまとめたメモ

Kazuo Moriwaka

October 22, 2018
Tweet

More Decks by Kazuo Moriwaka

Other Decks in Technology

Transcript

  1. 1
    eBPF 関連用語メモ
    森若和雄
    2018-11-08

    View Slide

  2. 2
    このスライドの位置づけと注意

    対象
    – 「 eBPF という技術があるらしい。なんだろう」と思っている人

    目的
    – eBPF はおおざっぱにどういうものか、関連するソフトウェアにはど
    のようなものがあるかを整理する

    注意
    – 勘違いなどあるかも。気付いたら教えてください m(__)m
    – eBPF 関連ソフトウェアの一部は絶賛開発中。流行らなくて消えて
    いっても泣かない。

    View Slide

  3. 3
    agenda

    BPF: Berkeley Packet Filter

    eBPF: extended BPF

    eBPF 関連のソフトウェア
    – bpftool
    – BCC, bcc-tools
    – XDP+eBPF, bpfilter

    links

    View Slide

  4. 4
    BPF: Berkeley Packet Filter

    UNIX カーネルでネットワークのパ
    ケットフィルタを実装するに導入さ
    れた仕組み (1992 年 )

    ユーザランドのプログラムが必要に
    応じてパケットを選別するためのプ
    ログラムを構成し、カーネルに渡す

    カーネルはパケットをフィルタした
    結果を返したり送ったりする
    BPF バイナリ
    アプリケー
    ション
    BPF バイナリ
    システムコールや
    デバイス経由で渡す
    検証
    実行
    kernel 内
    フック
    BPF JIT
    kernel

    View Slide

  5. 5
    BPF の”プログラム”とは
    任意のプログラムを渡せるようにすると悪さ (DoS 攻撃な
    ど ) ができるのでまずい。これを避けるために…… :

    実際のハードウェアから独立した小さな仕様の命令セット
    アーキテクチャ (ISA) を定義

    アプリケーションはこの ISA で作ったバイナリを渡す

    カーネルは実行前にプログラムに問題がないか検証をお
    こなってから実行する

    View Slide

  6. 6
    BPF 利用例

    tcpdump
    – “src ip 192.168.10.2” みたいなオプションをBPF に変換してカーネルに渡


    dhcp client
    – IP などを構成前のインタフェースで適切なパケットだけ受信するためにフィル
    タリングするために利用

    libpcap
    – libpcap はBPF の処理系を独自に持っていてカーネルを利用できない場合
    ( キャプチャ済みのファイルをフィルタしたい場合など ) にフィルタできるように
    している

    View Slide

  7. 7
    BPF が
    あるとき ないとき
    アプリケー
    ション
    BPF で
    フィルタ
    パケット
    受信
    kernel
    要りそうな
    パケットだけ処理
    AF_PACKET
    アプリケー
    ション
    パケット
    受信
    kernel
    全パケットを処理
    AF_PACKET
    ● アプリケーショ
    ンでは一部のパ
    ケットだけ扱い
    たい
    ● BPF でフィルタ
    することで起床
    回数が大きく変
    わる
    ● CPU 負荷に大き
    く影響する

    View Slide

  8. 8
    eBPF: extended BPF

    BPFの仮想マシン仕様を拡張
    して高速化

    eBPF mapと呼ばれるメモリを
    扱える

    kernel 内のヘルパー関数を呼
    び出せるcall 命令(mapのデー
    タ構造処理など)

    アプリケーションからmapを読
    み書きできるので情報が渡せる

    eBPFを仕込めるフックが増え

    BPF バイナリ
    アプリケー
    ション
    BPF バイナリ
    システムコールや
    デバイス経由で渡す
    検証
    実行
    kernel 内
    フック
    BPF JIT
    ebpf-map
    kernel
    kernel 内
    フック
    kernel 内
    フック
    kernel 内
    フック
    BPF 用関数

    View Slide

  9. 9
    eBPF 大まかな仕様

    64bit レジスタ r1 〜 r10

    stack 512 bytes

    map 領域 ( 複数のデータ領域 ) 、
    context(attach 先により異なる ) 、
    stack へアクセス

    call で kernel 内にあらかじめ用意さ
    れた関数呼び出し

    無条件 jump, if つきjump
    # bpftool prog dump x id 26
    0: (bf) r6 = r1
    1: (69) r7 = *(u16 *)(r6 +192)
    2: (b4) (u32) r8 = (u32) 0
    3: (55) if r7 != 0x8 goto pc+14
    4: (bf) r1 = r6
    5: (b4) (u32) r2 = (u32) 12
    6: (bf) r3 = r10
    7: (07) r3 += -4
    8: (b4) (u32) r4 = (u32) 4
    9: (85) call bpf_skb_load_bytes#6374400
    10: (18) r1 = map[id:25]
    12: (bf) r2 = r10
    13: (07) r2 += -8
    14: (62) *(u32 *)(r2 +0) = 32
    15: (85) call trie_lookup_elem#83840
    16: (15) if r0 == 0x0 goto pc+1
    17: (44) (u32) r8 |= (u32) 2
    18: (55) if r7 != 0xdd86 goto pc+14
    19: (bf) r1 = r6
    20: (b4) (u32) r2 = (u32) 8
    21: (bf) r3 = r10
    22: (07) r3 += -16
    23: (b4) (u32) r4 = (u32) 16
    24: (85) call bpf_skb_load_bytes#6374400
    25: (18) r1 = map[id:26]
    27: (bf) r2 = r10
    28: (07) r2 += -20
    29: (62) *(u32 *)(r2 +0) = 128

    View Slide

  10. 10
    eBPF JIT コンパイラ

    eBPF 命令を CPU の命令に 1 to 1 で変換
    – x86-64 、 ARM-64 、 s390 、 PowerPC 64 、 SPARC
    64 、 MIPS 、 ARM32
    – 未対応の場合または JIT が disable されている場合は
    インタプリタで実行

    View Slide

  11. 11
    eBPF 、拡張されたらどう変わった ?

    ざっくり 1.5 〜 4.0 倍くらいに高速化

    ユースケースがフィルタ以外にも拡大
    – パケットの加工
    – seccomp でシステムコールをフィルタ
    – パフォーマンスモニタリング (kprobe, uprobe, tracepoint,
    perf_events, USDT)
    – XDP とくみあわせてプロトコル処理の前に drop/forward
    “Packet Filter”
    以外もいろいろ
    やるぜ

    View Slide

  12. 12
    eBPF 関連のソフトウェア

    bpftool - 基本的な管理を行う

    BCC - C 言語で eBPF のプログラムを書ける

    bcc-tools - BCC を利用した主にパフォーマンスモニタリン
    グ関連のプログラム

    bpfilter - eBPF を利用したネットワークフィルタリングの仕組


    bpftables - bpfilter を利用したファイアウォール

    View Slide

  13. 13
    bpftool

    bpf の基本的な管理をするツール

    カーネルに登録された bpf プログラムや map の表示
    や管理をおこなう
    – bpftool prog list → bpf で登録されたプログラム一覧
    – bpftool prog dump xlated id 35 → 35 番のプログラム表

    – bpftool map dump id 35 → 35 番の map 表示

    View Slide

  14. 14
    BCC: BPF Compiler Collection

    eBPF を便利に使うための仕組み

    eBPF でいろいろな仕組みをカーネルに差し込めるの便利
    – でもアドホックにプログラムを書きたいので、機械語列をC 言語
    マクロでゴリゴリ書くのは面倒……
    – map の用意もも微妙に手間がかかる

    C言語で書いてコンパイラでeBPF バイナリを吐ければ楽
    – LLVM でコンパイルしよう( ターゲットアーキテクチャとしてebpf をを持つ)

    言語バインディングもつくった(Python, lua, go)

    サンプルスクリプト( 主にパフォーマンスモニタリング関連) も大量に作った

    View Slide

  15. 15
    BCC が
    ないとき (man 2 bcc より ) あるとき (bitesize より )
    C 言語だ
    やったね !
    マクロで
    バイナリ……

    View Slide

  16. 16
    bcc-tools を使ってみる

    必要なパッケージ (bcc, bcc-tools, python3-bcc)
    – ※ ディストリビューションによっては” bcc” という別のコンパイ
    ラと名前が競合するので bpfcc になっている

    チュートリアル
    – https://github.com/iovisor/bcc/blob/master/docs/tutorial.md

    example を見ながら bcc-tools のスクリプトを実行して
    みる /usr/share/bcc/tools/*

    View Slide

  17. 17
    bcc-tools に同梱のスクリプト例

    trace
    – トレースポイントで条件を満たすとトレースメッセージを出力
    する汎用スクリプト

    opensnoop, biosnoop, syncsnoop, killsnoop
    – システムのどこかで open 等 を行うとメッセージを出力するスクリプト

    pythonflow, javaflow, perlflow, rubyflow, phpflow
    – 各言語での call flow を出力するスクリプト

    その他にもいろいろあります

    View Slide

  18. 18
    実行例
    $ sudo /usr/share/bcc/tools/opensnoop
    PID COMM FD ERR PATH
    8925 gnome-shell 23 0 /proc/self/stat
    9206 gsd-housekeepin 11 0 /etc/fstab
    9206 gsd-housekeepin 11 0 /proc/self/mountinfo
    $ sudo /usr/share/bcc/tools/execsnoop
    PCOMM PID PPID RET ARGS
    gio-launch-desk 9347 1 0 /usr/bin/gio-launch-desktop gnome-terminal
    gnome-terminal 9347 1 0 /usr/bin/gnome-terminal
    zsh 9355 6016 0 /bin/zsh
    grepconf.sh 9356 9355 0 /usr/libexec/grepconf.sh -c
    $ sudo /usr/share/bcc/tools/xfsslower
    Tracing XFS operations slower than 10 ms
    TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME
    17:00:13 b'mozStorage # 12915 S 0 0 34.30 b'favicons.sqlite-wal
    17:00:13 b'mozStorage # 12915 S 0 0 46.56 b'favicons.sqlite-wal
    システム全体の
    どこかで exec
    したらログ出力
    システム全体の
    どこかで open
    したらログ出力
    xfs で 10ms 以上
    かかった操作を
    ログ出力

    View Slide

  19. 19
    XDP + eBPF
    ● 受信したパケット
    を eBPF でフィル
    タ & フォワード
    ● eBPF バイナリの
    実行を SmartNIC
    にオフロードする
    ことで広帯域に対
    応 &CPU 負荷減少
    https://www.iovisor.org/technology/xdp より

    View Slide

  20. 20
    bpfilter

    eBPF を利用してファイアウォールを実現するとき用
    のプログラム

    iptables のルールを読んで ebpf のプログラムを生成
    →eBPF プログラム手書きしなくてもよくなる

    View Slide

  21. 21
    注意点

    eBPF を単に BPF と呼んでいる文書も多数ある

    kernel-devel 等を入れてヘッダファイルを提供する
    – 実行中のカーネルとバージョンをあわせる

    probe を差し込むカーネル関数が将来も存在するとは限
    らない

    bcc-tool の Python 3 対応がまだイマイチなので、試して
    何かあればバグレポートしよう

    View Slide

  22. 22
    まとめ

    eBPF は独自の仮想マシンを使ってユーザランドか
    ら安全なコードをカーネルに渡す仕組み

    BPF はパケットフィルタのために登場したが eBPF
    はパフォーマンスモニタリングや seccomp などの用
    途にも利用

    SmartNIC へのオフロードで標準的な仕組みでプロ
    グラム可能かつ広帯域に対応するフィルタリングへ
    の利用も期待

    View Slide

  23. 23
    links

    オリジナルのBPF: http://www.tcpdump.org/papers/bpf-usenix93.pdf

    bpf(2): http://man7.org/linux/man-pages/man2/bpf.2.html

    A thorough introduction to eBPF: https://lwn.net/Articles/740157/

    BCC: https://www.iovisor.org/technology/bcc

    Why is the kernel community replacing iptables with BPF?
    https://cilium.io/blog/2018/04/17/why-is-the-kernel-community-replacing-iptables/

    BPF, eBPF, XDP and Bpfilter… What are These Things and What
    do They Mean for the Enterprise?
    https://www.netronome.com/blog/bpf-ebpf-xdp-and-bpfilter-what-are-these-
    things-and-what-do-they-mean-enterprise/

    View Slide