tracepath 指令:取代 traceroute 查看躍點與路徑 MTU

測試環境RHEL 系列AlmaLinux 9.8iputils 20210202root 帳號Debian 12 · traceroute 2.1.2 一般帳號
網路指令tracepath位置/usr/bin/tracepath

在 Linux 伺服器上,用 tracepath 指令不需 root 權限就能查看封包到達目的地所經過的路徑(躍點)和路徑 MTU。我們在沒有安裝 traceroute 的 AlmaLinux 9 伺服器上把躍點數限制為 10,查看到 example.com 的路徑,結果到第四個躍點都能讀到回應時間和路徑 MTU 1500,之後六個躍點沒有回應。

下方輸出是在 AlmaLinux 9.8 伺服器(root 帳號)上執行的結果,traceroute 版本和套件狀態則是在 Debian 12 伺服器(一般帳號)上確認。第一個躍點和中間路由器的 IPv6 位址已換成文件用的範例位址,回應時間和 pmtu 值保持原樣。

1️⃣ tracepath 指令用法

  • ↪️ 查看到目的地的躍點和路徑 MTU

tracepath 接收一個目的地名稱或 IP 位址,送出 UDP 封包,並依 TTL 順序每行輸出一個有回應的躍點。預設最大躍點數為 30,可用 -m 修改。

對 example.com 我們加上 -m 10,只查到第十個躍點。

tracepath -n -m 10 example.com
 1?: [LOCALHOST]                        0.006ms pmtu 9001
 1:  fe80::1%eth0                                          0.077ms pmtu 1500
 1:  2001:db8:a::5b                                        2.627ms asymm  8 
 2:  2001:db8:a::52                                        1.473ms asymm 12 
 3:  2001:db8:b::1e                                       19.653ms asymm  9 
 4:  2001:db8:c::                                          3.642ms asymm 11 
 5:  no reply
 6:  no reply
 7:  no reply
 8:  no reply
 9:  no reply
10:  no reply
     Too many hops: pmtu 1500
     Resume: pmtu 1500 

這台伺服器把封包送到 example.com 的 IPv6 位址,到第四個躍點都有回應時間。從第五個躍點起一直是 no reply,因此沒有出現表示在十個躍點內到達目的地的 reached 行,執行約 18 秒才結束。

對同一目的地不加 -m 執行時,30 秒內沒有結束。無回應躍點多的路徑,用 -m 減少要查的躍點數再執行。

已安裝的 tracepath 版本用 -V 查看,這台伺服器的 tracepath 是 iputils 20210202。

tracepath -V
tracepath from iputils 20210202

2️⃣ 解讀 tracepath 輸出

  • ↪️ 躍點編號、pmtu、asymm、reached

每行輸出依序是躍點編號、回應的位址、往返時間。路徑 MTU 改變的地方會加上 pmtu,去程和回程的躍點數不同時會加上 asymm。每行要看的內容如下。

輸出說明
1?:躍點編號欄 — 無法從回應取得 TTL 而推測的編號會加上 ?
[LOCALHOST]封包尚未送出到網路前,伺服器本身的那一行
0.077ms到該躍點的往返時間
pmtu 1500在該處改變的路徑 MTU(位元組)— 只有改變時才會出現
asymm 8去程與回程的躍點數差異 — 官方手冊說明這不是可靠的值
no reply對該 TTL 送出的封包沒有回應的躍點
reached到達目的地的那一行
Too many hops查到 -m 設定的躍點數就停止
Resume: pmtu … hops … back …整條路徑的 MTU、到目的地的躍點數、回程躍點數的推測值

在 example.com 的輸出中,第一行 [LOCALHOST] 的 pmtu 是 9001,在第一個躍點變成 1500。TTL 1 那行只換了位址出現兩次,也是官方手冊範例中的樣子。手冊說明,第一個封包若因路徑 MTU 在第一個躍點被拒,同一 TTL 的那行會再出現一次。

到達目的地時,行尾會加上 reached,最後的 Resume 行會顯示到目的地的躍點數。送往 127.0.0.1 時一個躍點就出現 reached,Resume 行為 [pmtu 65535 hops 1 back 1]。

tracepath -n 127.0.0.1
 1:  127.0.0.1                                             0.047ms reached
     Resume: pmtu 65535 hops 1 back 1 

沒有 reached 而以 Too many hops 結束的路徑,表示在 -m 設定的躍點內沒有收到目的地的回應。example.com 的路徑到十個躍點也沒有 reached,所以 Resume 行只剩 pmtu,沒有躍點數。

3️⃣ tracepath 選項

  • ↪️ -n、-b、-m 與封包長度 -l

tracepath 的選項只有 -4、-6、-n、-b、-l、-m、-p、-V 八個,不帶目的地執行時,這份清單會作為用法顯示。不加選項執行時會把回應的位址解析成名稱,送往 localhost 時躍點欄顯示 localhost。

tracepath localhost
 1?: [LOCALHOST]                        0.003ms pmtu 65536
 1:  localhost                                             0.048ms reached
 1:  localhost                                             0.030ms reached
     Resume: pmtu 65536 hops 1 back 1 

[tracepath -n] 不解析名稱,只輸出 IP 位址。對同一個 localhost 加上 -n 後,躍點欄變成 IPv6 位址 ::1,example.com 的路徑用 -n 執行時,躍點欄也只顯示位址。

