Linux系統排查4——網絡篇

Reference: https://www.cnblogs.com/Security-Darren/p/4700387.htmlhtml

 

  用於排查Linux系統的網絡故障。前端

  網絡排查通常是有必定的思路和順序的,其實排查的思路就是根據具體的問題逐段排除故障可能發生的地方,最終肯定問題。bash

  因此首先要問一問,網絡問題是什麼,是不通,仍是慢?服務器

  1. 若是是網絡不通,要定位具體的問題,通常是不斷嘗試排除不可能故障的地方,最終定位問題根源。通常須要查看網絡

    是否接入到鏈路ssh

    是否啓用了相應的網卡tcp

    本地網絡是否鏈接memcached

    DNS故障工具

    可否路由到目標主機oop

    遠程端口是否開放

  2. 若是是網絡速度慢,通常有如下幾個方式定位問題源:

    DNS是不是問題的源頭

    查看路由過程當中哪些節點是瓶頸

    查看帶寬的使用狀況

 

1、網絡不通

  通常來講當存在網絡不通的故障時,訪問出端和入端的信息是咱們都要收集的,目的在於肯定問題所在的主機或者區段。假如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的功能在這裏就不涉及,後續的博文會詳細介紹。

 

2、網絡較慢的排查

  網絡較慢的排查事實上比網絡不通的排查更有挑戰,由於不少時候多是運營商、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

  總之與本文的思路是很是一致的。

相關文章
相關標籤/搜索