*本文原創(chuàng)作者:ArkTeam/YSYY,轉(zhuǎn)載須注明來自FreeBuf.COM
一、路由追蹤程序traceroute/tracert
Traceroute是Linux和Mac OS等系統(tǒng)默認提供的路由追蹤小程序,Tracert是Windows系統(tǒng)默認提供的路由追蹤小程序。二者的功能相同,都能探測數(shù)據(jù)包從源地址到目的地址經(jīng)過的路由器的IP地址。Traceroute/Tracert的實現(xiàn)都借助了TTL:通過向目的地址發(fā)送一系列的探測包,設(shè)置探測包的TTL初始值分別為1,2,3…,根據(jù)返回的超時通知(ICMP Time Exceeded Message)得到源地址與目的地址之間的每一跳路由信息。 雖然兩者輸出結(jié)果一致,但在實現(xiàn)原理上還有著顯著的差別。
二、Traceroute實現(xiàn)原理

1. 從源地址發(fā)出一個UDP探測包到目的地址,并將TTL設(shè)置為1;
2. 到達路由器時,將TTL減1;
3. 當(dāng)TTL變?yōu)?時,包被丟棄,路由器向源地址發(fā)回一個ICMP超時通知(ICMP Time Exceeded Message),內(nèi)含發(fā)送IP包的源地址,IP包的所有內(nèi)容及路由器的IP地址;
4. 當(dāng)源地址收到該ICMP包時,顯示這一跳路由信息;
5. 重復(fù)1~5,并每次設(shè)置TTL加1;
6. 直至目標(biāo)地址收到探測數(shù)據(jù)包,并返回端口不可達通知(ICMP Port Unreachable);
7. 當(dāng)源地址收到ICMP Port Unreachable包時停止traceroute。
注:
1. Linux和Mac OS等系統(tǒng)使用UDP包進行探測,目標(biāo)端口號默認為33434,每次探測目標(biāo)端口號加1。Traceroute故意使用了一個大于 30000 的目標(biāo)端口號,以保證目標(biāo)地址收到數(shù)據(jù)包后能夠返回一個“端口不可達”的 ICMP 報文,于是源地址就可將端口不可達報文當(dāng)作跟蹤結(jié)束的標(biāo)志。
2.Traceroute每跳默認發(fā)送3個探測包(發(fā)包的數(shù)量可通過-q進行設(shè)置),探測包的返回會受到網(wǎng)絡(luò)情況的影響。如果防火墻封掉了ICMP的返回信息,那么相應(yīng)的延時位置會以*顯示。如果某臺網(wǎng)關(guān)阻塞或者某臺DNS出現(xiàn)問題,那么相應(yīng)行的延時會變長??梢约?n 參數(shù)來避免DNS解析,以IP格式輸出數(shù)據(jù)。
3.每個探測包都有唯一的標(biāo)識號,使得Traceroute能夠識別返回的包。UDP數(shù)據(jù)包使用遞增的目標(biāo)端口號進行標(biāo)識。
三、Tracert實現(xiàn)原理

1. 從源地址發(fā)出一個ICMP請求回顯(ICMP Echo Request)數(shù)據(jù)包到目的地址,并將TTL設(shè)置為1;
2. 到達路由器時,將TTL減1;
3. 當(dāng)TTL變?yōu)?時,包被丟棄,路由器向源地址發(fā)回一個ICMP超時通知(ICMP Time Exceeded Message),內(nèi)含發(fā)送IP包的源地址,IP包的所有內(nèi)容及路由器的IP地址;
4. 當(dāng)源地址收到該ICMP包時,顯示這一跳路由信息;
5. 重復(fù)1~5,并每次設(shè)置TTL加1;
6. 直至目標(biāo)地址收到探測數(shù)據(jù)包,并返回ICMP回應(yīng)答復(fù)(ICMPEcho Reply);
7. 當(dāng)源地址收到ICMP Echo Reply包時停止tracert。
注:
1.Windows系統(tǒng)使用ICMP請求回顯(ICMP Echo Request)數(shù)據(jù)包進行探測,源地址以目的地址返回的ICMP回應(yīng)答復(fù)(ICMP Echo Reply)作為跟蹤結(jié)束標(biāo)志。
2.Traceroute每跳默認發(fā)送3個探測包。在未能到達路由器或未返回ICMP超時通知的情況下,相應(yīng)的延時位置會以*顯示。
3.每個探測包都有唯一的標(biāo)識號,ICMP數(shù)據(jù)包使用seq進行標(biāo)識。
四、Wireshark抓包解析
本次實驗通過追蹤本機到達 www.baidu.com 所經(jīng)過的路由信息,并使用Wireshark抓取數(shù)據(jù)包進行簡要分析來驗證traceroute和tracert的實現(xiàn)原理。
1.Linux/Mac OS——traceroute
(1 ) Mac OS
traceroute www.baidu.com 。

如圖,Traceroute能夠顯示到達目的地址所需的跳數(shù)、經(jīng)過的路由器的IP地址、延時、丟包情況等信息。第一跳為10.203.4.225,第二跳為10.2.30.1,第三跳為10.2.1.1;每條記錄輸出3個延時結(jié)果,說明源地址每次默認發(fā)送三個數(shù)據(jù)包;在11條記錄只有1個延時結(jié)果,說明源地址只收到了1個ICMP超時通知消息。

如圖,源地址10.203.4.244向目的地址119.75.218.70發(fā)送UDP數(shù)據(jù)包,每跳默認發(fā)送3個,TTL設(shè)置為1;數(shù)據(jù)包遇到路由器之后,被丟棄,返回Time tolive exceeded超時通知,解析出路由器IP地址10.203.4.225。源地址再發(fā)數(shù)據(jù)包,設(shè)置TTL=2,從而解析出第二跳路由10.2.30.1。同理,解析出第三跳路由10.2.1.1。與終端顯示的信息相符。