这是服务器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
Run Code Online (Sandbox Code Playgroud)
服务器 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
Run Code Online (Sandbox Code Playgroud)
没有“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
Run Code Online (Sandbox Code Playgroud)
使用“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
Run Code Online (Sandbox Code Playgroud)
当 TTL 255 不存在时,究竟是什么导致了那些“*”问题?
小智 5
TTL代表生存时间。它是存在于 IP 数据包头中的字段。该值最初由发送方设置,通常为 64,每个路由器减 1。当它在到达最终目的地之前到达 0 时,路由器丢弃该数据包并将 ICMP Time Exceeded 消息发送回原始源。这种 TTL 处理对于防止无法路由的 IP 数据包在 IP 网络上永久转发、消耗资源非常重要。
Traceroute 使用此 TTL 行为来确定到达目的地的路径上有哪些跃点和多少跃点(路由器)。它依次发送具有小 TTL 的探测 IP 数据包:TTL=1、TTL=2、TTL=3。TTL=1 将被第一个路由器丢弃,TTL=2 将被第一个转发并被第二个丢弃,依此类推。如果 traceroute 收到来自路由器的 ICMP Time Exceeded 消息,它将显示其 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.
Run Code Online (Sandbox Code Playgroud)
因此,当您使用 时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 地址。
因此,总而言之,您确实没有问题,但事情完全按照预期进行!