traceroute介紹
Traceroute是Linux和Mac OS等系統默認提供的路由追蹤小程序,Tracert是Windows系統默認提供的路由追蹤小程序。二者的功能相同,都能探測數據包從源地址到目的地址經過的路由器的IP地址。Traceroute/Tracert的實現都藉助了TTL:通過向目的地址發送一系列的探測包,設置探測包的TTL初始值分別爲1,2,3…,根據返回的超時通知(ICMP Time Exceeded Message)得到源地址與目的地址之間的每一跳路由信息。雖然兩者輸出結果一致,但在實現原理上還有着顯著的差別。
工作原理:
Traceroute程序的設計是利用ICMP及IP header的TTL(Time To Live)欄位(field)。首先,traceroute送出一個TTL是1的IP datagram(其實,每次送出的爲3個40字節的包,包括源地址,目的地址和包發出的時間標籤)到目的地,當路徑上的第一個路由器(router)收到這個datagram時,它將TTL減1。此時,TTL變爲0了,所以該路由器會將此datagram丟掉,並送回一個「ICMP time exceeded」消息(包括髮IP包的源地址,IP包的所有內容及路由器的IP地址),traceroute 收到這個消息後,便知道這個路由器存在於這個路徑上,接着traceroute 再送出另一個TTL是2 的datagram,發現第2 個路由器… traceroute 每次將送出的datagram的TTL 加1來發現另一個路由器,這個重複的動作一直持續到某個datagram 抵達目的地。當datagram到達目的地後,該主機並不會送回ICMP time exceeded消息,因爲它已是目的地了,那麼traceroute如何得知目的地到達了呢?
Traceroute在送出UDP datagrams到目的地時,它所選擇送達的port number 是一個一般應用程序都不會用的號碼(30000 以上),所以當此UDP datagram 到達目的地後該主機會送回一個「ICMP port unreachable」的消息,而當traceroute 收到這個消息時,便知道目的地已經到達了。所以traceroute 在Server端也是沒有所謂的Daemon 程式。
Traceroute提取發 ICMP TTL到期消息設備的IP地址並作域名解析。每次 ,Traceroute都打印出一系列數據,包括所經過的路由設備的域名及 IP地址,三個包每次來回所花時間。
原理過程
-
從源地址發出一個UDP探測包到目的地址,並將TTL設置爲1;
-
到達路由器時,將TTL減1;
-
當TTL變爲0時,包被丟棄,路由器向源地址發回一個ICMP超時通知(ICMP Time Exceeded Message),內含發送IP包的源地址,IP包的所有內容及路由器的IP地址;
-
當源地址收到該ICMP包時,顯示這一跳路由信息;
-
重複1~5,並每次設置TTL加1;
-
直至目標地址收到探測數據包,並返回端口不可達通知(ICMP Port Unreachable);
-
當源地址收到ICMP Port Unreachable包時停止traceroute。
注意:
-
Linux和Mac OS等系統使用UDP包進行探測,目標端口號默認爲33434,每次探測目標端口號加1。Traceroute故意使用了一個大於 30000 的目標端口號,以保證目標地址收到數據包後能夠返回一個“端口不可達”的 ICMP 報文,於是源地址就可將端口不可達報文當作跟蹤結束的標誌。
-
Traceroute每跳默認發送3個探測包(發包的數量可通過-q進行設置),探測包的返回會受到網絡情況的影響。如果防火牆封掉了ICMP的返回信息,那麼相應的延時位置會以*顯示。如果某臺網關阻塞或者某臺DNS出現問題,那麼相應行的延時會變長。可以加-n 參數來避免DNS解析,以IP格式輸出數據。
-
每個探測包都有唯一的標識號,使得Traceroute能夠識別返回的包。UDP數據包使用遞增的目標端口號進行標識。
在大多數情況下,我們會在linux主機系統下,直接執行命令行:
traceroute hostname
而在Windows系統下是執行tracert的命令:
tracert hostname
命令格式:
traceroute[參數][主機]
命令功能:
traceroute指令讓你追蹤網絡數據包的路由途徑,預設數據包大小是40Bytes,用戶可另行設置。
具體參數格式:
traceroute [-dFlnrvx][-f<存活數值>][-g<網關>...][-i<網絡界面>][-m<存活數值>][-p<通信端口>][-s<來源地址>][-t<服務類型>][-w<超時秒數>][主機名稱或IP地址][數據包大小]
命令參數:
-d 使用Socket層級的排錯功能。
-f 設置第一個檢測數據包的存活數值TTL的大小。
-F 設置勿離斷位。
-g 設置來源路由網關,最多可設置8個。
-i 使用指定的網絡界面送出數據包。
-I 使用ICMP迴應取代UDP資料信息。
-m 設置檢測數據包的最大存活數值TTL的大小。
-n 直接使用IP地址而非主機名稱。
-p 設置UDP傳輸協議的通信端口。
-r 忽略普通的Routing Table,直接將數據包送到遠端主機上。
-s 設置本地主機送出數據包的IP地址。
-t 設置檢測數據包的TOS數值。
-v 詳細顯示指令的執行過程。
-w 設置等待遠端主機回報的時間。
-x 開啓或關閉數據包的正確性檢驗。
用法
最常用的用法
$ traceroute www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 30 hops max, 60 byte packets
1 * OrayBox.lan (192.168.1.1) 0.353 ms *
2 10.0.11.254 (10.0.11.254) 0.912 ms 1.433 ms 1.627 ms
3 124.205.26.49 (124.205.26.49) 8.052 ms 8.856 ms 9.718 ms
4 10.255.149.185 (10.255.149.185) 3.078 ms 3.338 ms 2.789 ms
5 10.255.36.45 (10.255.36.45) 2.948 ms 2.138 ms 2.986 ms
6 218.241.253.77 (218.241.253.77) 1.712 ms 1.673 ms 1.402 ms
7 14.197.177.21 (14.197.177.21) 4.934 ms 14.197.177.81 (14.197.177.81) 120.167 ms 14.197.178.49 (14.197.178.49) 1.574 ms
8 14.197.249.126 (14.197.249.126) 2.159 ms 14.197.149.182 (14.197.149.182) 2.117 ms 14.197.249.134 (14.197.249.134) 2.342 ms
9 182.61.252.218 (182.61.252.218) 2.938 ms 182.61.252.212 (182.61.252.212) 2.557 ms 182.61.252.220 (182.61.252.220) 2.749 ms
10 * * *
11 * * *
12 * * *
說明:
記錄按序列號從1開始,每個紀錄就是一跳 ,每跳錶示一個網關,我們看到每行有三個時間,單位是 ms,其實就是-q的默認參數。探測數據包向每個網關發送三個數據包後,網關響應後返回的時間;如果您用 traceroute -q 4 www.58.com
,表示向每個網關發送4個數據包。
如果在局域網中的不同網段之間,我們可以通過traceroute 來排查問題所在,是主機的問題還是網關的問題。如果我們通過遠程來訪問某臺服務器遇到問題時,我們用到traceroute 追蹤數據包所經過的網關,提交IDC服務商,也有助於解決問題;但目前看來在國內解決這樣的問題是比較困難的,就是我們發現問題所在,IDC服務商也不可能幫助我們解決。
跳數設置
顯示10行
$ traceroute -m 10 www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 10 hops max, 60 byte packets
1 * * *
2 10.0.11.254 (10.0.11.254) 1.070 ms 1.224 ms 1.520 ms
3 124.205.26.49 (124.205.26.49) 11.125 ms 10.209 ms 11.849 ms
4 10.255.149.185 (10.255.149.185) 2.950 ms 3.523 ms 3.185 ms
5 10.255.36.45 (10.255.36.45) 41.992 ms 41.845 ms 43.245 ms
6 218.241.253.77 (218.241.253.77) 1.564 ms 1.441 ms 1.369 ms
7 14.197.243.61 (14.197.243.61) 2.921 ms 14.197.243.121 (14.197.243.121) 1.768 ms 14.197.229.169 (14.197.229.169) 1.909 ms
8 14.197.178.106 (14.197.178.106) 11.836 ms 14.197.178.94 (14.197.178.94) 2.711 ms 14.197.249.126 (14.197.249.126) 2.306 ms
9 182.61.252.218 (182.61.252.218) 3.604 ms 182.61.252.220 (182.61.252.220) 3.581 ms 2.858 ms
10 * * *
顯示IP地址,不查主機名
$ traceroute -n www.baidu.com
traceroute -n www.baidu.com
traceroute to www.baidu.com (182.61.200.6), 30 hops max, 60 byte packets
1 192.168.1.1 0.354 ms * *
2 10.0.11.254 0.967 ms 1.647 ms 1.816 ms
3 124.205.26.49 7.449 ms 9.085 ms 8.119 ms
4 10.255.149.185 3.085 ms 2.802 ms 3.335 ms
5 * * 10.255.36.45 3.151 ms
6 124.205.98.1 1.459 ms 1.615 ms 1.509 ms
7 14.197.178.41 1.749 ms 14.197.179.69 1.627 ms 14.197.177.21 1.639 ms
8 14.197.249.94 2.123 ms 14.197.249.134 2.334 ms 14.197.249.122 1.969 ms
9 182.61.252.212 2.445 ms 2.555 ms 182.61.252.218 4.362 ms
10 * * *
探測包使用的基本UDP端口設置6888
$ traceroute -p 6888 www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 30 hops max, 60 byte packets
1 * * *
2 10.0.11.254 (10.0.11.254) 0.894 ms 1.404 ms 1.583 ms
3 124.205.26.49 (124.205.26.49) 9.939 ms 13.234 ms 10.687 ms
4 10.255.149.185 (10.255.149.185) 2.609 ms 3.058 ms 3.281 ms
5 10.255.36.45 (10.255.36.45) 1.611 ms 4.104 ms 3.851 ms
6 218.241.253.77 (218.241.253.77) 1.464 ms 1.420 ms 1.332 ms
7 14.197.243.125 (14.197.243.125) 1.525 ms 14.197.177.9 (14.197.177.9) 11.018 ms 14.197.177.21 (14.197.177.21) 1.720 ms
8 14.197.250.170 (14.197.250.170) 2.287 ms 14.197.178.94 (14.197.178.94) 2.403 ms 14.197.149.182 (14.197.149.182) 2.402 ms
9 182.61.252.218 (182.61.252.218) 2.567 ms 182.61.252.210 (182.61.252.210) 2.528 ms 182.61.252.218 (182.61.252.218) 2.427 ms
10 * * *
把探測包的個數設置爲值4
$ traceroute -q 4 www.baidu.com
traceroute to www.baidu.com (182.61.200.6), 30 hops max, 60 byte packets
1 * * * *
2 10.0.11.254 (10.0.11.254) 1.471 ms 1.779 ms 0.812 ms 1.934 ms
3 124.205.26.49 (124.205.26.49) 15.320 ms 13.738 ms 14.399 ms 16.247 ms
4 10.255.149.185 (10.255.149.185) 3.591 ms 3.831 ms 3.195 ms 4.109 ms
5 10.255.36.45 (10.255.36.45) 3.697 ms * * 2.735 ms
6 124.205.98.1 (124.205.98.1) 2.260 ms 2.087 ms 2.273 ms 2.058 ms
7 14.197.179.73 (14.197.179.73) 1.630 ms 14.197.177.9 (14.197.177.9) 9.499 ms 14.197.177.81 (14.197.177.81) 66.843 ms 14.197.178.45 (14.197.178.45) 3.344 ms
8 14.197.149.178 (14.197.149.178) 3.324 ms 14.197.249.126 (14.197.249.126) 2.112 ms 14.197.149.182 (14.197.149.182) 2.139 ms 14.197.178.98 (14.197.178.98) 2.108 ms
9 182.61.252.220 (182.61.252.220) 2.562 ms 182.61.252.212 (182.61.252.212) 2.430 ms 182.61.252.218 (182.61.252.218) 2.464 ms 2.579 ms
10 * * * *
把對外發探測包的等待響應時間設置爲3秒
$ traceroute -w 3 www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 30 hops max, 60 byte packets
1 OrayBox.lan (192.168.1.1) 0.456 ms 0.376 ms *
2 10.0.11.254 (10.0.11.254) 1.532 ms 0.951 ms 1.968 ms
3 124.205.26.49 (124.205.26.49) 71.877 ms 73.608 ms 72.690 ms
4 10.255.149.185 (10.255.149.185) 3.039 ms 2.668 ms 3.273 ms
5 10.255.36.45 (10.255.36.45) 7.212 ms 6.999 ms 7.247 ms
6 218.241.253.77 (218.241.253.77) 1.966 ms 1.840 ms 1.778 ms
7 14.197.178.49 (14.197.178.49) 2.409 ms 14.197.177.5 (14.197.177.5) 1.539 ms 14.197.177.89 (14.197.177.89) 1.724 ms
8 14.197.249.94 (14.197.249.94) 2.540 ms 14.197.178.106 (14.197.178.106) 2.493 ms 14.197.249.122 (14.197.249.122) 1.981 ms
9 182.61.252.210 (182.61.252.210) 7.632 ms 182.61.252.212 (182.61.252.212) 7.551 ms 182.61.252.210 (182.61.252.210) 7.527 ms
10 * * *
案例
深度追蹤針對GitHub的DDoS攻擊
一些注意點
並不是所有網關都會如實返回ICMP超時報文。出於安全性考慮,大多數防火牆以及啓用了防火牆功能的路由器缺省配置爲不返回各種ICMP報文,其餘路由器或交換機也可能被管理員主動修改配置變爲不返回 ICMP報文。因此traceroute程序不一定能拿到所有的沿途網關地址。所以,當某個TTL值的數據包得不到響應時,並不能停止這一追蹤過程,程序仍然會把TTL遞增而發出下一個數據包。這個過程將一直持續到數據包發送到目標主機,或者達到默認或用參數指定的追蹤限制(maximum_hops)才結束追蹤。依據上述原理,利用了UDP數據包的traceroute程序在數據包到達真正的目的主機時,就可能因爲該主機沒有提供UDP服務而簡單將數據包拋棄,並不返回任何信息。爲了解決這個問題,traceroute故意使用了一個大於30000的端口號,因UDP協議規定端口號必須小於30000,所以目標主機收到數據包後唯一能做的事就是返回一個“端口不可達”的ICMP報文,於是主叫方就將端口不可達報文當作跟蹤結束的標誌。
使用UDP的traceroute,失敗還是比較常見的。這常常是由於,在運營商的路由器上,UDP與ICMP的待遇大不相同。爲了利於troubleshooting,ICMP ECHO Request/Reply 是不會封的,而UDP則不同。UDP常被用來做網絡攻擊,因爲UDP無需連接,因而沒有任何狀態約束它,比較方便攻擊者僞造源IP、僞造目的端口發送任意多的UDP包,長度自定義。所以運營商爲安全考慮,對於UDP端口常常採用白名單ACL,就是隻有ACL允許的端口才可以通過,沒有明確允許的則統統丟棄。比如允許DNS/DHCP/SNMP等。
總結一下,traceroute主要利用IP數據包的TTL字段值 + ICMP來實現,它發送的用於探測網絡路徑的數據包的IP之上的協議可以是 UDP、TCP或ICMP。不同模式下,探測過程中設計的數據包如下:
UDP模式:UDP探測數據包(目標端口大於30000) + 中間網關發回 ICMP TTL 超時數據包 + 目標主機發回ICMP Destination Unreachable 數據包
TCP模式:TCP [SYN]探測數據包(目標端口爲Web服務的80) + 中間網關發回 ICMP TTL 超時數據包 + 目標主機發回TCP [SYN ACK] 數據包
ICMP模式:ICMP Echo (ping) Request 探測數據包 + 中間網關發回ICMP TTL超時數據包 + 目標主機發回ICMP Echo (ping) reply 數據包
traceroute出現*的分析:源發出ICMP Request,第一個request的TTL爲1,第二個request的TTL爲2,以後依此遞增直至第30個;中間的router送回ICMP TTL-expired ( ICMP type 11) 通知source,(packet同時因TTL超時而被drop),由此source知曉一路上經過的每一個router;最後的destination送回ICMP Echo Reply(最後一跳不會再回ICMP TTL-expired)。所以中間任何一個router上如果封了ICMP Echo Request, traceroute就不能工作;如果封了type 11(TTL-expired), 中間的router全看不到,但能看到packet到達了最後的destination;如果封了ICMP Echo Reply,中間的全能看到,最後的destination看不到。