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

  总之与本文的思路是很是一致的。

相关文章
相关标签/搜索