1. 程式人生 > >Linux系統排查4——網路篇

Linux系統排查4——網路篇

用於排查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. 檢視防火牆規則

  使用

1 # 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 鍵則可以顯示或隱藏目標主機。