是否可以将 NIC 收到的所有数据包推送到 TCP/IP 堆栈,即使它们的以太网地址与我的以太网地址不匹配?换句话说,我想在我的 NIC 上处理所有传入的数据包。谁能提到更改网络接口驱动程序代码的可能方案?我如何检查驱动程序代码的操作?
1 回答
在典型的系统中,这已经发生了。也就是说,您所要做的就是将接口置于混杂模式。然后驱动程序将它收到的所有数据包发送到 TCP/IP 堆栈。检查任何普通的网络驱动程序,您会发现在处理接收到的数据包时,没有将 MAC(或以太网)地址与设备的 MAC 地址进行比较。
大大简化:
通常发生的情况是,当您没有启用混杂模式时,驱动程序会配置设备,使其过滤特定的 MAC 地址,仅传送具有匹配地址或广播地址(或偶尔为多播地址,可能会也可能不会被过滤)。当您启用混杂模式时,驱动程序只是告诉设备不要过滤 MAC 地址,而是传送所有帧。然后驱动程序将接收所有帧并将它们传送到堆栈。在 linux 中,这通常通过调用 netif_receive_skb() 或其变体来实现。
TCP/IP 堆栈本身并不关心 MAC 地址。相反,它将寻找IP地址与自己的IP地址匹配的数据包。任何接收到的没有属于此框的 IP 地址的数据包都将被简单地丢弃——除非有用户模式程序试图接收原始数据包(例如 tcpdump)。[在后一种情况下,它在传递到 tcpdump 后仍然被丢弃。]
如果它与 IP 地址匹配,则将其向上传递到 TCP 或 UDP [等]——如果它不对应于盒子上任何东西关心的会话/端口,它也可能被丢弃。
但通常情况下,发往与分配给该设备的 MAC 地址不匹配的 MAC 地址的数据包不会是该机器关心的数据包。因此,混杂模式通常仅用于调试、故障排除、取证(即 tcpdump、wireshark 等)。其余时间,这是浪费处理资源,因为数据包将被丢弃。