gpt4 book ai didi

c - 如何在 Linux 上正确地将网络接口(interface)置于混杂模式

转载 作者:太空狗 更新时间:2023-10-29 15:31:47 28 4
gpt4 key购买 nike

那么如何正确地做到这一点呢?

我知道如何创建套接字,然后使用 ioctl 设置 IFF_PROMIScflags(如“howto check a network devices status in C?”和其他地方所述),但这至少在理论上看起来是有缺陷的。

  1. 你通过 ioctl 读取标志
  2. 你更新标志
  3. 其他人修改了标志
  4. 您通过 ioctl 设置更新的标志

有没有更好的方法,还是我太担心了?

后来我发现应该通过 setsockopt(也没有竞争)向 PACKET_MR_PROMISC 添加接口(interface),如下所示:

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);
}

不幸的是,这对界面没有任何影响,虽然它应该,如果我不明白the doc正确。可能 broken since 2001 (tm) ?pcap 源代码中的评论也提示这一点。

最佳答案

PACKET_MR_PROMISC 打开设备的混杂模式。这不会反射(reflect)在 ifconfig 显示的状态中,因为它不会修改设备上全局 IFF_PROMISC 标志的状态。但这并不意味着它还没有完成。这就是 pcap 库现在的工作方式,而 wireshark(和许多其他实用程序)可以打开设备并查看未发送到本地系统的数据包这一事实表明它可以正常工作。

每台设备上都有一个内部计数器,每次进程使用 PACKET_MR_PROMISC 时该计数器都会递增,并在该进程消失时递减。这解决了您最初描述的比赛。

从您提供的最后一个链接:

> IFF_PROMISC is not set,
It's not supposed to be set.
The correct way to put into promiscuous mode the device to which a
PF_PACKET socket is to do a SOL_PACKET/PACKET_ADD_MEMBERSHIP
"setsockopt()" call with PACKET_MR_PROMISC as the argument (see the
"packet(7)" man page), and that's what libpcap is doing.
The old way of directly setting IFF_PROMISC had problems - to quote the
comment at the front of "pcap-linux.c":
[snipped]

关于c - 如何在 Linux 上正确地将网络接口(interface)置于混杂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41678219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com