这类问题,要根据ping的回显结果来处理。
ping命令是检测源和目的ip间导通性的icmp协议,属于ip层协议。源主机ping发出含一串数据的包(如123456789abcde之类),封装在二层上,对方收到后,把这串包原路送回来,源pc收到后,认为是对方可达。所以它涉及二层的mac地址和ip层的交互。当对方存在问题时(ip地址不存在,没有路由等),对方的ip或者经过的网络节点会返回icmp的差错消息给终端源ip。
ping的过程是,输完命令后,根据目的ip,先查路由表,看目的主机ip是否走直连路由,是就去检查mac地址缓存表,看是否有该地址的mac地址缓存,没有的话,是用直连路由的一个本机接口去发出请求目的ip的mac地址的arp请求request消息,收到arp响应后,用这个mac地址封装二层数据,发出icmp协议的ping请求消息。mac地址缓存里有,直接封装ping的request消息。没有得到mac地址,不发出ping的request消息,回显端口不可达。
查路由表发现不是直连路由和静态路由的话,走默认路由的话,就去查是否有默认网关的mac地址,没有去请求网关的mac地址,有就直接封装ping的request消息。
局域网内网中ping不通,有几种情况,
一,一种情况是目的ip和源ip是同一网段的,ping的结果是“无法访问目标主机”,这时用arp -a | findstr ip地址,看是否获取到对应的ip地址的mac,没有的话,应该是ping命令执行时,发出的请求对方的mac地址的arp消息没有得到应答,此时根本没有发出ping的request消息。这时,要检查对方是否开机?ip是否存在?有跨交换机vlan的话,检查对应的中间trunk链路是否导通?arp消息是否能到达目的ip侧?对方是否收到arp请求消息?最好能在对方pc上抓包,看arp请求消息是否到达目的地址的主机,再逐级排查。
ping的过程,同网段的查询路由表,发现是直连路由,查询arp缓冲没有发现目的ip的mac地址,就用直连接口的ip作为源ip去查询目的ip的mac地址,如果得到响应,会用此mac地址作为目的mac组成icmp请求包发出。没有响应,arp请求消息会发出多次在ping的过程中。
如下图:我们用windump抓包,去ping一个不存在的地址。
cmd下用ipconfig/all去查看网卡的信息如下:
去ping一个ip为192.168.1.105去看看结果如何?同时用windump进行抓包观察:
正常的ping消息有响应的抓包如下:
若是同网段,ping后显示time out超时,检查arp -a有对应的目的ip的mac地址,证明网络层的ping的request消息已经发出,
而且已经到达目的主机的网络,要么没回ping的reply消息,要么回到其他地方去了?前者检查对应主机的防火墙是否设置,禁止了对ping的request进行响应?放开就行了或者关闭防火墙。要是防火墙没有问题,就检查路由表,是否因为掩码问题,判断不是同一网段,没有路由,所以没有回复,或者看掩码不同,配置有网关,由路由表中发给其他地址是否发给其他mac地址?
下面是一个对方掩码造成的time out的例子:
对方掩码设置255.255.255.252造成ping不通time out
公司一个设备有问题要进行复现,拿到后不知道ip地址,通过串口看配置文件后看到管理ip是management-port ip address 172.26.0.214 255.255.255.252,看到这里pc配置一个b类地址,172.16.0.145/16的ip后去ping。发现不通,显示time out。
奇怪,查看arp发现对方的设备已经给回arp请求了,用windump抓包看看。
发现对方arp响应已经发出,pc的ping的request消息已经发出,但icmp的reply消息没有,
问题在设备侧,为啥没回ping的reply消息?串口登录设备,查看设备的路由:
发现直连的outband的路由是172.26.0.212/30,就是掩码是255.255.255.252,就是掩码是在第四段变化,ip与掩码得出网络地址。网络地址算法如下:
172 26 0 214 第四段 1101 0110
255 255 255 252 掩码 1111 1100
172 26 0 212 结果 1101 0100 网络地址是172.26.0.212,就是路由表里的显示
设备收到172.26.0.145发来的ping的request包后,把172.16.0.145与路由表里掩码255.255.255.252与的结果是172.16.0.144,显然不上同一网段的地址,所以设备snmp口没有响应。
172 26 0 145 第四段是 1001 0001
255 255 255 252 掩码是 1111 1100
172 26 0 144 结果 1001 0000 结果是172.26.0.144,显然路由表里没有符合的路由
设备的掩码是30位,主机位是2位,所以网络地址172.26.0.212,广播地址是172.16.0.215,可用ip访问是172.26.0.213和172.26.0.214,设备用了214这个地址,所以pc应该配213这个地址。
重新去ping,结果如下:
抓包显示如下:
可以看到arp消息均正常,ping的包正常,ping的序号请求,应答序号正常。
问题解决。
下面是一个对方掩码和源ip不一致,配置有网关,ping的reply发给其他地址的范例:
Pc1的配置192.168.205.201/24gw192.168.205.1,pc2的ip192.168.205.99。发现ping不通,显示time out。
查arp缓存
Windump的抓包:
在192.168.205.99上的查询ip和掩码
发现ip是192.168.205.99/25,gw是192.168.205.22
查询路由:
Windump抓包:
Arp查询发现:
发现192.168.205.201来的ping包被发给了192.168.205.22它的网关。
为什么会这样?
因为掩码是25位,就是第四段是128,201&&128=128,所以pc收到pc1的包后,pc1的ip与自己直连路由表的掩码255.255.255.128与的结果是192.168.205.128与直连路由192.168.205.0不一致,所以不走直连路由,而符合默认网关0.0.0.0/0.0.0.0的路由,所以发给192.168.205.22的mac地址,导致不通。
二,目的ip和源ip不是同一网段
若源ip没有配置网关,会显示“传输失败。General failure”,如下图:
检查路由表若没有默认路由,就得添加对应的网关地址,系统自动生成默认路由。
ping命令发出后,提示“无法访问目标主机”,跨网段ping消息,没有直连路由的话,会首先检查是否有配置默认网关,有的话,检查arp缓存是否有网关的mac地址,没有的话,会发出arp查询网关的mac地址,有的并且响应后,直接组包发给网关的mac。出问题时:应该去检查路由表是否有缺省的路由?检查arp表是否有网关的mac地址?没有获得网关mac,检查到网关通道是否通畅?还有一种情况目的ip是不存在的ip,经过目的ip网关给回了主机不可达的icmp消息,过程是这边ping的request消息发到目的ip的网关,目的ip的网关没有对应的ip的mac地址,就会用自己的ip和mac发起arp查询,没有得到响应的话,就会向源ip地址发出host unreachable的icmp消息。源ip就显示无法访问目的主机。
模拟过程:用pc192.168.205.201(网关是205.1)去ping局域网内另一主机192.168.206.10(网关206.1,192.168.206.10此主机不存在)的情况
用wireshark抓包发现,205网段的网关192.168.205.1发给192.168.205.201一个主机不可达消息。
发现网关给回了主机不可达,交换机上查询主机地址,发现没有此主机。
在206网段的其他pc上抓包,过滤对应c0-a8-ce-0a的arp广播消息,能发现网关每隔一秒发出一次arp的广播查询消息,因为没有响应,所以会发出多次。
Arp查询没有成功,所以交换机给源主机回主机不可达的icmp消息。
若显示time out,表示ping的request消息已经发出,目的ip的网关已经获取到目的ip的mac地址,但ping的reply消息,源主机没有收到。这时应该在被叫侧检查ping的request是否到达,若是windows系统,可以使用wireshark进行抓包,过滤对应源ip或者icmp消息,看是否到达,若到达,看是否有回报发出,有的话,检查回程路由,看回包的mac地址是否和ping的request来包是否一致,不一致,检查回程路由和节点回程路由。没有回包,检查防火墙和回程路由。
去ping一台内网的pc192.168.206.110的情况:
若没有到达目的ip地址,就检查经过节点的路由是否正确,能通道是否导通?
在目的主机上抓包看到,包已经到目的主机,但目的主机没有回。
检查网关的mac地址和路由表里都正常,检查防火墙发现防火墙开启,关闭后正常。
关闭防火墙后正常。
没有回程路由的仿真:
如图,ping 172.103.201.105一台内网centos7.0的服务器。
在目的主机侧执行tcpdump的结果tcpdump -i em1 -nne icmp:
Ping的request已经收到,为啥没有回?检查防火墙是否开启和回程路由是否存在?
防火墙未打开,检查回程路由是否存在?
发现没有对应的回程路由,192.168.205.0。添加后观察:
添加路由后,ping观察。
还有一种情况是回程路由的硬件网卡出口和ping的request的入口网卡不是同一个,操作系统默认是那个口来包,从哪个口回去,跨网口的回包是禁止的,这种情况下,就要关闭回包路由检测即可。
结论:
Ping出现无法访问目标主机时,一般是本机或者网关没有获得对方主机的mac地址,要么ip不存在或者没有开机或者arp消息对方没有收到。Ping出现time out时,是对方没有应答,一般检查防火墙是否打开,或者回程路由是否存在,或者回程路由有误,回包发向了错误的地方。还有的情况是对方是另一个vlan下的ip,当整个vlan接口状态是down的情况下,会受到网关发来的ttl exceed的回显。没有路由的情况下,也会出现类似的回显。
总之:ping不通,要根据回显判断可能的情况来确定问题,并进行相应的处理。