linux traceroute追蹤路由路徑


TraceRoute的工作原理  

1.TraceRoute的工作原理:
      traceroute 有使用兩種:使用ICMP的和使用UDP的。Microsoft
      使用ICMP,所以win95上發出的traceRT應使用的是ICMP,但我沒有用 sniffer查過;其它包括unix和cisco router都使用UDP.
      ICMP traceroute:
      ===========
      使用ICMP Echo Request, Echo Reply and TTL-expired.

      源發出 ICMP
      Equest,第一個request的TTL為1,第二個request的TTL為2,以后依此遞增直至第30個;中間的router送回ICMP
      TTL-expired ( ICMP type 11)
      通知source,(packet同時因TTL超時而被drop),由此source知曉一路上經過的每一個router;最后的destination送回ICMP
      Echo Reply。

      所以中間任何一個router上如果封了ICMP Echo Request, traceroute就不能工作;如果封了type 11
      (TTL-expired), 中間的router全看不到,但能看到packet 到達了最后的destination;如果封了ICMP Echo
      Reply,中間的全能看到,最后的destination看不到。

      UDP traceroute:
      ==========
      使用ICMP TTL-expired(type 11), ICMP port unreachable(type 3, code 3), UDP
      port >32768.

      source發出UDP packet, source port使用隨機的任何大於32768的高段port#, destination port #
      從33434開始每送個probe依此遞增,直至33434+29,(cisco
      router上使用extended-traceroute命令可以修改這個起始的33434 port #),
      同時TTL從1開始依此遞增,直至1+29=30(最多送30個probe)。中間的router送回 ICMP
      TTL-expired,使得source得知了中間的每一個router,最后的destination送回TTL-expired 和ICMP port
      unreachable (因為任何主機上都沒有應用使用UDP port# >32768這樣的高段port#)。

      所以中間某處封掉UDP
      port>32768回導致traceroute不工作;封掉TTL超時會使source看不到中間的router(有的router根本不支持回送TTL超時);封掉type3,
      code3可能看不到destination.

      另外需要知道的是,由於回送TTL-expired的信息需要CPU生成一個packet,必須打斷 CPU,為保證其它工作的正常進行,cisco
      router每隔一秒才處理traceroute,所以在source 上你可能看到中間一路 * * *,但卻看得到最后的destination.
      這時你應知道這是中間的router CPU太忙或者中間路由器不回送TTL-expired包的原因,不必大驚小怪的。:-)

判斷使用何種負載均衡方式,用show ip cef、 show interface ip等命令就能看出來
負載均衡的兩種技術,有一種基於目標地址的比較容易造成餓死和撐死,另外一種加上目的端口和和源路由進行hash,就解決了這個問題。好像在后期思科ios加上的

Linux下traceroute使用心得

問題:
在命令行下輸入: 
traceroute www.google.com
屏幕打印是這樣的:
traceroute to www.google.com (66.249.89.104), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
沒有得到任何中間路由器的信息。

分析:
traceroute的基本原理就是發出TTL字段為1-n的ip包,然后等待路由器的ICMP超時回復,進而記錄
下來經過的路由器。通過man traceroute 可以看到,traceroute可以在ip包中放三種數據:
1) 使用UDP包(默認選項是-U)
2)使用TCP包 選項是-T
3)使用ICMP包 選項是-I
而且每個包traceroute都發3次。
分別用-T,-I選項試試。
發現TCP包時候也不行,但是-I選項是有效果的:
 1  10.10.20.1 (10.10.20.1)  3.611 ms * *
 2  * * *
 3  10.10.10.1 (10.10.10.1)  3.590 ms * *
 4  * * *
 5  * * *
 6  * * 61.130.125.25 (61.130.125.25)  10.914 ms

但貌似不是全部的中間路由ip,有些包丟失了。
進一步查看traceroute的選項,有一個-z項,基本意思是設置探測包的發送間隔,默認是0,就是連續發送。設置這個的目的
是因為有些路由器設置了icmp rate limit. 繼續研究為什么路由器要設置icmp的發送速率。
google之:原來是為了應付DOS攻擊,進而限制端口發出的icmp的速率。

既然清楚了,那就嘗試下:
sudo traceroute -I www.google.com -z 0.005 -q 1
traceroute to www.google.com (66.249.89.104), 30 hops max, 60 byte packets
 1  10.10.20.1 (10.10.20.1)  1.914 ms
 2  10.10.20.1 (10.10.20.1)  2.109 ms
 3  10.10.10.1 (10.10.10.1)  1.081 ms
 4  115.238.62.113 (115.238.62.113)  2.468 ms
 5  220.191.158.213 (220.191.158.213)  2.177 ms
 6  61.130.125.25 (61.130.125.25)  2.016 ms
 7  220.191.158.241 (220.191.158.241)  2.419 ms
 8  202.97.55.5 (202.97.55.5)  4.757 ms
 9  202.97.33.14 (202.97.33.14)  5.293 ms
10  202.97.33.2 (202.97.33.2)  5.161 ms
11  202.97.33.5 (202.97.33.5)  4.972 ms
12  202.97.5.138 (202.97.5.138)  41.524 ms
13  209.85.255.80 (209.85.255.80)  53.241 ms
14  209.85.249.195 (209.85.249.195)  68.928 ms
15  72.14.236.126 (72.14.236.126)  52.108 ms
16  66.249.89.104 (66.249.89.104)  48.105 ms

果真可以了。
如果想看具體traceroute發了什么包,路由器返回了什么包,可以用wireshark抓包看看.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM