BPFに関する情報収集
BPFについてサーベイしたので、それのまとめ. BPF for Dummiesのプロトタイプといえるよういしていけたら最高である。 現状は雑記状態なのでご了承いただきたい.
BPFとは,何をするためのものか
正直, 僕自身もよく分からない。 BPFはin kernelのパケットフィルタに最適な 仮想機械として設計実装されたが、現在はkernel内部のあらゆるデータフローを トレーシングやデバッグするために 用いられている。といった感じか。。。
構成
eBPFがattachできるポイントは現状で以下. ちなみにcBPFはsocketのみをサポートしている
- socket (via setsockopt) (hook skb)
- kprobe (via bcc) (func-call-infos)
- uprobe (via bcc) (func-call-infos)
- trace points (via bcc) (func-call-infos)
- syscall (via seccmomp) (system-call-infos)
- tc (no exploring)
みやすくするとこんな感じ(iovisorのスライド)
cBPF,eBPF
eBPF(Extended BPF)の登場後、伝統的なBPFの区別のために伝統的なBPFをcBPF (Classic BPF)とよぶようになりました。現在では一般的にBPFと呼ぶとeBPFを さしていることがほとんどのようです。
違いを簡単にまとめた.
cBPF | eBPF | |
---|---|---|
Register | 32bit 2 regs | 64bit 10 regs |
Memory | stack | stack |
Instruction | 4B ld/st to stack | 1-8B ld/st to stack |
Instruction | 1-8B ld to packet | 1-8B ld/st fo packet |
Instruction | Cond Jump forward | Cond Jump forward/backward |
Instruction | ALU Instructions | Same + Signed Shift + Bswap |
Else | . | Helper Functions |
Else | . | Helper Data Structure |
引用: https://www.slideshare.net/PLUMgrid/ebpf-and-linux-networking
Linuxではより高度な作業を可能にするためSKBのフィールドをマクロで参照できるよう にしている。kernel docに概要がのせられているので、以下に示す。
len skb->len proto skb->protocol type skb->pkt_type poff Payload start offset ifidx skb->dev->ifindex nla Netlink attribute of type X with offset A nlan Nested Netlink attribute of type X with offset A mark skb->mark queue skb->queue_mapping hatype skb->dev->type rxhash skb->hash cpu raw_smp_processor_id() vlan_tci skb_vlan_tag_get(skb) vlan_avail skb_vlan_tag_present(skb) vlan_tpid skb->vlan_proto rand prandom_u32()
引用: https://www.kernel.org/doc/Documentation/networking/filter.txt
CPUのIDまでとれるらしい。恐ろしい。。
命令セット
ここで書くと長くなってしまうので、別の記事に分割した。 そちらを参照すること。
活用例
- bcc (Generic Tracing Tool)
- seccomp
- socket filter