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

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

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

谢谢。

【问题讨论】:

    标签: sockets networking ping tap icmp


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多