混杂模式下的数据包套接字仅接收本地流量

non*_*237 5 c linux security raw-sockets promiscuous-mode

我有一个使用 创建的套接字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);
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能让它读取和处理网络上的所有数据包?

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

And*_*mbe 4

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

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

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

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

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


尝试了所提供的代码。对我有用。当然(由于第 102 行的测试)这只会打印 TCP 流量的详细信息。