■湖北枝江市職業(yè)教育中心 楊華 杜國(guó)金
根據(jù)平時(shí)的工作實(shí)踐挖掘以下幾種工具的路由探測(cè)功能。
Traceroute 是Linux 和Mac OS 等系統(tǒng)默認(rèn)提供的路由追蹤小程序,Tracert 是Windows系統(tǒng)默認(rèn)提供的路由追蹤小程序。二者的功能相同,都能探測(cè)數(shù)據(jù)包從源地址到目的地址經(jīng)過(guò)的路由器的IP 地址。Traceroute/Tracert 的實(shí)現(xiàn)都借助了TTL:通過(guò)向目的地址發(fā)送一系列的探測(cè)包,設(shè)置探測(cè)包的TTL 初始值分別為1,2,3…,根據(jù)返回的超時(shí)通知(ICMP Time Exceeded Message)得到源地址與目的地址之間的每一跳路由信息。雖然兩者輸出結(jié)果一致,但在實(shí)現(xiàn)原理上還有著顯著的差別。
圖1 端口不可達(dá)路由跟蹤
Traceroute 借助UDP 協(xié)議,Tracert 借助ICMP 協(xié)議。
Traceroute 使用UDP 包進(jìn)行探測(cè),目標(biāo)端口號(hào)默認(rèn)為33434,每次探測(cè)目標(biāo)端口號(hào)加1。Traceroute 故意使用了一個(gè)大于 30000(因UDP 協(xié)議規(guī)定端口號(hào)必須小于30000,所以目標(biāo)主機(jī)收到數(shù)據(jù)包后唯一能做的事就是返回一個(gè)“端口不可達(dá)”的ICMP 報(bào)文)的目標(biāo)端口號(hào),以保證目標(biāo)地址收到數(shù)據(jù)包后能夠返回一個(gè)“端口不可達(dá)”的ICMP 報(bào)文,于是源地址就可將端口不可達(dá)報(bào)文當(dāng)作跟蹤結(jié)束的標(biāo)志,這是巧妙運(yùn)用了UDP協(xié)議的本身特征達(dá)到探測(cè)路由的目的(如圖1 所示)。
但有時(shí)Traceroute 并不能到達(dá)目的地,當(dāng)TTL 增加到一定大小之后就一直拿不到返回的數(shù)據(jù)包了,主要是因?yàn)榘踩珕?wèn)題,在運(yùn)營(yíng)商的路由器上,對(duì)UDP 與ICMP 的數(shù)據(jù)包處理非常謹(jǐn)慎,兩者待遇大不一樣。
為了利于故障排除,ICMP ECHO Request/Reply 是不會(huì)封的,而UDP 則不同。UDP 常被用來(lái)做網(wǎng)絡(luò)攻擊,因?yàn)閁DP 無(wú)需連接,因而沒(méi)有任何狀態(tài)約束它,比較方便攻擊者偽造源IP、偽造目的端口發(fā)送任意多的UDP 包。
所以運(yùn)營(yíng)商為安全考慮,對(duì)于UDP 端口常常采用白名單ACL,就是只有ACL 允許的端口才可以通過(guò),沒(méi)有明確允許的則統(tǒng)統(tǒng)丟棄,比如允許DNS/DHCP/SNMP 等。
其實(shí)這個(gè)時(shí)候數(shù)據(jù)包已經(jīng)到達(dá)目標(biāo)服務(wù)器了,但是因?yàn)榘踩珕?wèn)題大部分的應(yīng)用服務(wù)器都不提供UDP 服務(wù)(或者被防火墻擋掉),所以我們拿不到服務(wù)器的任何返回,程序就理所當(dāng)然的認(rèn)為還沒(méi)有結(jié)束,一直嘗試增加數(shù)據(jù)包的TTL。
目前許多開(kāi)源iOS Traceroute 實(shí)現(xiàn)大多都是基于UDP 的方案,實(shí)際用起來(lái)并不能達(dá)到想要的效果,所以我們需要采用另一種方案來(lái)實(shí)現(xiàn)。
圖2 Traceroute 和Tracert 兩者對(duì)比
圖3 ICMP 協(xié)議數(shù)據(jù)包路由選項(xiàng)
Tracert 使用ICMP 請(qǐng)求回顯(ICMP Echo Request)數(shù)據(jù)包進(jìn)行探測(cè),每跳默認(rèn)發(fā)送3 個(gè)探測(cè)包,在未能到達(dá)路由器或未返回ICMP 超時(shí)通知的情況下,相應(yīng)的延時(shí)位置會(huì)以“*”顯示。每個(gè)探測(cè)包都有唯一的標(biāo)識(shí)號(hào),ICMP 數(shù)據(jù)包使用Seq 進(jìn)行標(biāo)識(shí)。源地址以目的地址返回的ICMP 回應(yīng)答復(fù)(ICMP Echo Reply)作為跟蹤結(jié)束標(biāo)志,這比Traceroute 采用“端口不可達(dá)”作為結(jié)束標(biāo)志可靠多了。兩者對(duì)比如圖2所示。
除了以上專業(yè)的路由跟蹤工具,在其它的網(wǎng)絡(luò)命令中也有此功能的體現(xiàn),如Ping 和Pathing 命令。
命令格式:Ping-r count Record route for count hops.
在“記錄路由”字段中記錄傳出和返回?cái)?shù)據(jù)包的路由。盡管Ping 工具也可以進(jìn)行偵測(cè),但是因?yàn)镮P 頭的限制,Ping 不能完全的記錄下所經(jīng)過(guò)的路由器,因?yàn)椤坝涗浡酚伞弊侄巫畲笾凳?0 字節(jié),而每個(gè)IP 要占有4 個(gè)字節(jié),另外加三個(gè)點(diǎn)分符,每個(gè)IP 占用bit 位4*83=35;40*8/35=9(取整),所有最多只記錄9 條路由記錄。
看一下發(fā)出的請(qǐng)求包:在發(fā)出的ICMP 包中的IP 頭中使用了0x07 的源地址路由選項(xiàng)(如圖3 所示),說(shuō)明ICMP 的路由是根據(jù)返回包的記錄的源地址選項(xiàng)來(lái)實(shí)現(xiàn)路由記錄的,從返回的包中的路由記錄中可以看出和顯示的路由信息完全一致。
但是我們知道,通過(guò)源路由選項(xiàng)我們得出的結(jié)果是從222.42.254.182 返回我們主機(jī)的包,其記錄的路由實(shí)際上是Router3 到PC0 的路由,而不是PC0 到Router3 的路由,這就有差別了。
圖4 網(wǎng)絡(luò)拓?fù)?接口
Tracert 則是通過(guò)遞增TTL 來(lái)實(shí)現(xiàn)的路由檢測(cè),那么他是一個(gè)標(biāo)準(zhǔn)的由我們的主機(jī)到Router3 的路由。
一個(gè)回路,一個(gè)去路,我們想像一下,如果可以結(jié)合這兩個(gè)命令繪制完整的網(wǎng)絡(luò)路由接口圖,如圖4 所示,我們只知道目標(biāo)Router3 的IP,確可以得到完整的網(wǎng)絡(luò)路由接口圖,這對(duì)于網(wǎng)絡(luò)故障的排查是大有幫助的。
遺憾的是,由于本身ICMP 協(xié)議包大小的限制,有時(shí)略顯不足。
(1)由于ICMP 協(xié)議包最多只能保留9 條路由記錄,所以超過(guò)9 條就無(wú)能無(wú)力了。
(2)由于一個(gè)是回路,一個(gè)是去路,因此可能選擇的路由路徑是不一致的,即使是一致的,也會(huì)產(chǎn)生不同的結(jié)果。為什么呢?因?yàn)槁酚啥际嵌嘟涌诘模瑥囊粋€(gè)接口收到包以后,轉(zhuǎn)發(fā)到另一個(gè)接口上,由于Ping 方式獲取的是包返回的路由,所以記錄的都是這個(gè)路由的返回時(shí)候收到包的接口,而TTL 遞增方式則是記錄的發(fā)送包的時(shí)候收到的路由接口地址。
(3)對(duì)于Ping,發(fā)送的是一個(gè)echo request 包,ICMP type=8,code=0,當(dāng)被Ping 者接到相關(guān)ICMP 包的時(shí)候,返回ICMP type=0,code=0 的響應(yīng)包。
而對(duì)于 Tracert,包發(fā)出去后,途經(jīng)的每個(gè)站點(diǎn)都會(huì)返回一個(gè) ICMP type=11,code=0(表示傳輸中TTL=0)的包回去,只有到了終點(diǎn),才會(huì)返回一個(gè) ICMP type=3,code=3。
因此,Ping 和Tracert雖然原理上都是利用ICMP包,但使用的ICMP 類型不一樣,所以可能會(huì)出現(xiàn)Ping通,但Tracert 不通的情況,反之亦然。
【小技巧】如果到達(dá)目網(wǎng)絡(luò)的路由設(shè)備不超過(guò)4 個(gè),可以直接通過(guò)Ping-r-9 來(lái)進(jìn)行跟蹤,因?yàn)槿サ臄?shù)據(jù)包一去一回剛好把來(lái)去的路由接口記錄下來(lái),這樣整個(gè)詳細(xì)的網(wǎng)絡(luò)拓?fù)渚统鰜?lái)了,如下面命令所示:
正在Ping 222.42.254.182 具有32 字節(jié)的數(shù)據(jù):
圖5 運(yùn)行結(jié)果
PathPing 命令是一個(gè)路由跟蹤分析工具,它將Ping和Tracert 命令的功能與這兩個(gè)工具所不提供的其他信息結(jié)合起來(lái),綜合了二者的功能。PathPing 會(huì)先顯示中間的通過(guò)的路由器(類似Tracert 命令得到的信息),然后分別對(duì)每個(gè)中間路由器(節(jié)點(diǎn))發(fā)送一定數(shù)量的Ping包,通過(guò)統(tǒng)計(jì)它們對(duì)Ping 包響應(yīng)的數(shù)據(jù)包來(lái)分析通信質(zhì)量。
正在計(jì)算統(tǒng)計(jì)信息,已耗時(shí) 100 秒...
指向此處的源此節(jié)點(diǎn)/鏈接
如圖5 所示命令,運(yùn)行結(jié)果反映出數(shù)據(jù)包從源主機(jī)到目標(biāo)主機(jī)所經(jīng)過(guò)的路徑、網(wǎng)絡(luò)延時(shí)以及丟包率,顯示在任何特定路由器或鏈接處的數(shù)據(jù)包的丟失程度,可據(jù)此確定存在網(wǎng)絡(luò)問(wèn)題的路由器或子網(wǎng),幫助我們解決網(wǎng)絡(luò)問(wèn)題。
(1)這種方式可能要花費(fèi)一定的時(shí)間成本,它每次給中間節(jié)點(diǎn)發(fā)送的Ping 包可能數(shù)量很大(根據(jù)筆者抓包顯示達(dá)到了上千個(gè)),如果中間節(jié)點(diǎn)又很多,那結(jié)果可想而知,所以要有足夠的耐心等待了。
(2)如果路由器對(duì)Ping關(guān)閉了響應(yīng),那么該節(jié)點(diǎn)的丟包率會(huì)達(dá)到100%,所以這種一般就是關(guān)閉了Ping 回復(fù)。
(3)對(duì)Ping 包丟棄程度只是節(jié)點(diǎn)本身對(duì)Ping 的處理,并不一定影響他的通信,你可以看到,關(guān)閉Ping 回復(fù)命令節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)返回到數(shù)據(jù)是正常的,說(shuō)明回復(fù)的包都成功發(fā)送回來(lái)。