排查網(wǎng)絡(luò)問題,請(qǐng)務(wù)必掌握這款工具
traceroute 介紹
traceroute 就如同它的名字一樣,能夠追蹤到一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包傳輸經(jīng)過的路由器路徑。這是 Linux 上的一個(gè)命令,Windows 上類似的命令是 tracert。
tracert 默認(rèn)使用 ICMP 包探測(cè),traceroute 使用 UDP 包,也可以使用 ICMP 和 TCP 包探測(cè),分別帶上參數(shù) -I和 -T 即可。
traceroute 主要用途
traceroute 利用 ICMP 差錯(cuò)報(bào)文,主要用來確定這幾件事:
- 確定通信雙方路徑上經(jīng)過的路由器設(shè)備
- 確定 UDP 包是否成功達(dá)到目的地
- 發(fā)現(xiàn)路徑 MTU
(1) 確定通信雙方路徑上經(jīng)過的路由器設(shè)備 。利用 IP 包的 TTL 字段和超時(shí)類型的 ICMP 報(bào)文來實(shí)現(xiàn)。首先, traceroute 向目的地發(fā)送 IP 包,剛開始的時(shí)候,將 TTL 設(shè)置為 1,當(dāng)經(jīng)過第一個(gè)路由器時(shí),TTL -1 = 0 引發(fā)超時(shí)錯(cuò)誤,第一個(gè)路由器回復(fù) ICMP 超時(shí)報(bào)文,源主機(jī)就可以知道路徑第一個(gè)路由器的信息,隨后 TTL 被設(shè)置為 2、3、4, ...,直到到達(dá)目的地,這樣,沿途每個(gè)路由器都會(huì)向源主機(jī)回復(fù) ICMP 超時(shí)報(bào)文, traceroute 就可以拿到所有的路由器信息了。
不過這里要 注意 ,并不是所有路由器都會(huì)返回 ICMP 報(bào)文,因?yàn)槌鲇诎踩钥紤],大多數(shù)防火墻以及啟用了防火墻功能的路由器都默認(rèn)配置為不返回任何 ICMP 報(bào)文,管理員也會(huì)主動(dòng)配置,所以這時(shí)使用 traceroute 就不一定能拿到所有路由器信息了。
(2) 確定包是否成功達(dá)到目的地 。使用上面的方法能拿到路由器信息,但并不能確定發(fā)的包是否到達(dá)目的地。traceroute 通過設(shè)置所發(fā) UDP 包的端口號(hào)來解決了這個(gè)問題,因?yàn)?UDP 包的可用端口號(hào)范圍 <3000,只要在發(fā)送 UDP 包的時(shí)候填入一個(gè) >3000 的端口號(hào),當(dāng)包到達(dá)了目的地,但是由于端口不匹配,就會(huì)返回一個(gè)端口不可達(dá)的 ICMP 報(bào)文,這樣源主機(jī)就可以確定包確實(shí)到了目的地了。
(3) 發(fā)現(xiàn)路徑 MTU 。利用了 “需要分片但設(shè)置了不分片位” 類型的 ICMP 報(bào)文,如果某個(gè)源主機(jī)在發(fā)送一個(gè) IP 包之前,對(duì)該 IP 包中的首部字段 DF 位設(shè)為 1,也就是“分片禁止位=1”,表示該包在傳輸?shù)倪^程中不允許分片,如果中間某個(gè)路由器允許傳輸?shù)淖畲舐窂?MTU 小于該包大小,就需要分片才能傳輸,但是由于設(shè)置了不分片位,路由器會(huì)將該包丟棄,并向源主機(jī)發(fā)送一個(gè)攜帶 MTU 信息的 ICMP 包,提醒源主機(jī)下次發(fā)包的大小不應(yīng)超過該 MTU 的值。traceroute 就可以利用這種類型報(bào)文來逐一地確認(rèn)傳輸路徑上各個(gè)路由器之間的 MTU 值。
常用命令案例
traceroute 使用格式是:
traceroute「參數(shù)」「主機(jī)」
- # traceroute --help
- Usage:
- 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 ]
其中,選項(xiàng)主要有:
- -4:使用 IPv4
- -6:使用 IPv6
- -d:開啟 socket 層的debug
- -F:設(shè)置不分片位
- -f first_ttl:設(shè)置第一跳 TTL 值,默認(rèn)是1
- -g gate:指定網(wǎng)關(guān) gate 可路由的最大數(shù)據(jù)包數(shù)
- -I:使用 ICMP echo 包探測(cè)
- -T:使用 TCP SYN 包探測(cè)
- -m max_ttl:設(shè)置 TTL 最大跳數(shù),默認(rèn)是 30
- -N squeries:同時(shí)發(fā)送探測(cè)包的數(shù)量
- -n:不進(jìn)行 IP 到域名的解析
- -p port:設(shè)置目的端口的值(默認(rèn)是 33434),ICMP 就是設(shè)置初始序列號(hào)(默認(rèn)為1 )
- -t tos:設(shè)置 TOS 值(IPv6 是 TC 值)
- -w max,here,near:設(shè)置等待每一跳響應(yīng)的時(shí)間,有三個(gè)值,max表示最大不能超過的時(shí)間(默認(rèn)是5s),here表示同一跳時(shí)間的參考因子,near表示下一跳參考因子(這兩個(gè)值意義不大)
- -q nqueries:設(shè)置每一跳探測(cè)的次數(shù),默認(rèn)是 3
- -r:繞過中間的路由探測(cè),直接將包送達(dá)目的地
- -s srcaddr:使用 srcaddr 作為發(fā)送包的源地址
- --mtu:發(fā)現(xiàn)路徑 MTU,等價(jià)于參數(shù) -F-N1
① 最簡(jiǎn)單的用法
traceroute www.baidu.com
- [root@localhost ~]# traceroute www.baidu.com
- traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
- 192.168.74.2 (192.168.74.2) 2.606 ms 2.771 ms 2.950 ms
- 211.151.56.57 (211.151.56.57) 0.596 ms 0.598 ms 0.591 ms
- 211.151.227.206 (211.151.227.206) 0.546 ms 0.544 ms 0.538 ms
- 210.77.139.145 (210.77.139.145) 0.710 ms 0.748 ms 0.801 ms
- 202.106.42.101 (202.106.42.101) 6.759 ms 6.945 ms 7.107 ms
- 61.148.154.97 (61.148.154.97) 718.908 ms * bt-228-025.bta.net.cn (202.106.228.25) 5.177 ms
- 124.65.58.213 (124.65.58.213) 4.343 ms 4.336 ms 4.367 ms
- 202.106.35.190 (202.106.35.190) 1.795 ms 61.148.156.138 (61.148.156.138) 1.899 ms 1.951 ms
- * * *
- * * *
- [root@localhost ~]#
可以看到,第一行輸出探測(cè)的主機(jī)名和對(duì)應(yīng) IP,允許探測(cè)的最大跳數(shù),以及發(fā)送的數(shù)據(jù)包字節(jié)數(shù),后面每一行表示每一跳的信息,包括 IP 信息,3 個(gè)時(shí)延值(因?yàn)槊恳惶J(rèn)會(huì)發(fā) 3 次探測(cè)包)。
最后還會(huì)看到三個(gè) ***,表示當(dāng)前這一跳被防火墻過濾,探測(cè)包被丟棄。
② 設(shè)置 TTL 最大跳數(shù):-m max_ttl
默認(rèn) TTL 是 30 跳。
- [root@localhost ~]# traceroute -m 10 www.baidu.com
- traceroute to www.baidu.com (61.135.169.105), 10 hops max, 40 byte packets
- 192.168.74.2 (192.168.74.2) 1.534 ms 1.775 ms 1.961 ms
- 211.151.56.1 (211.151.56.1) 0.508 ms 0.514 ms 0.507 ms
- 211.151.227.206 (211.151.227.206) 0.571 ms 0.558 ms 0.550 ms
- 210.77.139.145 (210.77.139.145) 0.708 ms 0.729 ms 0.785 ms
- 202.106.42.101 (202.106.42.101) 7.978 ms 8.155 ms 8.311 ms
- bt-228-037.bta.net.cn (202.106.228.37) 772.460 ms bt-228-025.bta.net.cn (202.106.228.25) 2.152 ms 61.148.154.97 (61.148.154.97) 772.107 ms
- 124.65.58.221 (124.65.58.221) 4.875 ms 61.148.146.29 (61.148.146.29) 2.124 ms 124.65.58.221 (124.65.58.221) 4.854 ms
- 123.126.6.198 (123.126.6.198) 2.944 ms 61.148.156.6 (61.148.156.6) 3.505 ms 123.126.6.198 (123.126.6.198) 2.885 ms
- * * *
- * * *
- [root@localhost ~]#
可以看到,最大跳數(shù)被該為 10 跳。
③ 每一跳不進(jìn)行 DNS 解析,不顯示主機(jī)名:-n
traceroute-n www.baidu.com
- [root@localhost ~]# traceroute -n www.baidu.com
- traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
- 211.151.74.2 5.430 ms 5.636 ms 5.802 ms
- 211.151.56.57 0.627 ms 0.625 ms 0.617 ms
- 211.151.227.206 0.575 ms 0.584 ms 0.576 ms
- 210.77.139.145 0.703 ms 0.754 ms 0.806 ms
- 202.106.42.101 23.683 ms 23.869 ms 23.998 ms
- 202.106.228.37 247.101 ms * *
- 61.148.146.29 5.256 ms 124.65.58.213 4.386 ms 4.373 ms
- 202.106.35.190 1.610 ms 61.148.156.138 1.786 ms 61.148.3.34 2.089 ms
- * * *
- * * *
- [root@localhost ~]#
可以看到相關(guān)的主機(jī)名已經(jīng)去除。
④ 設(shè)置 UDP 端口號(hào)為 6666:-p
traceroute-p6666www.baidu.com
- [root@localhost ~]# traceroute -p 6888 www.baidu.com
- traceroute to www.baidu.com (220.181.111.147), 30 hops max, 40 byte packets
- 211.151.74.2 (211.151.74.2) 4.927 ms 5.121 ms 5.298 ms
- 211.151.56.1 (211.151.56.1) 0.500 ms 0.499 ms 0.509 ms
- 211.151.224.90 (211.151.224.90) 0.637 ms 0.631 ms 0.641 ms
- * * *
- 220.181.70.98 (220.181.70.98) 5.050 ms 5.313 ms 5.596 ms
- 220.181.17.94 (220.181.17.94) 1.665 ms !X * *
- [root@localhost ~]#
可以看到,報(bào)文到達(dá)了目的地,但是顯示 !X,意思是“管理禁止通信”,對(duì)應(yīng) ICMP type=3,code=13 的報(bào)文。除此之外,還有以下這些標(biāo)志:
- !H、!N 、!P:分別表示 host、network、protocol 不可達(dá)
- !S:源路由抑制(source route failed)
- !F:需要分片但是沒分片(fragmentation needed)
- !V:違反主機(jī)優(yōu)先級(jí)(host precedence violation)
- !C:優(yōu)先級(jí)終止生效(precedence cutoff in effect)
- !\:ICMP 不可達(dá)代碼(ICMP unreachable code \)
⑤ 設(shè)置探測(cè)包的個(gè)數(shù):-q
traceroute-q4www.baidu.com
- [root@localhost ~]# traceroute -q 4 www.baidu.com
- traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
- 211.151.74.2 (211.151.74.2) 40.633 ms 40.819 ms 41.004 ms 41.188 ms
- 211.151.56.57 (211.151.56.57) 0.637 ms 0.633 ms 0.627 ms 0.619 ms
- 211.151.227.206 (211.151.227.206) 0.505 ms 0.580 ms 0.571 ms 0.569 ms
- 210.77.139.145 (210.77.139.145) 0.753 ms 0.800 ms 0.853 ms 0.904 ms
- 202.106.42.101 (202.106.42.101) 7.449 ms 7.543 ms 7.738 ms 7.893 ms
- 61.148.154.97 (61.148.154.97) 316.817 ms bt-228-025.bta.net.cn (202.106.228.25) 3.695 ms 3.672 ms *
- 124.65.58.213 (124.65.58.213) 3.056 ms 2.993 ms 2.960 ms 61.148.146.29 (61.148.146.29) 2.837 ms
- 61.148.3.34 (61.148.3.34) 2.179 ms 2.295 ms 2.442 ms 202.106.35.190 (202.106.35.190) 7.136 ms
- * * * *
- * * * *
- [root@localhost ~]#
可以看到,每一跳探測(cè)輸出了 4 個(gè)時(shí)延值。
⑥ 設(shè)置探測(cè)包的等待響應(yīng)時(shí)間:-w
traceroute-w3www.baidu.com
- [root@localhost ~]# traceroute -w 3 www.baidu.com
- traceroute to www.baidu.com (61.135.169.105), 30 hops max, 40 byte packets
- 211.151.74.2 (211.151.74.2) 2.306 ms 2.469 ms 2.650 ms
- 211.151.56.1 (211.151.56.1) 0.621 ms 0.613 ms 0.603 ms
- 211.151.227.206 (211.151.227.206) 0.557 ms 0.560 ms 0.552 ms
- 210.77.139.145 (210.77.139.145) 0.708 ms 0.761 ms 0.817 ms
- 202.106.42.101 (202.106.42.101) 7.520 ms 7.774 ms 7.902 ms
- bt-228-025.bta.net.cn (202.106.228.25) 2.890 ms 2.369 ms 61.148.154.97 (61.148.154.97) 471.961 ms
- 124.65.58.221 (124.65.58.221) 4.490 ms 4.483 ms 4.472 ms
- 123.126.6.198 (123.126.6.198) 2.948 ms 61.148.156.6 (61.148.156.6) 7.688 ms 7.756 ms
- * * *
- * * *
- [root@localhost ~]#
⑦ 繞過中間的路由探測(cè),直接將包送達(dá)目的地
traceroute-r www.baidu.com
- [root@localhost ~]# traceroute -r www.baidu.com
- traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
- Network is unreachable
- [root@localhost ~]#
可以看到,直接顯示網(wǎng)絡(luò)不可達(dá)。
⑧ 探測(cè)路徑 MTU
traceroute--mtu www.baidu.com
- root@pclcache:~# traceroute --mtu www.baidu.com
- traceroute to www.baidu.com (14.215.177.39), 30 hops max, 65000 byte packets
- 1 192.168.109.1 (192.168.109.1) 3.063 ms F=1500 2.908 ms *
- 2 192.168.98.36 (192.168.98.36) 1.686 ms 1.422 ms *
- 3 113.98.59.57 (113.98.59.57) 7.075 ms 7.544 ms 5.851 ms
可以看到,探測(cè)到 MTU F=1500。
OK,除此之外,還有更多的用法,大家有興趣可以通過 man traceroute 查看更多的用法。