Linux 中的虚拟以太网设备不使用 ARP

Dummy Ethernet Device in Linux Not Working With ARP

我想要 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

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

如何让 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 仍未将其添加为 table 的可行路径。

答案似乎是您不能像普通以太网设备那样执行此操作。您必须创建一个 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" );

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