具体问题具体分析,遵循相应的排查思路
因为网络问题产生的现象有无数种,但同一种现象的产生并不一定是由于网络问题引起的。比如页面卡顿,数据包无法处理这些现象,完全有可能是死锁或者进程异常终止产生的。 所以,结论不要下的太早,先问问自己,网络问题是什么,是不通,还是慢?现象是什么?一步步排除故障。
一.网络不通时需要进行的处理
1.检测链路是否连通
检查网卡与网络是否物理连通,网线是否插好且连接可用:
- 首先到机房里检查网线两端是否都亮灯,普通服务器的话应该是绿灯常亮为正常,交换机绿灯闪烁表示正在传输数据。
- 通过命令ethtool ethX来查看某一网卡的链路是否物理连通。
命令描述:
ethtool 是用于查询及设置网卡参数的命令。
使用概要:
ethtool ethx
ethtool –h
ethtool –i ethX
ethtool –d ethX
ethtool –r ethX
ethtool –S ethX
ethtool –s ethX [speed 10|100|1000] [duplex half|full] [autoneg on|off]
ethtool -E eth0 magic 0x10798086 offset 0x10 value 0x1A 修改网卡EEPROM内容(0x1079 网卡device id , 0x8086网卡verdor id )
ethtool -e eth0 : dump网卡EEPROM内容
如上所示:Speed: 这一项就指示了网卡的速度。Duplex显示了当前网络支持全双工;link detected表示当前网卡和网络的物理连接状态,yes就是正常。通常网速和全/半双工状态是主机和网络协议商自动协商的,例如这里的 auto-negotiation。
2. 网卡是否正常启用
1.一般网络物理连接故障的情况并不多见,当排除物理连接上的问题后,需要进一步查看网卡的工作状态,使用ifconfig命令检查网卡eth0状态。 第3行的信息显示了对该网卡的配置,包括IP,子网掩码等,这里可以检查是否出现错配,如果这一行显示不正确,那一定是网卡没有正确配置开启。 基于Debian的Linux的(永久)网络配置文件在/etc/network/interfaces, 基于Red Hat的Linux的(永久)网络配置文件在/etc/sysconfig/network_scripts/ifcfg-<interface>
2.lspci可以看到所有连接到pci总线的设备,
lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具。
PCI即Peripheral Component Interconnect,中文意思是“外围器件互联”,是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。
PCI总线是由ISA(Industy Standard Architecture)总线发展而来的,ISA并行总线有8位和16位两种模式,时钟频率为8MHz,工作频率为33MHz/66MHz。是一种同步的独立于处理器的32位或64位局部总线。
从结构上看,PCI是在CPU的供应商和原来的系统总线之间插入的一级总线,具体由一个桥接电路实现对这一层的管理,并实现上下之间的接口以协调数据的传送。从1992年创立规范到如今,PCI总线已成为了计算机的一种标准总线。
已成为局部总线的新标准,广泛用于当前高档微机、工作站,以及便携式微机。
主要用于连接显示卡、网卡、声卡。PCI总线是32位同步复用总线。其地址和数据线引脚是AD31~AD0。PCI的工作频率为33MHz。
3.利用lsmod显示所有已加载的模块, 加载成功的模块也会在/proc/modules中显示。
lsmod——显示已载入系统的模块
lsmod 其实就是list modules的缩写,即 列出所有模块.
功能说明:显示已载入系统的模块。
语法:lsmod
说明:执行lsmod指令,会列出所有已载入系统的模块。
总结: 一般情况下,成功加载网卡后,用ifconfig就可以看了。如果此时找不到网卡,那么应该查看物理网卡有没有连接到pci总线上,lspci检测不到的话很有可能就是网卡坏了。还有一种情况是没有加载网卡模块,先去lspci里找到对应厂商和型号:Ethernet Controller,再用modprobe尝试加载正确的模块,比如modprobe 3c509。如果出现错误,说明该模块不存在。这时候你应该找到正确的模块并且重新编译。(久修改网卡信息在/etc/sysconfig/network-scripts/ifcfg-ethX)
Linux modprobe命令用于自动处理可载入模块。
modprobe可载入指定的个别模块,或是载入一组相依的模块。
modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。
3. 检测路由与网关的配置
如果网卡已经正常启动,需要确认目标网络接口是否正确配置网关,同时主机和网关之间的连接没有问题,通过route命令和ping命令结合完成这一阶段的排查。
使用route 命令查看内核路由表 第一行表示,访问internet的ip都通过eth0转发到网关。 第二行表示,当前网卡处于192.168.25.0网段,目的为该网段的Ip都交给eth0转发。
通过route命令查看内核路由,检验具体的网卡是否连接到目标网路的路由,之后就可以尝试ping 网关,排查与网关之间的连接。如果无法ping通网关,可能是网关限制了ICMP数据包,或者交换机设置的问题。一个很常见的问题:两块网卡分别提供内网和外网服务,如果默认网关是内网网卡,那么外网服务是访问不到的。这时需要删除再添加默认网关。用route delete/add default gw 命令。
4. DNS工作状况
通常很多网络问题是DNS故障或配置不当造成的,nslookup和dig命令能够用来排查DNS问题。 这里的DNS服务器 10.21.1.205 位于当前局域网内,nslookup的结果显示DNS工作正常。如果这里nslookup命令无法解析目标域名,则很有可能是DNS配置不当,到/etc/resolv.conf文件中查看是否存在域名服务器的配置,当然修改这里的配置只是临时保存,修改要去etc/sysconfig/network-scripts/ifcfg-ethX路径下(可以在/etc/networks/interfaces(基于Debian)中通过 “dns-nameservers” 字段来限制:)
5.检测是否可以正常路由到远程主机
互联网是通过大量路由器中继连接起来的,网络的访问就是在这些节点间一跳一跳最终到达目的地,想要查看网络连接,最直接最常用的命令是ping,ping得通,说明路由工作正常,但是如果ping不通,traceroute命令可以查看从当前主机到目标主机的全部“跳”的过程。traceroute和ping命令都是使用ICMP协议包。
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。
当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。linux系统中,我们称之为traceroute,在MS Windows中为tracert。
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。
一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
在大多数情况下,我们会在linux主机系统下,直接执行命令行:
traceroute hostname
而在Windows系统下是执行tracert的命令:
tracert hostname
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间 。星号表示防火墙封掉了ICMP的返回信息。
6.检查的是远端主机的服务端口是否打开
可以用telnet和nmap来检查. telnet IP PORT,可以查看指定远程主机是否开放目标端口,这里百度的前端服务器开放80端口是网页服务必须的。 (但是telnet 命令的功能非常有限,当防火墙存在时,就不能很好地显示结果,所以telnet无法连接包含两种可能:1是端口确实没有开放,2是防火墙过滤了连接。) 如:
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工具将更加强大:
1 # nmap -p 22 220.181.111.188
2
3 Starting Nmap 6.40 ( http:
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
状态STATE是open表示开启,如果是filtered表示被防火墙过滤了,大家可以试下百度的22端口,肯定是filtered状态。 也可以查看自身的端口有没有打开,不多举例了。自身端口用的比较多的命令是netstat。
如果要在本地查看某个端口是否开放,可以使用如下命令:
# netstat -lnp | grep PORT
其中,参数:
-l,显示正在监听的套接字
-p,显示套接字所属的进程ID和进程名
-n,以数字形式显示地址
其中第一列是套接字通信协议,第2列和第3列显示的是接收和发送队列,第4列是主机监听的本地地址,反映了该套接字监听的网络;第6列显示当前套接字的状态,最后一列显示打开端口的进程。
7.检查防火墙
如果网络还有问题的话就要检查iptables策略和SELinux了。定位问题前最好将SELinux关了,用iptables -L可查看iptables的规则。
关闭SELinux的策略
[root@localhost ~]# getenforce
如果为disabled 就是已经关闭,如果enforce 就是强制的模式
(1)不重启的头闭 [root@localhost ~]# setenforce 0 #重启电脑后失效
(2)重启电脑的关闭 [root@localhost ~]# vi /etc/selinux/config
把SELINUX=enforce 改成disabled就可以了,重启电脑,永久生效
二.网络较慢的排查
网络较慢的排查事实上比网络不通的排查更有挑战,因为很多时候可能是运营商、DNS等的原因,这些故障常常不在我们的控制范围之内,只能收集证据向其反馈或对其进行投诉。
如果不想受到DNS的影响,上面提到的命令可以添加 -n 选项,-n选项可以阻止试图将IP解析为主机名,从而绕过DNS。
- traceroute
前面提到的traceroute不仅可以查看路由的正确性,还可以查看网络中每一跳的延时,从而定位延时最高的网络区段。
- iftop
iftop命令类似于top命令,查看哪些网络连接占用的带宽较多
如:使用iftop命令查看连接占用的网络带宽
这里比较全地给出了一个iftop命令的实例,该命令按照带宽占用高低排序,可以确定那些占用带宽的网络连接,
最上方的一行刻度是整个网络的带宽比例,下面第1列是源IP,第2列是目标IP,箭头表示了二者之间是否在传输数据,以及传输的方向。最后三列分别是2s、10s、40s时两个主机之间的数据传输速率。
最下方的TX、RX分别代表发送、接收数据的统计,TOTAL则是数据传输总量。
使用 -n 选项直接显示连接的IP,上图中看到的则是解析成域名后的结果。
-i 选项可以指定要查看的网卡,默认情况下,iftop会显示自己找到的第一个网卡;
在进入iftop的非交互界面后,按 p 键可以打开或关闭显示端口,按 s 键可以显示或隐藏源主机,而按 d 键则可以显示或隐藏目标主机。
- tcpdump
当一切排查手段都无济于事时仍然不能找到网络速度慢、丢包严重等原因时,往往祭出杀手锏——抓包。抓包的最佳手段是在通信的双方同时抓取,这样可以同时检验发出的数据包和收到的数据包,tcpdump是常用的抓包工具。
tcpdump有一些常用选项,便于记录,tcpdump的详细使用,这里就不介绍了,当然,图形界面用户还可以使用更为专业的分析工具WireShark。
复制代码
1 # tcpdump -n port N
2 # tcpdump -n port N1 or port N2
3 # tcpdump -w output.pcap
4 # tcpdump -C 10 -w output.pcap
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
|