持续 Ping 期间 TTL 发生变化

持续 Ping 期间 TTL 发生变化

我们使用 Viasat,并将调制解调器直接插入基于 Linux 的负载平衡器。

我使用 putty 通过 SSH 进入负载均衡器并 ping google

当我 ping google 时,结果是这样的:

- PING 8.8.8.8 (8.8.8.8) from x.x.x.x : 64(92) bytes of data.

- 72 bytes from 8.8.8.8: icmp_seq=1 ttl=123 time=4.02 ms
- 72 bytes from 8.8.8.8: icmp_seq=2 ttl=123 time=8.40 ms
- 72 bytes from 8.8.8.8: icmp_seq=3 ttl=123 time=11.1 ms
- 72 bytes from 8.8.8.8: icmp_seq=4 ttl=123 time=16.2 ms
- 72 bytes from 8.8.8.8: icmp_seq=5 ttl=123 time=7.37 ms
- 72 bytes from 8.8.8.8: icmp_seq=6 ttl=123 time=10.0 ms
- 72 bytes from 8.8.8.8: icmp_seq=7 ttl=123 time=12.9 ms
- 72 bytes from 8.8.8.8: icmp_seq=8 ttl=123 time=7.04 ms
- 72 bytes from 8.8.8.8: icmp_seq=9 ttl=123 time=11.4 ms
- 72 bytes from 8.8.8.8: icmp_seq=10 ttl=123 time=10.5 ms
- 72 bytes from 8.8.8.8: icmp_seq=11 ttl=123 time=7.30 ms
- 72 bytes from 8.8.8.8: icmp_seq=12 ttl=123 time=4.42 ms
- 72 bytes from 8.8.8.8: icmp_seq=13 ttl=123 time=12.9 ms
- 72 bytes from 8.8.8.8: icmp_seq=14 ttl=55 time=573 ms
- 72 bytes from 8.8.8.8: icmp_seq=15 ttl=123 time=9.64 ms
- 72 bytes from 8.8.8.8: icmp_seq=16 ttl=123 time=12.0 ms
- 72 bytes from 8.8.8.8: icmp_seq=17 ttl=123 time=6.09 ms
- 72 bytes from 8.8.8.8: icmp_seq=18 ttl=123 time=9.14 ms
- 72 bytes from 8.8.8.8: icmp_seq=19 ttl=55 time=567 ms
- 72 bytes from 8.8.8.8: icmp_seq=20 ttl=55 time=556 ms
- 72 bytes from 8.8.8.8: icmp_seq=21 ttl=55 time=567 ms
- 72 bytes from 8.8.8.8: icmp_seq=22 ttl=123 time=7.83 ms
- 72 bytes from 8.8.8.8: icmp_seq=23 ttl=55 time=557 ms
- 72 bytes from 8.8.8.8: icmp_seq=24 ttl=55 time=555 ms
- 72 bytes from 8.8.8.8: icmp_seq=25 ttl=55 time=564 ms
- 72 bytes from 8.8.8.8: icmp_seq=26 ttl=55 time=565 ms
- 72 bytes from 8.8.8.8: icmp_seq=27 ttl=55 time=562 ms
- 72 bytes from 8.8.8.8: icmp_seq=28 ttl=123 time=10.0 ms
- 72 bytes from 8.8.8.8: icmp_seq=29 ttl=123 time=13.0 ms
- 72 bytes from 8.8.8.8: icmp_seq=30 ttl=123 time=12.5 ms
- 72 bytes from 8.8.8.8: icmp_seq=31 ttl=123 time=5.36 ms
- 72 bytes from 8.8.8.8: icmp_seq=32 ttl=123 time=8.44 ms
- 72 bytes from 8.8.8.8: icmp_seq=33 ttl=123 time=10.8 ms
- ^C
- --- 8.8.8.8 ping statistics ---
- 33 packets transmitted, 33 received, 0% packet loss, time 47026ms
- rtt min/avg/max/mdev = 4.020/160.648/573.236/246.800 ms

