Python 如何使用ebpf/bcc放弃skb_buff?

Python 如何使用ebpf/bcc放弃skb_buff?,python,linux-kernel,bpf,ebpf,bcc-bpf,Python,Linux Kernel,Bpf,Ebpf,Bcc Bpf,我正在运行bcc示例,其中一条注释解释: /* eBPF计划。 筛选有效负载不为空的IP和TCP数据包 并包含“HTTP”,“GET”,“POST”。。。作为有效负载的第一个字节 如果程序加载为PROG_类型\u套接字\u筛选器 并连接到插座上 返回0->丢弃数据包 return-1->保留数据包并将其返回到用户空间(userspace 可以从插座读取它(fd) */ 当我运行这个示例时,我看到当我运行UDP数据包(如dig)或icmp数据包(ping)时,用户程序员确实没有收到数据包 但pi

我正在运行bcc示例,其中一条注释解释:

/*
eBPF计划。
筛选有效负载不为空的IP和TCP数据包
并包含“HTTP”,“GET”,“POST”。。。作为有效负载的第一个字节
如果程序加载为PROG_类型\u套接字\u筛选器
并连接到插座上
返回0->丢弃数据包
return-1->保留数据包并将其返回到用户空间(userspace
可以从插座读取它(fd)
*/
当我运行这个示例时,我看到当我运行UDP数据包(如dig)或icmp数据包(ping)时,用户程序员确实没有收到数据包

但ping或dig程序不会停止

在我的理解中,这些非TCP数据包应该被丢弃(我希望 ping或dig将失败),但事实并非如此

那么原因是什么呢


还有没有其他方法可以放弃skb_buff使用ebpf/bcc?

TL;DR.http parse simple会删除数据包的副本,而不是原始数据包


http parse simple的目标是向用户显示在给定接口上发出的所有http请求的URL。为此目的,它是必要的。原始套接字接收接口上所有传入数据包的副本;这与BPF无关。然后,所附BPF程序用于仅向用户空间发送感兴趣的分组(即,仅HTTP分组);其他数据包的副本被丢弃


因此,http parse simple的用户空间过程仅接收http数据包,并且不会影响原始应用程序(例如,web浏览器),因为BPF程序在数据包副本上工作。

TL;DR.http parse simple会删除数据包的副本,而不是原始数据包


http parse simple的目标是向用户显示在给定接口上发出的所有http请求的URL。为此目的,它是必要的。原始套接字接收接口上所有传入数据包的副本;这与BPF无关。然后,所附BPF程序用于仅向用户空间发送感兴趣的分组(即,仅HTTP分组);其他数据包的副本被丢弃


因此,http parse simple的用户空间过程只接收http数据包,并且不会影响您的原始应用程序(例如web浏览器),因为BPF程序可以处理数据包副本。

我不清楚您的问题中的某些元素。1) 数据包是否被丢弃(你说UDP/ICMP数据包被丢弃了)或者没有(你说你希望ping/dig失败,但它毕竟是有效的,所以可能数据包没有被丢弃?)2)你所说的“是否还有其他方法可以丢弃skb_buff使用ebpf/bcc”是什么意思,你能重新措辞吗?我不清楚你问题中的一些内容。1) 数据包是否已丢弃(您说UDP/ICMP数据包已丢弃)或未丢弃(您添加的数据包预计ping/dig会失败,但它终究会工作,因此数据包可能不会丢弃?)2)您所说的“是否还有其他方法可以丢弃skb_buff使用ebpf/bcc”是什么意思?