tracepath -n localhost
 1?: [LOCALHOST]                        0.005ms pmtu 65536
 1:  ::1                                                   0.039ms reached
 1:  ::1                                                   0.010ms reached
     Resume: pmtu 65536 hops 1 back 1 

-b 同時輸出名稱和位址。對 127.0.0.1 加上 -b 後,名稱後面的括號裡附上位址,顯示為 [localhost (127.0.0.1)]。

tracepath -b 127.0.0.1
 1:  localhost (127.0.0.1)                                 0.050ms reached
     Resume: pmtu 65535 hops 1 back 1 

-m 是設定最大查詢躍點數的選項,可指定 0 到 255。加上 -m 0 時沒有躍點行,直接只出現 Too many hops 和 Resume 行;輸入 256 則以 [out of range] 被拒。

tracepath -m 0 127.0.0.1
     Too many hops: pmtu 65535
     Resume: pmtu 65535 

-l 是第一個送出的封包長度,預設值 IPv4 為 65535 位元組、IPv6 為 128000 位元組。對 127.0.0.1 加上 -l 1500 後,Resume 行的 pmtu 從 65535 變成 1500。

tracepath -l 1500 -n 127.0.0.1
 1:  127.0.0.1                                             0.028ms reached
     Resume: pmtu 1500 hops 1 back 1 

-p 是設定第一個目的 UDP 連接埠的選項。對 127.0.0.1 加上 -p 33434 的結果和不加時相同。

選項複製說明
-n不解析名稱,只輸出 IP 位址
-b同時輸出名稱和位址
-m躍點數指定最大查詢躍點數,預設 30
-l長度指定第一個封包長度,預設 IPv4 65535、IPv6 128000
-V輸出版本後結束
選項複製說明
-4只傳送到 IPv4 位址
-6只傳送到 IPv6 位址
-p連接埠指定第一個目的 UDP 連接埠

4️⃣ tracepath 與 traceroute 的差異

  • ↪️ 安裝、權限、送出的封包

在無法安裝 traceroute 的伺服器上,改用 tracepath 取代 traceroute 查看路徑。我們確認的 AlmaLinux 9.8 伺服器沒有 traceroute 套件,而 tracepath 包含在 iputils 套件中,不必另外安裝就能執行。

rpm -q traceroute
package traceroute is not installed

Debian 12 伺服器正好相反:已安裝 traceroute 2.1.2,包含 tracepath 的 iputils-tracepath 套件則沒有安裝。

traceroute --version
Modern traceroute for Linux, version 2.1.2
Copyright (c) 2016  Dmitry Butskoy,   License: GPL v2 or any later
apt-cache policy iputils-tracepath
iputils-tracepath:
  Installed: (none)
  Candidate: 3:20221126-1+deb12u1

就像這兩台伺服器,不同發行版內建的指令不同,因此先確認連線的伺服器上有哪一個。tracepath 不需要 root 權限,只要能送出 UDP 封包的帳號都能執行。AlmaLinux 9.8 伺服器上的 tracepath 執行檔權限也是 rwxr-xr-x,沒有另外附加的權限(capability)。

項目tracepathtraceroute
AlmaLinux 9.8 伺服器包含在 iputils 套件中,可直接執行未安裝
Debian 12 伺服器未安裝 iputils-tracepath 套件已安裝 traceroute 2.1.2
送出的封包UDP預設 UDP,-I 為 ICMP,-T 為 TCP
每個躍點的輸出一行預設送三次,三個時間(用 -q 修改)
選項數八個:-4 -6 -n -b -l -m -p -V光是 --help 第一頁就超過 20 個

若需要用 ICMP 或 TCP 查看路徑,或每個躍點送多次來比較時間,就要安裝並使用 traceroute 指令。在不易安裝或也想一併查看路徑 MTU 的伺服器上,tracepath 比較合適。

🔲 tracepath 指令模擬器

在下方模擬器中,可以只改躍點數重新查看 example.com 的路徑,或對 localhost 和 127.0.0.1 直接輸入 -n、-b、-m、-l 比較差異。

tracepath 指令模擬器iputils 20210202
[root@server work]#
只在瀏覽器內運作,不會送出實際封包。用 ↑↓ 可以叫回先前輸入的指令。

🔢 FAQ & 推薦內容

結束代碼無法判斷。對 example.com 用 -m 10 執行,沒有 reached 而以 Too many hops 結束時,結束代碼也是 0。名稱解析失敗和無效參數是 1,不帶目的地執行時是 255。結束代碼只區分執行錯誤,是否到達目的地要看輸出中的 reached 行。

localhost 送往 IPv6 位址 ::1,所以第一行 [LOCALHOST] 顯示迴路介面的 MTU 65536;IPv4 的 127.0.0.1 則原樣顯示 IPv4 預設封包長度 65535。用 ip link 確認的 lo 介面 MTU 也是 65536。

加上 -4 就只送往 IPv4 位址。對 localhost 加上 -4 後,沒有 [LOCALHOST] 行,經 IPv4 一個躍點就出現 reached;反過來對 127.0.0.1 加上 -6,則以 [Address family for hostname not supported] 結束。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 5   +   8   =