Networking 将网络接口卡上接收到的所有数据包推入TCP/IP堆栈

Networking 将网络接口卡上接收到的所有数据包推入TCP/IP堆栈,networking,tcp,linux-device-driver,tcp-ip,network-interface,Networking,Tcp,Linux Device Driver,Tcp Ip,Network Interface,是否可以将NIC接收到的所有数据包推送到TCP/IP堆栈,即使它们的以太网地址与我的以太网地址不匹配?换句话说,我希望在我的NIC上处理所有传入的数据包。 有人能提到更改网络接口驱动程序代码的可能方案吗?我如何检查驱动程序代码的操作?在典型系统中,这种情况已经发生。也就是说,您所要做的就是将接口置于混杂模式。然后,驱动程序将接收到的所有数据包发送到TCP/IP堆栈。检查任何普通的网络驱动程序,您将看到在处理接收到的数据包时,MAC(或以太网)地址与设备的MAC地址没有比较 大大简化: 通常情况下

是否可以将NIC接收到的所有数据包推送到TCP/IP堆栈,即使它们的以太网地址与我的以太网地址不匹配?换句话说,我希望在我的NIC上处理所有传入的数据包。
有人能提到更改网络接口驱动程序代码的可能方案吗?我如何检查驱动程序代码的操作?

在典型系统中,这种情况已经发生。也就是说,您所要做的就是将接口置于混杂模式。然后,驱动程序将接收到的所有数据包发送到TCP/IP堆栈。检查任何普通的网络驱动程序,您将看到在处理接收到的数据包时,MAC(或以太网)地址与设备的MAC地址没有比较

大大简化:

通常情况下,当您未启用混杂模式时,驱动程序会对设备进行配置,使其在特定MAC地址上进行过滤,仅传送具有匹配地址或广播地址(或偶尔提供多播地址,该地址也可能被过滤,也可能未被过滤)的帧。当您启用混杂模式时,驱动程序只是告诉设备不要过滤MAC地址,而是发送所有帧。然后,驱动程序将接收所有帧并将它们传送到堆栈。在linux中,这通常通过调用netif_receive_skb()或其变体来实现

TCP/IP堆栈本身并不关心MAC地址。相反,它将查找IP地址与其自身地址匹配的数据包。接收到的任何不具有属于此框的IP地址的数据包都将被丢弃——除非有用户模式程序尝试接收原始数据包(如tcpdump)。[在后一种情况下,它在交付到tcpdump后仍然被丢弃。]

如果它在IP地址上匹配,那么它将被传递到堆栈上的TCP或UDP[etc]——如果它与盒子上任何东西都关心的会话/端口不对应,那么它也可能被丢弃


但通常,发往与分配给该设备的MAC地址不匹配的MAC地址的数据包将不是该机器关心的数据包。因此,混杂模式通常仅在调试、故障排除、取证(即tcpdump、wireshark等)时启用。剩下的时间,这是对处理资源的浪费,因为数据包将被丢弃。

我确信这种混乱的监听是可能的,但您可能需要一个特殊的驱动程序和一个支持它的NIC。这种模式可能对一个进程/线程“仅限独占使用”,也可能不允许传输。我知道可以通过设置IFF-PROMISCURY标志来实现,但在这种模式下,驱动程序不会将数据包发送到TCP/IP堆栈!是否可以更改驱动器代码?它们可能不是TCP/IP段-NIC不知道,它只知道MAC地址。即使是这样,为TCP堆栈提供数据缓冲区也是不明智的,因为TCP堆栈没有参与启动或管理连接。我不确定具体怎么做,但是我的。2:也许使用原始套接字会有所帮助?和/或检查tcpdump是否可以这样做?@kaiwan。通过使用tcpdump或原始套接字,数据包直接发送到用户层,但我想将它们发送到TCP/IP堆栈。