【问题标题】:Dummy Ethernet Device in Linux Not Working With ARPLinux 中的虚拟以太网设备无法使用 ARP
【发布时间】:2022-01-18 10:12:29
【问题描述】:

我想要一个 Linux 中的虚拟以太网设备,它可以像普通以太网设备一样响应,但我可以通过软件连接。我尝试使用以下命令生成一个虚拟设备:

ip link del dummy99
ip link add dummy99 type dummy
ifconfig dummy99 hw ether C8:55:44:33:22:11
ifconfig dummy99 192.168.99.1 up

这会创建一个设备,我可以向 192.168.99.2 发送 ping,它们的地址与我设置此端口的 MAC 地址相同,而不是向 dummy99 发送 ARP 请求。

如何让 Linux 假设整个网络连接到 dummy99,而不是假设整个网络都有接口的 MAC 地址?

我也尝试过创建一个桥接设备来桥接两个设备,但是没有设置 IP 的配置会导致系统(1)生成 ARP 数据包以供 IP 查找,以及(2)实际上知道如何以 Linux 可以找到的方式路由 ARP 回复。

这是一个示例配置,它发送我的应用程序回复的 ARP 数据包,但 Linux 似乎从未看到它们。

ip link del dummy99
ip link add dummy99 type dummy
ifconfig dummy99 hw ether C8:55:44:33:22:11
ifconfig dummy99 up

ip tuntap del tap99 mode tap
ip tuntap add tap99 mode tap
ifconfig tap99 up

ip link del br99 type bridge
ip link add br99 type bridge
ip link set tap99 master br99
ip link set dummy99 master br99
ifconfig br99 up

ifconfig br99 192.168.99.1 up

请注意,即使存在 ARP 回复,Linux 仍然不会将此作为可行路径添加到表中。

【问题讨论】:

  • dummy 不是以太网接口。它是用于环回的附加 IP 地址。
  • 我已经发现了。我正在专门寻找一个虚拟以太网设备。有这种事吗?
  • 网桥上的水龙头设备不工作吗?
  • 这就是我上面展示的内容。它没有 - 至少当你像打开原始套接字来转储/注入数据包一样打开它时不会。您必须按照我在下面的答案中找到的特定方式打开它。
  • 那你应该把它标记为解决你的问题

标签: linux networking ethernet


【解决方案1】:

答案似乎是您不能像普通以太网设备那样执行此操作。您必须创建一个 TAP 设备,如下所示:

    rawpsock = open("/dev/net/tun", O_RDWR);
    if(rawpsock == -1) {
        perror("tapdev: tapdev_init: open");
        exit(1);
    }
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    int err;
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
    strncpy(ifr.ifr_name, "tap4", IFNAMSIZ);
    if( (err = ioctl(rawpsock, TUNSETIFF, (void *) &ifr)) < 0 ) {
        close(rawpsock);
        return err;
    }

    system( "ifconfig tap4 192.168.99.1 up" );

那么你必须使用读/写来从文件句柄中读/写。您不能使用正常的原始套接字访问来访问句柄数据。

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2014-10-27
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多