【问题标题】:How to properly put network interface into promiscuous mode on Linux如何在 Linux 上正确地将网络接口置于混杂模式
【发布时间】:2017-01-16 14:06:07
【问题描述】:

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

我知道如何创建套接字,然后使用 ioctl 设置 IFF_PROMISC 标志(如“howto check a network devices status in 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);
}

不幸的是,这对界面没有任何影响,但如果我正确理解the doc,它应该会。可能是broken since 2001 (tm)? pcap 源中的评论也抱怨这一点。

【问题讨论】:

  • 为什么您认为ioctl 是错误的?什么是“更好更简单的方法”?
  • 读取/修改/写入标志操作应该是原子的。

标签: c linux network-programming


【解决方案1】:

PACKET_MR_PROMISC 为设备开启混杂模式。这不会反映在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]

【讨论】:

  • 感谢您为我正确阅读。 O:-) (“ip 链接”也不显示 P 标志......)如果测试表明它确实有效,则立即支持并接受它,尽管有人可能会说这是由于其他原因而损坏(人们希望看到使用 ifconfig 配置的模式等等)。
  • 好的。是的,它有效。供参考:混杂模式仅保留到套接字关闭。此后,恢复先前有效的模式。因此,如果我理解正确,则无法使用此界面设置混杂模式并退出(保持模式)。这对我来说没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2014-04-27
  • 1970-01-01
  • 2011-08-29
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多