【问题标题】:Push all packets received at network interface card into TCP/IP stack将网络接口卡接收到的所有数据包推入 TCP/IP 堆栈
【发布时间】:2013-12-14 07:43:25
【问题描述】:

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

【问题讨论】:

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

标签: networking tcp linux-device-driver tcp-ip network-interface


【解决方案1】:

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

大大简化:

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

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

如果它与 IP 地址匹配,则将其向上传递到 TCP 或 UDP [等]——如果它不对应于盒子上任何东西关心的会话/端口,它也可能被丢弃.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2012-05-03
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多