一、學習目標
了解traceroute基本概念
了解traceroute作業原理及詳細程序
熟悉traceroute常用命令
一些注意點
二、traceroute基本概念
traceroute (Windows系統下是tracert) 命令利用ICMP 協議定位您的計算機和目標計算機之間的所有路由器。TTL值可以反映資料包經過的路由器或網關的數量,通過操縱獨立ICMP呼叫報文的TTL值和觀察該報文被拋棄的回傳資訊,traceroute命令能夠遍歷到資料包傳輸路徑上的所有路由器。traceroute是一潭訓慢的命令,因為每經過一臺路由器都要花去大約10到15秒。
三、traceroute作業原理及詳細程序
traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。盡管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器,所以traceroute正好就填補了這個缺憾。traceroute的原理是非常非常的有意思,它收到目的主機的IP后,首先給目的主機發送一個TTL=1的UDP資料包,而經過的第一個路由器收到這個資料包以后,就自動把TTL減1,而TTL變為0以后,路由器就把這個包給拋棄了,并同時產生 一個主機不可達的ICMP資料報給主機。主機收到這個資料報以后再發一個TTL=2的UDP資料報給目的主機,然后刺激第二個路由器給主機發ICMP資料報。如此往復直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由IP的問題。有人要問,我怎么知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCP和UDP協議有一個埠號定義,而普通的網路程式只監控少數的幾個號碼較小的埠,比如說80,比如說23,等等。而traceroute發送的是埠號大于30000(真變態)的UDP報,所以到達目的主機的時候,目的主機只能發送一個埠不可達的ICMP資料報給主機。主機接到這個報告以后就知道,主機到了,所以,說traceroute是一個騙子一點也不為過:)。windows 7下tracert 詳細程序如下:
將傳遞到目的IP地址的ICMP Echo訊息的TTL值被設定為1,該訊息報經過第一個路由器時,其TTL值減去1,此時新產生的TTL值為0。
由于TTL值被設定為0,路由器判斷此時不應該嘗試繼續轉發資料報,而是直接拋棄該資料報。由于資料報的生存周期(TTL值)已經到期,這個路由器會發送一個一個ICMP時間超時,即TTL值過期資訊回傳到客戶端計算機。
此時,發出traceroute命令的客戶端計算機將顯示該路由器的名稱,之后可以再發送一個ICMP Echo訊息并把TTL值設定為2。
第1個路由器仍然對這個TTL值減1,然后,如果可能的話,將這個資料報轉發到傳輸路徑上的下一跳。當資料報抵達第2個路由器,TTL值會再被減去1,成為0值。
第2個路由器會像第1個路由器一樣,拋棄這個資料包,并像第1個路由器那樣回傳一個ICMP訊息。
該程序會一直持續,traceroute命令不停遞增TTL值,而傳輸路徑上的路由器不斷遞減該值,直到資料報最終抵達預期的目的地。
當目的計算機接收到ICMP Echo訊息時,會回傳一個ICMP Echo Reply訊息。
注: Windows 7 默認ICMP協議,Ubuntu 默認不帶引數為UDP協議。
四、traceroute常用命令
traceroute的用法為: Traceroute [options] <IP-address or domain-name> [data size]
[options]的內容有:
[-n]:顯示的地址是用數字表示而不是符號
[-v]:長輸出
[-p]:UDP埠設定(預設為33434)
[-q]:設定TTL測驗數目(預設為3)
[-t]:設定測包的服務型別
五、一些注意點
并不是所有網關都會如實回傳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看不到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/76941.html
標籤:網絡通信
上一篇:本人菜鳥希望來個明白人給指點指點
