首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在用户模式下被sock_raw捕获后,如何在内核中丢弃数据包?

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

Stack Overflow用户
提问于 2014-06-03 08:46:07
回答 2查看 893关注 0票数 0

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

代码语言:javascript
复制
socket(PF_PACKET, SOCK_RAW, htons(protocol);

但是包在内核中还活着,我如何丢弃它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-03 14:52:34

你不能。当您在原始套接字上接收数据包时,内核已经创建了一个副本并将其传递给您的接收进程。在此期间,数据包将继续按照通常的语义进行处理。这很可能在您的进程接收到它之前已经完成(即堆栈通常使用它所做的任何操作都已经完成)。

但是,如果数据包实际上不是命中注定到您的盒中(例如,您接收它只是因为您有杂乱模式的网络接口),或者如果没有本地进程或内核中的组件对接收它感兴趣,那么包无论如何都会被丢弃。

如果您只是希望接收到达接口的所有数据包而不对它们进行处理,那么您可以简单地以混杂的方式打开接口,而不给它IP地址。然后,数据包将被传递到您的原始套接字,但随后将被堆栈丢弃。

票数 1
EN

Stack Overflow用户

发布于 2022-07-07 12:42:28

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

这取决于usecase,但实际上您可以在从AF_PACKET SOCK_RAW获得它们之后丢弃它们。要做到这一点,请在有空投动作的地方放置一个入口qdisc。示例:

代码语言:javascript
复制
sudo tc qdisc add dev eth0 ingress
sudo tc filter add dev eth0 parent ffff: matchall action drop

解释:这是可行的,因为AF_PACKET从每个设备的抽头中嗅探数据包的副本,这比内核网络堆栈的数据包处理管道中的入口盘早一点。这样,您就可以实现一个简单的用户空间开关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24010769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档