用於排查Linux系統的網絡故障。
網絡排查一般是有一定的思路和順序的,其實排查的思路就是根據具體的問題逐段排除故障可能發生的地方,最終確定問題。
所以首先要問一問,網絡問題是什么,是不通,還是慢?
1. 如果是網絡不通,要定位具體的問題,一般是不斷嘗試排除不可能故障的地方,最終定位問題根源。一般需要查看
是否接入到鏈路
是否啟用了相應的網卡
本地網絡是否連接
DNS故障
能否路由到目標主機
遠程端口是否開放
2. 如果是網絡速度慢,一般有以下幾個方式定位問題源:
DNS是否是問題的源頭
查看路由過程中哪些節點是瓶頸
查看帶寬的使用情況
一、網絡不通
一般來說當存在網絡不通的故障時,訪問出端和入端的信息是我們都要收集的,目的在於確定問題所在的主機或者區段。假如a不能訪問c而b能夠訪問c,那么很明顯問題出在a或a到c的網絡上,而通過同一子網中的幾台機器a、b可以正常訪問網絡,卻不能訪問c,那么可能是這個網絡到c存在問題,或c存在問題。
定位了問題所在的主機,一般有一些步驟來逐漸縮小問題范圍,最終定位問題:
1. 鏈路是否連通
即檢查網卡與網絡是否物理連通,網線是否插好且連接可用,很多時候不能立刻到機房確定物理連接,可以用命令:
# ethtool ethN
ehtN是連接到故障網絡的網卡,
例1:使用ethtool 查看 eth0 的物理連接
1 # ethtool eth0 2 Settings for eth0: 3 Supported ports: [ TP ] 4 Supported link modes: 10baseT/Half 10baseT/Full 5 100baseT/Half 100baseT/Full 6 1000baseT/Full 7 Supported pause frame use: No 8 Supports auto-negotiation: Yes 9 Advertised link modes: 10baseT/Half 10baseT/Full 10 100baseT/Half 100baseT/Full 11 1000baseT/Full 12 Advertised pause frame use: No 13 Advertised auto-negotiation: Yes 14 Speed: 1000Mb/s 15 Duplex: Full 16 Port: Twisted Pair 17 PHYAD: 1 18 Transceiver: internal 19 Auto-negotiation: on 20 MDI-X: Unknown 21 Supports Wake-on: g 22 Wake-on: g 23 Link detected: yes
其中,14行顯示了當前網卡的速度,這是一個千兆網卡;15行顯示了當前網絡支持全雙工;23行顯示當前網卡和網絡的物理連接正常。通常網速和全/半雙工狀態是主機和網絡協議商自動協商的,例如這里第8行的 auto-negotiation。如果發現15行的雙工被設置成了Half,可以手動將其改為全雙工網絡:
1 # ethtool -s eth0 autoneg off duplex full
2. 網卡是否正常啟用
一般網絡物理連接故障的情況並不多見,當排除物理連接上的問題后,需要進一步查看網卡的工作狀態。
例2:使用ifconfig命令檢查網卡eth1狀態
1 # ifconfig eth1 2 eth1 Link encap:Ethernet HWaddr e4:1f:13:b5:b0:62 3 inet addr:10.0.0.11 Bcast:10.0.0.255 Mask:255.255.255.0 4 inet6 addr: fe80::e61f:13ff:feb5:b062/64 Scope:Link 5 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 6 RX packets:74282478 errors:0 dropped:0 overruns:0 frame:0 7 TX packets:77425890 errors:0 dropped:0 overruns:0 carrier:0 8 collisions:0 txqueuelen:1000 9 RX bytes:13948947045 (13.9 GB) TX bytes:51073249506 (51.0 GB)
例2第3行的信息顯示了對該網卡的配置,包括IP,子網掩碼等,這里可以檢查是否出現錯配,如果這一行顯示不正確,那一定是網卡沒有正確配置開啟。
- 基於Debian的Linux的(永久)網絡配置文件在/etc/network/interfaces,
- 基於Red Hat的Linux的(永久)網絡配置文件在/etc/sysconfig/network_scripts/ifcfg-<interface>
3. 是否正確設置網關
如果網卡已經正常啟動,需要確認目標網絡接口是否正確配置網關,同時主機和網關之間的連接沒有問題,通過route命令和ping命令結合完成這一階段的排查。
例3 使用route 命令查看內核路由表
1 # route -n 2 Kernel IP routing table 3 Destination Gateway Genmask Flags Metric Ref Use Iface 4 0.0.0.0 101.111.123.1 0.0.0.0 UG 0 0 0 eth0 5 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 6 101.111.123.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
route -n 以IP而不是主機名的形式顯示網關等信息,一方面更快,另一方面不涉及DNS,通過route命令查看內核路由,檢驗具體的網卡是否連接到目標網路的路由,之后就可以嘗試ping 網關,排查與網關之間的連接。
如果無法ping通網關,可能是網關限制了ICMP數據包,或者交換機設置的問題。
4. DNS工作狀況
通常很多網絡問題是DNS故障或配置不當造成的,nslookup和dig命令能夠用來排查DNS問題,
例4 使用nslookup命令查看DNS解析
1 # nslookup baidu.com 2 Server: 10.21.1.205 3 Address: 10.21.1.205#53 4 5 Non-authoritative answer: 6 Name: baidu.com 7 Address: 220.181.57.217 8 Name: baidu.com 9 Address: 123.125.114.144 10 Name: baidu.com 11 Address: 180.149.132.47
這里的DNS服務器 10.21.1.205 位於當前局域網內,nslookup的結果顯示DNS工作正常。如果這里nslookup命令無法解析目標域名,則很有可能是DNS配置不當,到/etc/resolv.conf文件中查看是否存在域名服務器的配置:
例5 及時生效的DNS配置——/etc/resolv.conf文件
1 # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) 2 # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN 3 nameserver 10.21.1.205
/etc/resolv.conf文件是臨時即刻生效的DNS服務器配置,想要永久配置DNS服務器的地址,可以在/etc/networks/interfaces(基於Debian)中通過 “dns-nameservers” 字段來限制:
例6 永久生效的DNS配置——/etc/networks/interfaces文件
1 auto lo 2 iface lo inet loopback 3 4 auto eth0 5 iface eth0 inet static 6 network ... 7 netmask 255.255.255.0 8 broadcast ... 9 gateway ... 10 address ... 11 dns-nameservers 10.21.1.205
如果我們的DNS服務器在一個子網內,而無法ping通它,這個DNS服務器很可能已經宕機。
5. 是否可以正常路由到遠程主機
互諒網是通過大量路由器中繼連接起來的,網絡的訪問就是在這些節點間一跳一跳最終到達目的地,想要查看網絡連接,最直接最常用的命令是ping,ping得通,說明路由工作正常,但是如果ping不通,traceroute命令可以查看從當前主機到目標主機的全部“跳”的過程。traceroute和ping命令都是使用ICMP協議包。
例7. 使用traceroute追蹤路由狀況
1 # traceroute www.baidu.com 2 traceroute to www.baidu.com (220.181.111.188), 30 hops max, 60 byte packets 3 1 123.123.123.1 (123.123.123.1) 1.844 ms 1.847 ms 2.102 ms 4 2 1.1.1.6 (1.1.1.6) 0.389 ms 0.393 ms 0.542 ms 5 3 localhost (10.1.150.1) 2.556 ms 3.730 ms 3.155 ms 6 4 localhost (10.12.16.17) 1.214 ms 1.190 ms 1.196 ms 7 5 localhost (10.12.30.105) 1.533 ms 1.541 ms localhost (10.12.30.101) 1.692 ms 8 6 202.112.41.37 (202.112.41.37) 3.350 ms 2.998 ms 2.977 ms 9 7 101.4.112.94 (101.4.112.94) 4.631 ms 101.4.117.82 (101.4.117.82) 3.846 ms 101.4.112.94 (101.4.112.94) 3.808 ms 10 8 101.4.112.89 (101.4.112.89) 3.120 ms 2.844 ms 2.857 ms 11 9 101.4.115.9 (101.4.115.9) 5.957 ms 5.912 ms 4.741 ms 12 10 101.4.117.110 (101.4.117.110) 2.080 ms 2.070 ms 2.036 ms 13 11 202.97.88.229 (202.97.88.229) 35.257 ms 202.97.57.45 (202.97.57.45) 35.373 ms 202.97.57.49 (202.97.57.49) 35.244 ms 14 12 * * * 15 13 * * * 16 14 * 220.181.17.18 (220.181.17.18) 35.869 ms 220.181.182.34 (220.181.182.34) 38.279 ms 17 15 * * * 18 16 * * * 19 17 * * * 20 18 * * * 21 19 * * * 22 20 * * * 23 21 * * * 24 22 * * * 25 23 * * * 26 24 * * * 27 25 * * * 28 26 * * * 29 27 * * * 30 28 * * * 31 29 * * * 32 30 * * *
查看第3行,第一跳到達了當前子網的網關,然后跳到了澳大利亞的亞太網絡咨詢中心(APNIC)等等,traceroute可以查看網絡中繼在哪里中斷或者網絡延時情況,“*”是因為網絡不通或者某個網關限制了ICMP協議包。
6. 遠程主機是否開放端口
telnet命令是檢查端口開放情況的利器,或者nmap工具,
例8. 使用telnet檢測遠程主機的端口開放情況
1 # telnet 220.181.111.188 80 2 Trying 220.181.111.188... 3 Connected to 220.181.111.188. 4 Escape character is '^]'.
telnet IP PORT,可以查看指定遠程主機是否開放目標端口,這里百度的前端服務器開放80端口是網頁服務必須的。
但是telnet 命令的功能非常有限,當防火牆存在時,就不能很好地顯示結果,所以telnet無法連接包含兩種可能:1是端口確實沒有開放,2是防火牆過濾了連接。
例如我們嘗試 telnet 連接百度前端服務器的 22 端口:
1 telnet 220.181.111.188 22 2 Trying 220.181.111.188... 3 telnet: Unable to connect to remote host: Connection timed out
無法繼續進行,但是我們無法判斷究竟是端口沒有開放,還是被防火牆給攔截了,這時使用nmap工具將更加強大:
例9. 使用nmap工具檢測端口開放情況
1 # nmap -p 22 220.181.111.188 2 3 Starting Nmap 6.40 ( http://nmap.org ) at 2015-08-10 20:45 CST 4 Nmap scan report for 220.181.111.188 5 Host is up (0.040s latency). 6 PORT STATE SERVICE 7 22/tcp filtered ssh
同樣的服務器,使用nmap檢測,觀察到第7行,說明實際上該服務器是啟用了22端口的,但是防火牆過濾了數據包,如果端口真的沒有啟用,那么第7行的STATE將顯示closed,而不是filtered。開放的端口其狀態將是open。
這時就可以了解,端口無法連接的原因是端口關閉還是防火牆過濾了。
7. 本機查看監聽端口
如果要在本地查看某個端口是否開放,可以使用如下命令:
# netstat -lnp | grep PORT
其中,參數:
- -l,顯示正在監聽的套接字
- -p,顯示套接字所屬的進程ID和進程名
- -n,以數字形式顯示地址
例10. 查看本地指定端口的監聽情況
1 # netstat -lnp | grep :11211 2 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 3 tcp 0 0 10.0.0.11:11211 0.0.0.0:* LISTEN 28911/memcached 4 udp 0 0 10.0.0.11:11211 0.0.0.0:* 28911/memcached
例10以memcached服務為例,查看當前活動端口監聽的網絡,如果netstat找不到指定的端口,說明沒有進程在監聽指定端口。
其中第一列是套接字通信協議,第2列和第3列顯示的是接收和發送隊列,第4列是主機監聽的本地地址,反映了該套接字監聽的網絡;第6列顯示當前套接字的狀態,最后一列顯示打開端口的進程。
8. 查看防火牆規則
使用
# iptables -L
命令查看當前主機的防火牆,iptables的功能在這里就不涉及,后續的博文會詳細介紹。
二、網絡較慢的排查
網絡較慢的排查事實上比網絡不通的排查更有挑戰,因為很多時候可能是運營商、DNS等的原因,這些故障常常不在我們的控制范圍之內,只能收集證據向其反饋或對其進行投訴。
如果不想受到DNS的影響,上面提到的命令可以添加 -n 選項,-n選項可以阻止試圖將IP解析為主機名,從而繞過DNS。
1. traceroute
前面提到的traceroute不僅可以查看路由的正確性,還可以查看網絡中每一跳的延時,從而定位延時最高的網絡區段。
2. iftop
iftop命令類似於top命令,查看哪些網絡連接占用的帶寬較多
例11. 使用iftop命令查看連接占用的網絡帶寬
這里比較全地給出了一個iftop命令的實例,該命令按照帶寬占用高低排序,可以確定那些占用帶寬的網絡連接,
最上方的一行刻度是整個網絡的帶寬比例,下面第1列是源IP,第2列是目標IP,箭頭表示了二者之間是否在傳輸數據,以及傳輸的方向。最后三列分別是2s、10s、40s時兩個主機之間的數據傳輸速率。
最下方的TX、RX分別代表發送、接收數據的統計,TOTAL則是數據傳輸總量。
- 使用 -n 選項直接顯示連接的IP,例11中看到的則是解析成域名后的結果。
- -i 選項可以指定要查看的網卡,默認情況下,iftop會顯示自己找到的第一個網卡;
- 在進入iftop的非交互界面后,按 p 鍵可以打開或關閉顯示端口,按 s 鍵可以顯示或隱藏源主機,而按 d 鍵則可以顯示或隱藏目標主機。
3. tcpdump
當一切排查手段都無濟於事時仍然不能找到網絡速度慢、丟包嚴重等原因時,往往祭出殺手鐧——抓包。抓包的最佳手段是在通信的雙方同時抓取,這樣可以同時檢驗發出的數據包和收到的數據包,tcpdump是常用的抓包工具。
例12. tcpdump抓包實示例
1 # tcpdump 2 23:47:43.326284 IP ISeR-Server1.ntp > 183.60.211.47.9579: NTPv2, Reserved, length 440 3 23:47:43.326288 IP 58.221.64.43.27777 > ISeR-Server1.ntp: NTPv2, Reserved, length 8
例12只是截取了抓包結果的兩行作為示意,可以通過tcpdump查看通信的時間、雙方的地址( -n 選項),端口,通信的目的,數據包的長度等等。
當想要停止抓包時,使用ctrl-c終止抓包,tcpdump會返回所有抓取到的數據包的個數:
1 14422 packets captured 2 1127345 packets received by filter 3 1109698 packets dropped by kernel
tcpdump有一些常用選項,便於記錄,tcpdump的詳細使用,這里就不介紹了,當然,圖形界面用戶還可以使用更為專業的分析工具WireShark。
1 # tcpdump -n port N //只捕捉特定端口的流量 2 # tcpdump -n port N1 or port N2 //捕獲多個端口的流量 3 # tcpdump -w output.pcap //數據包轉儲,將原始數據包保留到output.pcap 4 # tcpdump -C 10 -w output.pcap //限制每個轉儲文件的上限,達到上限后將文件分卷(以MB為單位) 5 # tcpdump -C 10 -W 5 -w output.pcap //不僅限制每個卷的上限,而且限制卷的總數 6 # tcpdump -r output.pcap //重播已經保存的數據包記錄
此外,
鳥哥的Linux私房菜中也提供了一些類似的網絡排查思路:
1. 網卡是否工作,包括硬件和驅動:lspci,dmesg
2. IP參數是否正確設置:ifconfig
3. 局域網內通信是否正常:ping
4. 路由信息是否正常:route -n
5. DNS狀態:dig, nslookup
6. 路由節點狀況與延時:traceroute
7. 服務監聽端口:netstat -lnp
8. 防火牆:iptables, SELinux
總之與本文的思路是非常一致的。