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 响应的主要内容,如果未能解决你的问题,请参考以下文章
Suse Linux 虚拟机上,ping不通自己,连接不了外网,从主机cmd ping虚拟机请求超时,