這是伺服器 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
TTL代表生存時間。它是 IP 封包標頭中存在的一個欄位。該值最初由發送方設置,通常為 64,並由每個路由器遞減 1。當它在到達最終目的地之前達到 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 程序不會收到任何 ICMP 錯誤,偵測逾時,並顯示星號 (*)。當 TTL 足夠大以使 GRE 封裝的封包到達隧道端點時,探測最終也到達最終目的地並顯示其 IP 位址。
因此,總而言之,您確實沒有問題,但事情完全按照應有的方式進行!