我 ping 一个主机:
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=47 time=53.8 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=47 time=54.2 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=47 time=49.1 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 49.112/52.401/54.202/2.329 ms
中断第一个 ping 命令后,我立即再次执行该操作:
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2016ms
100% 数据包丢失。为什么?
每次都是这样。只有在中断第一个 ping 后等待至少 30 秒(加减一秒)再执行第二个 ping,第二个 ping 才能正常工作。执行 ping前30 秒过去后将导致 ping 失败(如上所示),即使我让它超过 30 秒标记,但 30 秒“计时器”不会重置。
第一次和第二次尝试 ping 不同的主机没有任何变化。
在 ping 的同时运行 tcpdump,我看到在两种情况下都发送了 ICMP 回显并且收到了 ICMP 回复。
我还使用 Net::Ping Perl 模块重现了该问题,因此问题不仅限于 /bin/ping(除非 Net::Ping 直接使用 /bin/ping)。
我使用一个非常标准的当前 Debian 安装,它作为防火墙运行,并使用我认为非常标准的 iptables 规则执行 NAT。
答案1
您的回显请求可能受到速率限制。失败请求的 ICMP 回复的原始地址应该会告诉您在哪里受到限制。
在 iptables 中设置速率限制相对简单。
尝试使用类似 ping 的程序mtr
应该可以快速显示出您受到限制的地方。
编辑:检查您是否使用 iptables 对任何内容进行速率限制。您可能希望对传入的 ECHO 请求进行速率限制,但如果指定不正确,则可能会对所有传入的 ICMP 数据包进行速率限制。limit
在 的输出中查找iptables -L -n
。