如何在Linux上正确地将网络接口置于混杂模式(How to properly put network interface into promiscuous mode on Linux)
那么你如何正确地做到这一点?
我知道如何通过创建套接字,然后使用ioctl设置IFF_PROMISC标志(如“ 如何检查C中的网络设备状态? ”和其他地方中所述),但这至少在理论上看起来有缺陷。
1)你通过ioctl读取标志2)你更新标志3)别人修改标志4)你通过ioctl设置更新的标志
有更好的方法还是我太担心?
后来我发现应该通过setsockopt(也没有竞赛)将接口添加到PACKET_MR_PROMISC,如下所示:
void set_promisc(const char *ifname, bool enable)
{
struct packet_mreq mreq = {0};
int sfd;
int action;
if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("unable to open socket");
return;
}
mreq.mr_ifindex = if_nametoindex(ifname);
mreq.mr_type = PACKET_MR_PROMISC;
if (mreq.mr_ifindex == 0) {
perror("unable to get interface index");
return;
}
if (enable)
action = PACKET_ADD_MEMBERSHIP;
else
action = PACKET_DROP_MEMBERSHIP;
if (setsockopt(sfd, SOL_PACKET, action, &mreq, sizeof(mreq)) != 0) {
perror("unable to enter promiscouous mode");
return;
}
close(sfd);
}
不幸的是,这对接口没有任何影响,尽管它应该,如果我正确地解析文档 。 自2001年(tm)以来可能会被打破 ? pcap source中的评论也抱怨这一点。
So how do you do this properly?
I know how to do it by cr