在usermode中通过sock_raw捕获后,如何在内核中丢弃数据包?

时间:2014-06-03 08:46:08

标签: linux linux-kernel

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

socket(PF_PACKET, SOCK_RAW, htons(protocol);

但是内核中的数据包仍然存在,我怎么能放弃呢?

1 个答案:

答案 0 :(得分:0)

你做不到。当您在原始套接字上收到数据包时,内核已创建一个副本并将其传递给您的接收进程。根据通常的语义,数据包将在此期间继续处理。在您的流程收到它之前,它可能已经完成(即无论堆栈通常会用它做什么)。

但是,如果数据包实际上并不是指向您的盒子(例如,您只是因为混合模式下的网络接口而接收它),或者没有本地进程[或内核组件]感兴趣接收它,无论如何都会丢弃数据包。

如果您只是希望接收到达接口的所有数据包而不进行处理,您可以简单地将接口置于混杂模式而不为其提供IP地址。然后数据包将被传送到您的原始套接字,但随后将被堆栈丢弃。