以下是服务器 A 上的设置:
iface serverA_gre0 inet tunnel
address 172.24.0.85
mode gre
endpoint x.x.x.x
dstaddr 172.24.0.86
netmask 255.255.255.252
ttl 255
在服务器B上设置:
iface serverB_gre0 inet tunnel
address 172.24.0.86
mode gre
endpoint x.x.x.x
dstaddr 172.24.0.85
netmask 255.255.255.252
ttl 255
没有“ttl 255”:
traceroute to 172.24.0.86 (172.24.0.86), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 172.24.0.86 54.507 ms 62.888 ms 51.369 ms
使用“ttl 255”:
traceroute to 172.24.0.86 (172.24.0.86), 30 hops max, 60 byte packets
1 172.24.0.86 51.123 ms 51.733 ms 51.943 ms
当 TTL 255 不存在时,究竟是什么原因导致这些“*”问题?
答案1
生存时间代表生存时间。它是 IP 数据包头中的一个字段。该值最初由发送方设置,通常为 64,并由每个路由器减一。当它在到达最终目的地之前达到 0 时,路由器会丢弃数据包并向原始源发送 ICMP 超时消息。此 TTL 处理对于防止无法路由的 IP 数据包在 IP 网络上永久转发并消耗资源非常重要。
Traceroute 使用此 TTL 行为来确定到达目的地的路径上有哪些跳数和有多少跳数(路由器)。它会按顺序发出具有较小 TTL 的探测 IP 数据包:TTL=1、TTL=2、TTL=3。TTL=1 将被第一个路由器丢弃,TTL=2 将被第一个路由器转发并被第二个路由器丢弃,依此类推。如果 traceroute 从路由器收到 ICMP 超时消息,它将显示其 IP 地址。如果探测超时,则会显示星号。
回到您看到的效果,这是因为 GRE 隧道与 TTL 的工作方式。对于 IPv4 GRE 隧道,默认是将 TTL 从隧道数据包复制到 IPv4 GRE 数据包。这可以通过选项覆盖,ttl
就像您所做的那样。手册中的相关摘录:
ttl N
hoplimit N
set a fixed TTL (IPv4) or hoplimit (IPv6) N on tunneled
packets. N is a number in the range 1--255. 0 is a special
value meaning that packets inherit the TTL value. The default
value for IPv4 tunnels is: inherit. The default value for IPv6
tunnels is: 64.
因此,当您使用 时ttl 255
,traceroute 发送的 TTL=1 的探测将被封装到 TTL=255 的 GRE IPv4 数据包中。这将由所有中间路由器转发并到达隧道端点,由最终目的地接收和处理。当您不使用 时ttl 255
,默认值为ttl inherit
。这意味着 TTL=1 的 traceroute 探测将被封装在 TTL=1 的 GRE IPv4 数据包中。它将被第一个路由器丢弃。但是,被丢弃的是 GRE 数据包,如果路由器发送 ICMP 超时,那么它将引用封装数据包 (GRE) 而不是封装的 traceroute 探测。因此,traceroute 过程将不会收到任何 ICMP 错误,探测超时,并显示星号 (*)。当 TTL 足够大以使 GRE 封装数据包到达隧道端点时,探测最终也会到达最终目的地并显示其 IP 地址。
因此,总而言之,您确实没有问题,但事情完全按照应有的方式运行!