是否有任何实用程序可以仅在一个方向上执行 ICMP 测试(“ping”)?

是否有任何实用程序可以仅在一个方向上执行 ICMP 测试(“ping”)?

最近我在一些网络配置方面遇到了麻烦,解决起来很棘手。

看来这将是很多如果我知道交通无法通过哪个方向,则更容易诊断。由于所有ping请求都没有收到响应,我想知道 ping 请求数据包是否已通过并且响应失败,或者是否是请求本身失败。

需要明确的是,标准实用程序如pingtraceroute依赖于从一台机器发送数据包并接收响应回同一台机器的数据包。当没有响应返回时,总是无法判断初始请求是否未能通过,或者对它的响应被阻止,或者即使对它的响应根本没有发送。正是这个具体细节,“方向是失败”,我想分析一下。

是否有任何适用于 Linux 的常用实用程序可以让我监视传入的 ICMP ping 请求?

答案1

tcpdump可以做到这一点,并且几乎随处可用:

tcpdump -n -i enp0s25 icmp

将转储所有传入和传出的 ICMP 数据包enp0s25

仅查看 ICMP 回显请求:

tcpdump -n -i enp0s25 "icmp[0] == 8"

-n避免 DNS 查找,这会延迟数据包报告并引入不需要的流量。)

这使您可以确定它是否正在从另一台机器接收数据包(您可以从其他机器接收数据包ping),因此问题出在返回路径上,或者它们是否直接没有到达。

答案2

除了 @Stephen Kitt 的建议之外,您还可以tcpdump仅在一个方向上过滤数据包:

  # see if the icmp request exits the interface
  tcpdump -nQ out 'icmp'

tshark是另一个您可以使用的有用工具,它不需要您以 root 身份运行:

  tshark -nf "icmp && (icmp[icmptype] == icmp-echo)"

分开数据包捕获,您可以解析输出

netstat -s

它打印每个网络套接字的统计信息,示例如下:

  netstat -s | grep -Eo "^[[:space:]]+[[:digit:]]+ ICMP messages sent$"; 1>/dev/null ping -c1 -w1 host; !-1

  28 ICMP messages sent
  30 ICMP messages sent

答案3

2平可能适合你。它可能可以通过您的发行版的包管理器获得。

但如果交通正在通过,我不确定它是否能够告诉您任何您不知道的事情。

引用该网站:

2ping 是一个双向 ping 实用程序。它使用 3 路 ping(类似于 TCP SYN、SYN/ACK、ACK)以及 2ping 侦听器和 2ping 客户端之间的事后状态比较来确定发生数据包丢失的方向。

user@alice:~$ 2ping test.2ping.net
2PING test.2ping.net (209.177.154.210): 64 to 512 bytes of data.
Lost outbound packet to 209.177.154.210: ping_seq=1
64 bytes from 209.177.154.210: ping_seq=2 time=10.557 ms
Lost inbound packet from 209.177.154.210: ping_seq=3
64 bytes from 209.177.154.210: ping_seq=4 time=10.527 ms
^C
--- test.2ping.net 2ping statistics ---
4 pings transmitted, 2 received, 50% ping loss, time 4008ms
1 outbound ping losses (25%), 1 inbound (25%), 0 undetermined (0%)
rtt min/avg/max = 10.527/10.542/10.557 ms
6 raw packets transmitted, 3 received

答案4

man traceroute。它将使用TTLICMP Ping 上的小值来从源到目的地路径上的每个节点获取 ICMP 响应(在您的情况下,它更像是从源到荒野,但无论如何)。

tracepath实用程序 ( sudo apt install tracepath;man tracepath) 使用相同的小 TTL 技巧,但在级别上TCP/IP针对指定端口。

相关内容