常用的网络故障排错方法

前言

上不了网是一个工作以及生活中经常遇到的问题,遇到问题后每次都要坐等网管中心过来解决,略显麻烦也耗费时间。本文想和大家分享的正是网络基本原理以及通过简单命令解决一些网络故障的方法。


网络基本原理

关于TCP/IP网络模型这里就不讲了,有兴趣的可以参考上一篇文章。这里通过一个简单的示例来讲一下常用的网络排错方法。对于我们日常所使用的ping命令,看似简单(要么通、要么不通),其实背后包含了很多内容,接下来我们一起看一下:


对于以上命令,ping www.baidu.com,从命令执行开始,到结果返回总共需要经过以下几步:


1.  DNS解析

首先要做的是域名解析服务,将www.baidu.com解析成具体的IP地址,因为数据包在网络上传输时只认IP地址。那么如何做DNS解析呢,这里需要通过DNS 服务器。假设你使用的是Centos,那么DNS服务器的地址便配置在/etc/resolv.conf文件中。


这里www.baidu.com解析出了多个IP,这里主要作用的是做高保障。


2. 查找路由表

有了IP地址以后,接下来就是要查找路由,路由的作用是决定数据包的下一跳地址。不管理服务还是说物理路由器,它的原理都是一样的。下面我们来看一下本机的路由表:


我们发现这里有4条路由规则,下面三条是具体的路由规则,第一条是缺省的路由规则,并且它的默认网关是10.100.172.252。 因为下面三条无法匹配180.97.33.108这个地址,所以第一条规则生效,也就是说下一跳地址是10.100.172.252(默认网关)。


3. 查找ARP表

有了下一跳IP地址以后,是不是说数据包就能发出去了呢。 也不能,因为数据包最终在传输的过程中,并不认IP地址,而只认MAC地址。即数据包底层传输走的是二层链路(MAC),不是三层链路(IP)。有了网关的IP以后,如何找到二层链路的MAC地址呢?这里使用的方式是ARP请求,如果本地没有找到该IP所对应的MAC地址,则会发送ARP请求。ARP请求会在二层广播域里传播,目标机器,比如这里的网关收到这个ARP请求以后,发现ARP请求的IP就是本机的IP,这时网关会进行回复。如果不是本机的IP,则不予处理。


注意这里的ARP请求只有在ARP表中查找不到的情况下才会发送,并且查询完以后会进行缓存。在有效其内不再重新发送ARP请求,以提高效率。


这里可以看到ARP表中有10.100.172.252这条记录,接下来发送数据包。 


4. 数据包发送

有了MAC以后,数据包便从网卡发送出去,先到达交换机,然后再通过交换机转发给网关。

 

这里可以看到目的MAC地址就是网关的MAC地址。


5. 路由转发

如果源IP以及目的IP在同一个网段里面,则不需要进行路由转发。如果是跨三层,则需要进行路由转发。转发的过程和以上过程类似,先找下一跳地址,然后再发ARP请求。注意数据包在转发的过程中,源MAC以及目的MAC地址会改变。源MAC是本机的MAC,目的MAC是下一跳的MAC地址。


6. 数据回包

数据回包的过程同数据包发送的过程,也是先找路由,再ARP请求这个套路。这里有个要注意的地方:有时候在目的机器上抓包,发现包以已经过来,但还是不通,大部分的原因是因为,没有回包的路由。


网络故障常用的排错方法

1. nslookup查看DNS命令

  nslookup [域名]: 可以查看对应域名的IP地址


2. ping 命令

ping xx.xx.xx.xx是检测网络问题的最简单的方法,注意ping走的是ICMP协议,不是TCP也不是UDP这里要注意。在私有云上,如果发现不通,检查一下安全组有没有打开ICMP协议。


3. tcpdump命令

tcpdump命令用来抓包分析,对于定位问题非常有用。 这里就简单介绍一下这个命令的使用方法:

1、抓取包含172.16.1.122的数据包  

# tcpdump -i eth0 -vnn host 172.16.1.122  

   

2、抓取包含172.16.1.0/24网段的数据包  

# tcpdump -i eth0 -vnn net 172.16.1.0/24  

   

3、抓取包含端口22的数据包  

# tcpdump -i eth0 -vnn port 22  

   

4、抓取udp协议的数据包  

# tcpdump -i eth0 -vnn  udp  

   

5、抓取icmp协议的数据包  

# tcpdump -i eth0 -vnn icmp  

  

6、抓取arp协议的数据包  

# tcpdump -i eth0 -vnn arp  

   

7、抓取ip协议的数据包  

# tcpdump -i eth0 -vnn ip  

   

8、抓取源ip是172.16.1.122数据包。  

# tcpdump -i eth0 -vnn src host 172.16.1.122  

   

9、抓取目的ip是172.16.1.122数据包  

# tcpdump -i eth0 -vnn dst host 172.16.1.122  

   

10、抓取源端口是22的数据包  

# tcpdump -i eth0 -vnn src port 22  

   

11、抓取源ip是172.16.1.253且目的ip是22的数据包  

# tcpdump -i eth0 -vnn src host 172.16.1.253 and dst port 22  

                 

12、抓取源ip是172.16.1.122或者包含端口是22的数据包  

# tcpdump -i eth0 -vnn src host 172.16.1.122 or port 22  

   

13、抓取源ip是172.16.1.122且端口不是22的数据包  

[root@ ftp]# tcpdump -i eth0 -vnn src host 172.16.1.122 and not port 22  

  

14、抓取源ip是172.16.1.2且目的端口是22,或源ip是172.16.1.65且目的端口是80的数据包。  

# tcpdump -i eth0 -vnn srchost172.16.1.2anddstport22 or   srchost172.16.1.65anddstport80  

   

15、抓取源ip是172.16.1.59且目的端口是22,或源ip是172.16.1.68且目的端口是80的数据包。  

# tcpdump -i  eth0 -vnn 'src host 172.16.1.59 and dst port 22' or  ' src host 172.16.1.68 and dst port 80 '  

   

16、把抓取的数据包记录存到/tmp/fill文件中,当抓取100个数据包后就退出程序。  

# tcpdump –i eth0 -vnn -w  /tmp/fil1 -c 100  

   

17、从/tmp/fill记录中读取tcp协议的数据包  

# tcpdump –i eth0 -vnn -r  /tmp/fil1 tcp  

   

18、从/tmp/fill记录中读取包含172.16.1.58的数据包  

# tcpdump –i eth0 -vnn -r  /tmp/fil1 host  172.16.1.58  

 

以上就是网络故障常用的排错方法,下一节我们讲一下虚拟化网络环境中如何定位分析问题。




展开阅读全文

没有更多推荐了,返回首页