用于排查Linux系统的网络故障。
网络排查一般是有一定的思路和顺序的,其实排查的思路就是根据具体的问题逐段排除故障可能发生的地方,最终确定问题。
所以首先要问一问,网络问题是什么,是不通,还是慢?
1. 如果是网络不通,要定位具体的问题,一般是不断尝试排除不可能故障的地方,最终定位问题根源。一般需要查看
是否接入到链路 ethtool eth0
是否启用了相应的网卡 ifconfig eth1
本地网络是否连接 route -n查看gateway网关,然后再ping 网关
DNS故障 nslookup 域名/ip
能否路由到目标主机 traceroute www.baidu.com
远程端口是否开放 nmap -p 22 220.181.111.188
本机查看监听端口 netstat -lnp | grep 端口号
查看防火墙规则 iptables -L 或 SELinux
2. 如果是网络速度慢,一般有以下几个方式定位问题源:
DNS是否是问题的源头: dig 或 nslookup
查看路由过程中哪些节点是瓶颈:traceroute 查看网络中每一跳的延时,定位延时最高的网络区段
查看带宽的使用情况:iftop 查看哪些网络连接占用的带宽较多
使用命令tcpdump
一、网络不通
一般来说当存在网络不通的故障时,访问出端和入端的信息是我们都要收集的,目的在于确定问题所在的主机或者区段。假如a不能访问c而b能够访问c,那么很明显问题出在a或a到c的网络上,而通过同一子网中的几台机器a、b可以正常访问网络,却不能访问c,那么可能是这个网络到c存在问题,或c存在问题。
定位了问题所在的主机,一般有一些步骤来逐渐缩小问题范围,最终定位问题:
1. 链路是否连通
即检查网卡与网络是否物理连通,网线是否插好且连接可用,很多时候不能立刻到机房确定物理连接,可以用命令:
|
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>
网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:
- errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
- dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
- overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
- carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
- collisions 表示碰撞数据包数。
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. 本机查看监听端口
如果要在本地查看某个端口是否开放,可以使用如下命令:
|
其中,参数:
- -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的功能在这里就不涉及,后续的博文会详细介绍。
二、网络较慢的排查
网络较慢的排查事实上比网络不通的排查更有挑战,因为很多时候可能是运营商、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
总之与本文的思路是非常一致的。