原文:http://www.cnblogs.com/Security-Darren/p/4700387.html

用于排查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 键则可以显示或隐藏目标主机。

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

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

(转)Linux系统排查4——网络篇的更多相关文章

  1. Linux系统排查4——网络篇

    用于排查Linux系统的网络故障. 网络排查一般是有一定的思路和顺序的,其实排查的思路就是根据具体的问题逐段排除故障可能发生的地方,最终确定问题. 所以首先要问一问,网络问题是什么,是不通,还是慢? ...

  2. Linux系统排查1——内存篇

    常见工作中,计算机系统的资源主要包括CPU,内存,硬盘以及网络,过度使用这些资源将使系统陷入困境.本系列一共四篇博文,结合我在实习期间的学习,介绍一些常见的Linux系统排障工具及方法. 第1篇——内 ...

  3. Linux系统排查——CPU负载篇

    本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...

  4. 【转】一文掌握 Linux 性能分析之网络篇(续)

    [转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...

  5. 【转】一文掌握 Linux 性能分析之网络篇

    [转]一文掌握 Linux 性能分析之网络篇 比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看.监控,又包括网络链路上的包转发时延.吞吐量.带宽等指标分析.包括但不限于以下分析工具: pin ...

  6. 一文掌握 Linux 性能分析之网络篇(续)

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 这是 Linu ...

  7. 虚拟机Linux系统下配置网络

    虚拟机上安装Redhat9.0后是没有网络的,而本来的Windows系统是可以上网的,此时想在Redhat上网就需要在Linux系统上配置网络,以下是笔者自己配置的一点心得. 1.电脑本机系统打开网络 ...

  8. 由安装两块网卡的linux系统中引起网络不通想到的

    由安装两块网卡的linux系统中引起网络不通想到的 一天,小王突然急匆匆的来找我,他说:"我在机子上刚装的redhat怎么老也ping不通服务器,我网卡的驱动都安装了,ping 自己的两块网 ...

  9. 一文掌握 Linux 性能分析之网络篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 这是 Linu ...

随机推荐

  1. HDU 5033 Building (维护单调栈)

    题目链接 题意:n个建筑物,Q条询问,问所在的位置,看到天空的角度是多少,每条询问的位置左右必定是有建筑物的. 思路 : 维护一个单调栈,将所有的建筑物和所有的人都放到一起开始算就行,每加入一个人,就 ...

  2. C#中virtual和abstract区别,举例子

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  3. 双击获取GridView控件行信息

    有网友要求在GridView控件上,不管是单击(onclick)还是双击(ondblclick),想获取所击行的信息.技术难度是为GridView的行注册单击或是双击事件.看例子吧:在数据库中创建数据 ...

  4. css 选择器;盒模型

    一.引入方式:(1)CSS 层叠样式表 作用:修饰网页结构 (2)css的三种引入方式 - 行内样式 注意:行内样式的优先级是最高的 - 内接样式 - 外接样式 二.css选择器 基础选择器 * 通配 ...

  5. oracle多用户并发及事务处理

    多用户并发访问 事务:作用于某些数据的一个不可分割的操作   锁:写锁.互斥锁(仅能被一个进程使用)      读锁.共享锁(可被多个进程使用)   更新丢失 脏读 不可重复读 幻影读   隔离级别: ...

  6. Unity---Directory目录的删除、存在、创建操作

    使用Directory类要引入命名空间 using  System.IO; Directory类下的三个静态方法. public static void CreateDirectory(string  ...

  7. 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...

  8. 将已有项目同步到远程git仓库(github,gitee)及giteee的visual studio插件使用一二

    一.将已有项目同步到远程仓库的最简便方法是用git bash: 将已有项目同步到远程仓库有两种方法:1用git bash:2.用vs插件,两者的思路和步骤基本一致的. 实验发现,如果用vs插件,bas ...

  9. git 打tag

    查看已有tag git tag 创建新的tag git tag <version or tagname> -m <tag description> 例如创建一个版本1.0.0的 ...

  10. Windows服务注意!

    安装不成功 报错,或者安装成功 不运行 ,要把引用的dll文件 放到obj \debug文件夹下