其他分享
首页 > 其他分享> > 混杂模式下的数据包套接字仅接收本地流量

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

作者:互联网

我有一个使用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.

解决方法:

与Rob Jones的建议一起,尝试使用Wireshark之类的工具来确保您在接口上收到了期望的数据包.至少这将确认(或否认)您的代码有问题.

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

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

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

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

尝试了所提供的代码.为我工作.当然(由于第102行的测试),这只会打印TCP流量的详细信息.

标签:raw-sockets,security,c-3,linux,promiscuous-mode
来源: https://codeday.me/bug/20191024/1920380.html