我正在运行 bcc 示例/http_filter/http-parse-simple.c,其中一条注释解释:
/*
eBPF program.
Filter IP and TCP packets, having payload not empty
and containing "HTTP", "GET", "POST" ... as first bytes of payload
if the program is loaded as PROG_TYPE_SOCKET_FILTER
and attached to a socket
return 0 -> DROP the packet
return -1 -> KEEP the packet and return it to user space (userspace
can read it from the socket_fd )
*/
当我运行这个例子时,我看到当我运行UDP数据包(如dig(或icmp数据包(ping(时,用户程序员确实没有收到数据包。
但是 ping 或挖掘程序不会掉线。
在我的理解中,这些非TCP数据包应该被丢弃(我希望 ping 或挖掘会失败(,但事实并非如此。
那么原因是什么呢?
还有没有其他方法可以放弃skb_buff使用ebpf/bcc?
TL;DR.http-parse-simple丢弃数据包的副本,而不是原始数据包。
http-parse-simple的目标是向用户显示给定接口上发出的所有HTTP请求的URL。为此,它创建一个原始套接字并将 BPF 程序附加到其中。原始套接字接收接口上所有传入数据包的副本;这独立于BPF。然后使用附加的BPF程序仅向用户空间传输感兴趣的数据包(即仅HTTP数据包(;其他数据包的副本将被丢弃。
因此,http-parse-simple 的用户空间进程只接收 HTTP 数据包,并且它不会影响您的原始应用程序(例如,Web 浏览器(,因为 BPF 程序在数据包副本上工作。