【问题标题】:Packet socket in promiscuous mode only receiving local traffic混杂模式下的数据包套接字仅接收本地流量
【发布时间】:2010-11-22 11:03:56
【问题描述】:

我有一个使用socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 创建的套接字,我已使用以下方法将其设置为混杂模式:

struct ifreq ifr;
strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE);
if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2);

struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = ifr.ifr_ifindex;
mr.mr_type = PACKET_MR_PROMISC;
if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2);

问题是当我从套接字执行read() 时,它只返回来自或来自我的计算机的数据。

如何让它读取和处理网络上的所有数据包?

Wireshark 可以正常显示所有数据包,所以我知道这不是我的计算机或 NIC。 ifconfig 报告它在运行时是 PROMISC

【问题讨论】:

    标签: c linux security raw-sockets promiscuous-mode


    【解决方案1】:

    根据 Rob Jones 的建议,尝试使用 Wireshark 之类的工具,以确保您在接口处接收到预期的数据包。至少这会确认(或否认)您的代码有问题。

    还需要确保接口本身设置为混杂模式。 如果没有,那么您可以使用 ioctl() 进行设置:

    ifr.ifr_flags |= IFF_PROMISC;
    if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
    {
        // handle error here
    }
    

    当您的应用程序正在运行时,请确保 ifconfig 报告该接口的 PROMISC 标志。

    请注意,这需要以特权用户身份执行。


    试用了显示的代码。为我工作。当然(由于第 102 行的测试)这只会打印 TCP 流量的详细信息。

    【讨论】:

    • 可以,但是socket仍然不会接收其他流量。
    • 我设法解决了这个问题,这是最有帮助的答案。谢谢!
    【解决方案2】:

    尝试使用 SOCK_PACKET 作为 socket() 的第二个参数,而不是 SOCK_RAW。

    如果您使用的是交换机,您可能只会看到发往或来自您计算机的数据包。试试集线器。

    【讨论】:

    • 如果我这样做,bind() 会失败。此外,它已被弃用。
    • 很公平。您是否以特权用户身份运行?
    【解决方案3】:

    这可能不是软件问题。

    您可能使用了错误的硬件。您的计算机可能已连接到 Switch。 交换机足够聪明,可以“了解”哪些计算机在哪些端口上,并将流量仅路由到它需要去的地方。因此,交换机正在为您过滤数据包。

    要解决此问题,您需要获得一个集线器。尽管集线器和交换机看起来非常相似,但它们的工作方式不同。集线器是哑的,会将所有流量路由到所有端口,使您能够在混杂模式下查看其他流量。

    请注意,即使您更换了计算机连接的设备,它也可能会连接到更多上游交换机,这也会限制流量。因此,您将无法从比您自己的集线器或测试实验室设置更远的地方嗅探流量。

    【讨论】:

      【解决方案4】:

      您的交换机端口也需要适当配置(思科世界中的 SPAN 端口)。 有关详细信息,请参见此处:

      http://www.winpcap.org/misc/faq.htm#Q-22

      以下是思科提供的关于 SPAN 端口如何工作的信息:

      http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-06
        • 2013-09-06
        • 2016-08-04
        • 1970-01-01
        • 2019-04-09
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多