最近我在一些网络配置方面遇到了麻烦,解决起来很棘手。
看来这将是很多如果我知道交通无法通过哪个方向,则更容易诊断。由于所有ping
请求都没有收到响应,我想知道 ping 请求数据包是否已通过并且响应失败,或者是否是请求本身失败。
需要明确的是,标准实用程序如ping
和traceroute
依赖于从一台机器发送数据包并接收响应回同一台机器的数据包。当没有响应返回时,总是无法判断初始请求是否未能通过,或者对它的响应被阻止,或者即使对它的响应根本没有发送。正是这个具体细节,“方向是失败”,我想分析一下。
是否有任何适用于 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
。它将使用TTL
ICMP Ping 上的小值来从源到目的地路径上的每个节点获取 ICMP 响应(在您的情况下,它更像是从源到荒野,但无论如何)。
该tracepath
实用程序 ( sudo apt install tracepath;man tracepath
) 使用相同的小 TTL 技巧,但在级别上TCP/IP
针对指定端口。