eBPF
(extended Berkeley Packet Filter
)起源于BPF
,它提供了内核的数据包过滤机制。
BPF的基本思想是对用户提供两种SOCKET
选项:SO_ATTACH_FILTER
和SO_ATTACH_BPF
,允许用户在sokcet
上添加自定义的filter
,只有满足该filter
指定条件的数据包才会上发到用户空间。SO_ATTACH_FILTER
插入的是cBPF
代码,SO_ATTACH_BPF
插入的是eBPF
代码。eBPF
是对cBPF
的增强,目前用户端的tcpdump
等程序还是用的cBPF
版本,其加载到内核中后会被内核自动的转变为eBPF
。
Linux 3.15 开始引入 eBPF
。其扩充了 BPF
的功能,丰富了指令集。它在内核提供了一个虚拟机,用户态将过滤规则以虚拟机指令的形式传递到内核,由内核根据这些指令来过滤网络数据包。
BPF
和eBPF
的内核文档见Documentation/networking/filter.txt。
eBPF
使用场景包括