1. 程式人生 > >traceroute命令初探

traceroute命令初探

.com times 追蹤 如果 類型 udp 應該 定義 可能

一、學習目標

  • 了解traceroute基本概念

  • 了解traceroute工作原理及詳細過程

  • 熟悉traceroute常用命令

  • 一些註意點

二、traceroute基本概念

  traceroute (Windows系統下是tracert) 命令利用ICMP 協議定位您的計算機和目標計算機之間的所有路由器。TTL值可以反映數據包經過的路由器或網關的數量,通過操縱獨立ICMP呼叫報文的TTL值和觀察該報文被拋棄的返回信息,traceroute命令能夠遍歷到數據包傳輸路徑上的所有路由器。traceroute是一條緩慢的命令,因為每經過一臺路由器都要花去大約1015秒。

三、traceroute
工作原理及詳細過程

  traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。盡管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器,所以traceroute正好就填補了這個缺憾。traceroute的原理是非常非常的有意思,它收到目的主機的IP後,首先給目的主機發送一個TTL=1UDP數據包,而經過的第一個路由器收到這個數據包以後,就自動把TTL1,而TTL變為0以後,路由器就把這個包給拋棄了,並同時產生 一個主機不可達的ICMP數據報給主機。主機收到這個數據報以後再發一個TTL=2UDP數據報給目的主機,然後刺激第二個路由器給主機發ICMP

數據報。如此往復直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由IP的問題。有人要問,我怎麽知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCPUDP協議有一個端口號定義,而普通的網絡程序只監控少數的幾個號碼較小的端口,比如說80,比如說23,等等。而traceroute發送的是端口號大於30000(真變態)的UDP報,所以到達目的主機的時候,目的主機只能發送一個端口不可達的ICMP數據報給主機。主機接到這個報告以後就知道,主機到了,所以,說traceroute是一個騙子一點也不為過:)。其詳細過程如下:

  1. 將傳遞到目的IP地址的ICMP Echo
    消息的TTL值被設置為1,該消息報經過第一個路由器時,其TTL值減去1,此時新產生的TTL值為0
  2. 由於TTL值被設置為0,路由器判斷此時不應該嘗試繼續轉發數據報,而是直接拋棄該數據報。由於數據報的生存周期(TTL值)已經到期,這個路由器會發送一個一個ICMP時間超時,即TTL值過期信息返回到客戶端計算機。
  3. 此時,發出traceroute命令的客戶端計算機將顯示該路由器的名稱,之後可以再發送一個ICMP Echo消息並把TTL值設置為2
  4. 1個路由器仍然對這個TTL值減1,然後,如果可能的話,將這個數據報轉發到傳輸路徑上的下一跳。當數據報抵達第2個路由器,TTL值會再被減去1,成為0值。
  5. 2個路由器會像第1個路由器一樣,拋棄這個數據包,並像第1個路由器那樣返回一個ICMP消息。
  6. 該過程會一直持續,traceroute命令不停遞增TTL值,而傳輸路徑上的路由器不斷遞減該值,直到數據報最終抵達預期的目的地。
  7. 當目的計算機接收到ICMP Echo消息時,會回傳一個ICMP Echo Reply消息。

四、traceroute常用命令

  traceroute的用法為: Traceroute [options] <IP-address or domain-name> [data size]

  [options]的內容有:

  • [-n]:顯示的地址是用數字表示而不是符號
  • [-v]:長輸出
  • [-p]:UDP端口設置(缺省為33434)
  • [-q]:設置TTL測試數目(缺省為3)
  • [-t]:設置測包的服務類型

  [data size]:每次測試包的數據字節長度(缺省為38)

技術分享圖片

五、一些註意點

  • 並不是所有網關都會如實返回ICMP超時報文。出於安全性考慮,大多數防火墻以及啟用了防火墻功能的路由器缺省配置為不返回各種ICMP報文,其余路由器或交換機也可能被管理員主動修改配置變為不返回 ICMP報文。因此traceroute程序不一定能拿到所有的沿途網關地址。所以,當某個TTL值的數據包得不到響應時,並不能停止這一追蹤過程,程序仍然會把TTL遞增而發出下一個數據包。這個過程將一直持續到數據包發送到目標主機,或者達到默認或用參數指定的追蹤限制(maximum_hops)才結束追蹤。依據上述原理,利用了UDP數據包的traceroute程序在數據包到達真正的目的主機時,就可能因為該主機沒有提供UDP服務而簡單將數據包拋棄,並不返回任何信息。為了解決這個問題,traceroute故意使用了一個大於30000的端口號,因UDP協議規定端口號必須小於30000,所以目標主機收到數據包後唯一能做的事就是返回一個“端口不可達”的ICMP報文,於是主叫方就將端口不可達報文當作跟蹤結束的標誌。

  • 使用UDPtraceroute,失敗還是比較常見的。這常常是由於,在運營商的路由器上,UDPICMP的待遇大不相同。為了利於troubleshootingICMP ECHO Request/Reply 是不會封的,而UDP則不同。UDP常被用來做網絡攻擊,因為UDP無需連接,因而沒有任何狀態約束它,比較方便攻擊者偽造源IP、偽造目的端口發送任意多的UDP包,長度自定義。所以運營商為安全考慮,對於UDP端口常常采用白名單ACL,就是只有ACL允許的端口才可以通過,沒有明確允許的則統統丟棄。比如允許DNS/DHCP/SNMP等。

  • 總結一下,traceroute主要利用IP數據包的TTL字段值 + ICMP來實現,它發送的用於探測網絡路徑的數據包的IP之上的協議可以是 UDP、TCPICMP不同模式下,探測過程中設計的數據包如下:
  1. UDP模式:UDP探測數據包(目標端口大於30000) + 中間網關發回 ICMP TTL 超時數據包 + 目標主機發回 ICMP Destination Unreachable 數據包
  2. TCP模式:TCP [SYN]探測數據包(目標端口為Web服務的80) + 中間網關發回 ICMP TTL 超時數據包 + 目標主機發回TCP [SYN ACK] 數據包
  3. ICMP模式:ICMP Echo (ping) Request 探測數據包 + 中間網關發回ICMP TTL超時數據包 + 目標主機發回ICMP Echo (ping) reply 數據包
  • traceroute出現*的分析:源發出ICMP Request,第一個requestTTL1,第二個requestTTL2,以後依此遞增直至第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看不到。

traceroute命令初探