Linux系统排查4——网络篇
来源:互联网 发布:网络政治参与案例 编辑:程序博客网 时间:2024/06/05 06:47
用于排查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/Full10 100baseT/Half 100baseT/Full11 1000baseT/Full12 Advertised pause frame use: No13 Advertised auto-negotiation: Yes14 Speed: 1000Mb/s15 Duplex: Full16 Port: Twisted Pair17 PHYAD: 118 Transceiver: internal19 Auto-negotiation: on20 MDI-X: Unknown21 Supports Wake-on: g22 Wake-on: g23 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 eth12 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.04 inet6 addr: fe80::e61f:13ff:feb5:b062/64 Scope:Link5 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:16 RX packets:74282478 errors:0 dropped:0 overruns:0 frame:07 TX packets:77425890 errors:0 dropped:0 overruns:0 carrier:08 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 -n2 Kernel IP routing table3 Destination Gateway Genmask Flags Metric Ref Use Iface4 0.0.0.0 101.111.123.1 0.0.0.0 UG 0 0 0 eth05 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth16 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.14410 Name: baidu.com11 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 OVERWRITTEN3 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 ms10 8 101.4.112.89 (101.4.112.89) 3.120 ms 2.844 ms 2.857 ms11 9 101.4.115.9 (101.4.115.9) 5.957 ms 5.912 ms 4.741 ms12 10 101.4.117.110 (101.4.117.110) 2.080 ms 2.070 ms 2.036 ms13 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 ms14 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 ms17 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 802 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 222 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 CST4 Nmap scan report for 220.181.111.1885 Host is up (0.040s latency).6 PORT STATE SERVICE7 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 :112112 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name3 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 # tcpdump2 23:47:43.326284 IP ISeR-Server1.ntp > 183.60.211.47.9579: NTPv2, Reserved, length 4403 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 captured2 1127345 packets received by filter3 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.pcap4 # 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
总之与本文的思路是非常一致的。
转载至http://www.cnblogs.com/Security-Darren/p/4700387.html
- Linux系统排查4——网络篇
- Linux系统排查——CPU负载篇
- Linux系统排查1——内存篇
- Linux系统排查2——CPU负载篇
- Linux系统排查3——I/O篇
- Linux系统网络设置及问题排查
- linux学习入门16——LINUX网络配置(linuxcast.net)(以太网配置,网络测试,网络故障排查等)
- 网络运维—— 网络访问问题排查
- linux系统挂掉排查 3板斧
- Linux系统负载升高排查思路
- Linux系统性能分析——网络
- Linux系统故障分析与排查—系统启动类故障排除
- linux网络基础配置和故障排查方法论
- Linux下网络排查之ping|traceroute|mtr工具
- 安全应急之网络异常排查win&linux-20150805
- Linux的IP配置和网络问题排查
- Linux下网络排查之ping|traceroute|mtr工具
- Cache占用过多内存导致Linux系统内存不足问题排查
- 百分比布局的使用
- leetcode 300. Longest Increasing Subsequence 最长递增子序列LISS
- web无插件解码播放H264/H265(js解码HTML5播放)
- 股票量化分析(3)——matplotlib利用tushare的股票数据画一般图、k线图
- Java二分法查找_动力节点Java学院整理
- Linux系统排查4——网络篇
- Java 操作符
- 红黑树学习
- 如何把网址配置为http和https可以同时访问
- js读取解析JSON数据
- Leetcode题解-657. Judge Route Circle
- 单例模式
- Linux操作2
- sql实例大全