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