一.工作原理
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可以有效的穿透防火牆,進而到達目的主機