These entries:
72 bytes from 8.8.8.8: icmp_seq=19 ttl=55 time=567 ms

该延迟是唯一类似于卫星延迟的延迟,其余的延迟肯定不是卫星延迟,并且 TTL 从 123 变为 55!

此外,此 ping 操作仅通过负载平衡器的 Sat. 调制解调器接口执行。当您尝试从平衡器或外部主机仅 ping 调制解调器(网关)时,它不会响应,就像 ICMP 被阻止一样。

同样,当我们跟踪路由出接口时,下一跳(网关)只是 * * *

任何有 Viasat 连接经验或知道具体情况的人都请帮忙。

答案1

我相信您的答案将来自某种形式的traceroute。但是,正如评论中所讨论的那样,您有一条路径显然没有经过卫星。某些系统有此实用程序名为tracerttracerouttracepath提供类似的功能。

请注意,您可能需要多次运行 traceroute 才能真正捕获意外路径。还请注意,防火墙可能会削弱 traceroute 的有效性。虽然显然 icmp 不会被完全阻止,但安全设备通常配置为不生成 traceroute 在其默认操作模式下所依赖的“目标不可达”icmp 消息。traceroute 对一个 TTL 的回答是 * * * 并不意味着下一个不会有答案。您的 ping 测试已验证 google.com 至少会做出响应。

另一个选项可能是ping -R。但是,我自己尝试了这个选项,似乎 Google 不支持这种用法,因此您需要找到一个支持该用法的其他目标。此选项的工作原理是包含一个标头选项,要求路由器在将数据包传递给目标时记录它们的身份,然后将响应传回源。我没有经常使用此选项,但我猜安全设备也可能会干扰其输出 - 要么只是不提及它们的存在,要么将请求丢弃。

答案2

可能是多种原因。首先,我系统上的 ping 手册页对 TTL 进行了如下说明:

在正常操作中,ping 会打印收到的数据包中的 TTL 值。当远程系统收到 ping 数据包时,它可以在响应中对 TTL 字段执行以下三项操作之一:

  • 不改变它;这是 Berkeley Unix 系统在 4.3BSD Tahoe 版本之前所做的。在这种情况下,收到的数据包中的 TTL 值将是 255 减去往返路径中的路由器数量。

  • 将其设置为 255;这是当前 Berkeley Unix 系统的做法。在这种情况下,收到的数据包中的 TTL 值将是 255 减去从远程系统到 ping 主机的路径中的路由器数量。

  • 将其设置为其他值。有些机器对 ICMP 数据包使用与 TCP 数据包相同的值,例如 30 或 60。其他机器可能使用完全不同的值。

其次,从技术上讲,没有什么可以阻止路由器或安全设备对通过它的流量施加最大 TTL,这很容易产生您所看到的影响。

因此,我的第一个建议是,您的流量可能会被负载平衡到使用 TTL 为(例如)60 的目标主机(上面的选项 3)

或者,路由器或其他设备可能会对您的计算机和目的地之间可能路由之一上的 TTL 做出意外操作。请记住,这些路由可能全部通过您的卫星连接;互联网并不保证每次都使用相同的路径发送您的数据包。

使用 traceroute 的建议是合理的。如果反复执行该命令后,从您的主机到目的地的路径没有显示任何变化,那么很可能是目的地修改了 TTL。

请注意,当您在 traceroute 中看到一长串“* * *”响应时,这表明您和您的目的地之间的设备正在对 TTL 执行一些意外的操作,至少对于 traceroute 使用的“目的地不可达”ICMP 消息而言(其处理方式与 ping 使用的“回显请求”数据包略有不同)。

如果您的 ping 命令允许您设置 TTL,您可以尝试几个不同的值来查看您得到的响应 TTL。

答案3

我发现 8.8.8.8 默认是平衡的。我必须使用 4.2.2.2 才能使 ping 仅从 WAN2 发出。感谢大家的回复,我希望我们都动脑筋想出了这个问题。所以我们都赢了,对吧?呵呵...

相关内容