天天看點

路由追蹤:traceroute/tcptraceroute

一.工作原理

traceroute:IP路由過程中對資料包TTL(Time to Live,存活時間)進行處理。當路由器收到一個IP包時,會修改IP包的TTL(及由此造成的頭部檢驗和checksum變化)。每收到一個包,檢查這個 的TTL是否是0。如果是,表明這個包還沒有到達目的地,而且剩餘時間不多了,肯定是到不了目的地了。這樣路由器就簡單地丢棄這個包,并給源主機發送 ICMP通知,說這個包已經逾時了。ICMP的通知資訊裡包含目前路由器發送時所用的IP。這樣就可以通過構造資料包,來間接檢查到達一個主機時經過了哪些路由。一開始發送一個TTL為1的包,這樣到達第一個路由器的時候就已經逾時了,第一個路由器就發通知說包逾時,這樣就可以記錄下 所經過的第一個路由器的IP。然後TTL加1,安全通過第一個路由器,而第二個路由器的的處理與第一個相同,丢包,發通知說包逾時了,這樣記錄下第二個路 由器IP,由此可以一直進行下去,直到這個資料包到達目标主機,由此列印出所有經過的路由器。

tcptraceroute:現代網絡廣泛使用防火牆,導緻傳統路由跟蹤工具發出的(ICMP應答(ICMP echo)或UDP)資料包都被過濾掉了,是以無法進行完整的路由跟蹤。盡管如此,許多情況下,防火牆會準許TCP資料包通過防火牆到達指定端口,這些端口是主機内防火牆背後的一些程式和外界連接配接用的。通過發送TCP SYN資料包來代替UDP或者ICMP應答資料包,tcptraceroute可以穿透大多數防火牆。

二.指令格式

#traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w MAX,HERE,NEAR ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --fwmark=num ] host [ packetlen ]      

其中traceroute -T等效于tcptraceroute

三.常用參數

-4                     #強制使用ipv4位址
  -6                     #強制使用ipv6位址
  -d                     #允許套接字層的調試
  -F                     #不要對資料包進行拆分
  -f first_ttl           #從指定的跳數開始,而不是從1開始
  -g gate,...            #設定指定路由路徑,ipv4協定最多設定8個,ipv6協定最多設定127個
  -I                     #使用ICMP ECHO進行探測
  -T                     #使用TCP SYN包進行探測,等同于tcptraceroute,預設端口是80
  -i device              #指定網卡裝置
  -m max_ttl             #設定最大跳數,即最大TTL值,預設為30
  -N squeries            #指定同時發送的探測包數量,預設是16
  -n                     #不要進行域名解析,以點分十進制形式顯示位址
  -p port                #設定目的端口,UDP和ICMP端口值會增長,TCP不會改變
  -t tos  --tos=tos      #設定ipv4的服務類型或者ipv6的通信流類别                          
  -l flow_label          #給ipv6資料包添加flow_label來使其被路由器特殊處理
  -w MAX,HERE,NEAR       # 設定逾時,HERE為相同路由器等待次數(預設3次),NEAR為下一跳路由等待次數(預設10次),MAX為逾時時間(預設5秒)
  -q nqueries            #設定每一跳發送的資料包量,預設是3個
  -r                     #跳過普通的路由表,直接将資料包發送到遠端主機
  -s source_addr         #設定探測包的來源IP位址
  -z sendwait            #設定探測包廂隔,預設為0,不超過10是毫秒機關,超過10是秒機關
  -e                     #展示ICMP擴充,包括多協定标簽交換
  -A                     #列印AS-PATH(BGP協定中的路徑屬性)
  -M name                #使用指定的子產品進行探測(内建或者拓展的)
  -O OPTS,...            #使用多個指定的子產品,用逗号隔開
  --sport=num            #指定源端口
  --fwmark=num           #給資料包設定防火牆标記
  -U  --udp              #使用指定的UDP端口,預設是53
  -UL                    #使用輕量級使用者資料包協定來探測,預設端口是53                             
  -D  --dccp             #使用資料包擁塞控制協定來探測(預設端口是33434)
  -P prot                #使用未經封裝指定協定資料包來探測
  --mtu                  #發現追蹤路徑上的最大傳輸單元(資料幀資料部分最大長度)  
  --back                 #列印傳回路徑的hop(路由跳),如果看起來跟去的方向的不一樣
  -V                     #列印版本資訊并退出
  --help                 #尋求幫助并且退出
  Arguments:             #參數
      host               #需要探測的主機
      packetlen          #設定包長度,預設是40bytes      

 四.實踐

首先使用traceroute進行探測

#traceroute  -n www.baidu.com
traceroute to www.baidu.com (119.75.216.20), 30 hops max, 60 byte packets
 1  222.20.5.254  0.530 ms  0.495 ms  0.493 ms
 2  115.156.255.149  1.121 ms  1.253 ms  1.309 ms
 3  192.168.255.177  0.632 ms  0.753 ms  0.916 ms
 4  192.168.255.210  0.594 ms  0.762 ms  0.963 ms
 5  * 202.114.1.186  2.228 ms *
 6  202.112.53.81  3.614 ms  3.716 ms  3.869 ms
 7  * * *
 8  101.4.117.38  27.026 ms  26.956 ms  26.878 ms
 9  101.4.112.1  22.127 ms  22.487 ms  22.393 ms
10  101.4.113.117  24.541 ms  23.641 ms  22.407 ms
11  219.224.103.10  21.155 ms  21.234 ms  20.291 ms
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
………………
29  * * *
30  * * *      

可以看到資料包并沒有到達指定主機,而被過濾了,再使用tcptraceroute

# traceroute -T -n www.baidu.com
traceroute to www.baidu.com (119.75.213.61), 30 hops max, 60 byte packets
 1  * * *
 2  115.156.255.149  0.561 ms  0.649 ms  0.767 ms
 3  192.168.255.177  0.660 ms  0.765 ms  0.839 ms
 4  192.168.255.210  0.640 ms  0.670 ms  0.720 ms
 5  * * *
 6  202.112.53.81  3.216 ms  2.826 ms  2.898 ms
 7  * * *
 8  101.4.117.38  27.082 ms  27.067 ms  27.049 ms
 9  101.4.112.1  20.844 ms  19.985 ms  19.928 ms
10  101.4.113.117  21.696 ms  20.031 ms  29.858 ms
11  219.224.103.10  23.393 ms  20.158 ms  20.552 ms
12  * * *
13  * * *
14  119.75.213.61  20.215 ms  20.114 ms  20.052 ms      

可以看到資料包到達了目的主機,這裡我們使用traceroute -T 。這和tcptraceroute是等效的。使用tcptraceroute可以有效的穿透防火牆,進而到達目的主機