Iputils ping 不理解来自 TAP 设备的 ICMP 响应

Posted

技术标签:

【中文标题】Iputils ping 不理解来自 TAP 设备的 ICMP 响应【英文标题】:Iputils ping doesn't understand ICMP response from TAP device 【发布时间】:2020-09-18 19:00:20 【问题描述】:

我正在使用网络堆栈,但被 ICMP 实现所困。我使用 TAP 设备。我确信我从协议方面正确实现了 ICMP,但套接字之间可能存在一些不兼容。 Iputils ping(默认 Linux ping 实现)没有收到任何响应。几点:

    ARP 工作正常(测试:$ arping -I tap0 10.0.0.2) 我对官方 ping 进行了一些调试,发现它在此处返回 -1:https://github.com/iputils/iputils/blob/master/ping/ping_common.c#L668 我在 Wireshark 中看到我从 TAP 正确发送响应,所以看起来 ping 套接字根本不理解我的响应。 我尝试了其他 ping 实现,更特别的是这个:http://www.pdbuchan.com/rawsock/ping4_ll.c 并且它工作正常,ping 接收 ICMP 响应。 我比较了 iputils ping 和替代 (pdbuchan.com) 实现套接字。 iputils ping(不起作用):socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) pdbuchan.com ping(起作用):socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

在我看来,答案就在套接字选项之间。但是我自己找不到。有什么想法吗?

顺便说一句,这是我如何打开和配置我的 TAP 描述符的缩短代码:

// Open
fd = open("/dev/net/tun", O_RDWR);

// TAP, No protocol information, name
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
ioctl(fd, TUNSETIFF, (void *) &ifr);

// Open socket descriptor for network configuration
sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strncpy(ifr.ifr_name, dev, IFNAMSIZ);

// Add address
ifr.ifr_addr.sa_family = AF_INET;
inet_pton(AF_INET, address, &addr->sin_addr);
ioctl(sd, SIOCSIFADDR, &ifr);

// Add subnet mask
inet_pton(AF_INET, subnet_mask, &broadaddr->sin_addr);
ioctl(sd, SIOCSIFNETMASK, &ifr);

// Make interface active
ifr.ifr_flags = (IFF_UP | IFF_RUNNING);
ioctl(sd, SIOCSIFFLAGS, &ifr);

谢谢。

【问题讨论】:

【参考方案1】:

iputils ping 显然在没有人注意到的情况下退化了。您是否偶然从最近的 Debian 发行版(如 Ubuntu 20)进行测试?

https://github.com/iputils/iputils/issues/320

如果您有同样的问题并提出建议,它可能有助于推动 iputils 所有者解决问题。

【讨论】:

以上是关于Iputils ping 不理解来自 TAP 设备的 ICMP 响应的主要内容,如果未能解决你的问题,请参考以下文章

iputils-ping 安装后可以使用 ping

TUN/TAP设备浅析(一) -- 原理浅析

Suse Linux 虚拟机上,ping不通自己,连接不了外网,从主机cmd ping虚拟机请求超时,

为啥 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包

什么是虚拟网络设备呢?

CentOS下使用TUN/TAP虚拟网卡的基本教程