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