繁体   English   中英

在用户模式下被 sock_raw 捕获后,如何在内核中丢弃数据包?

[英]How can i drop packet in kernel after catched it by sock_raw in usermode?

我已经使用 sock_raw 从内核获取所有 ip 数据包。

socket(PF_PACKET, SOCK_RAW, htons(protocol);

但是内核中的数据包仍然存在,我该如何丢弃它?

你不能。 当您在原始套接字上接收到数据包时,内核会创建一个副本并将其交付给接收进程。 在此期间,将根据通常的语义继续处理该数据包。 到您的进程收到该消息时,它很可能已经完成(即,堆栈通常会执行的所有操作)。

但是,如果实际上没有将数据包发送到您的机器上(例如,仅由于您的网络接口处于混杂模式而收到数据包),或者没有本地进程[或内核组件]有兴趣接收数据包,该数据包将被丢弃。

如果您只希望接收到达接口的所有数据包而不处理它们,则可以简单地以混杂模式启动接口,而无需为其提供IP地址。 然后,数据包将被传递到原始套接字,但随后将被堆栈丢弃。

老问题,但其他人可能会发现这个答案很有用。

取决于用例,但您实际上可以在从 AF_PACKET SOCK_RAW 获取入口数据包后丢弃它们。 为此,请在我们有删除操作的地方放置一个入口 qdisc。 例子:

sudo tc qdisc add dev eth0 ingress
sudo tc filter add dev eth0 parent ffff: matchall action drop

解释:这是可行的,因为 AF_PACKET 从 per-device tap 嗅探数据包的副本,这比内核网络堆栈的数据包处理管道中的入口 qdisc 早一点。 这样你就可以实现一个简单的用户空间切换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM