一天,一个新同事找来,说要跨网段调测一个sip注册语音设备,测试网络互通性发现不行,现象是公司局域网的205网段192.168.205.0/24的pc去ping209网段192.168.209.0/24的设备,显示time out。但205网段ping209网段网关192.168.209.1是正常的。209网段的设备上网也正常,要协助解决。
告诉他,ping就是源设备发出一个ping的request消息,携带一个字符串,经过节点和传输路径,发给目的设备。目的设备收到后,就把这串字符串包装在ping的reply消息里发给源主机,源主机通过是否收到reply来判断三层路由是否导通?time out就是没有收到reply消息,等待到定时器超时(默认是5秒)后,打印的信息。
有时候time out不影响业务,如防火墙拦截ping的request消息,但不影响其他udp和tcp包的通过,所以ping不通不是判别对方设备有问题的的充分条件,而是必要条件。看他的表情,一脸的疑惑,听不懂的样子。就给他说:
出现time out就是没收到目的设备的回包,这就像你寄信没收到回信,你能确定的是你把信投进了邮箱,至于是邮递员没取,前向经过的节点邮局或者途径中丢了,导致目的方没收到,还是对方收到没回,还是对方回了,写错地址,或者在后向的节点或路径中丢了,这都确定不了,你先判断你确定把信投进邮箱了。
1、经过的节点或目的ip设备的防火墙拦截的ping的request消息,导致高层无法收到,所以不回ping的reply消息。
2、跨网段环境中存在ip冲突,导致网关把ping的request消息发给其他mac地址。
3、也与目的主机的路由相关,没有回程路由,如同网段可能掩码错误,没有配置网关的话。
4、在目的侧抓包,有request和reply消息,但因回程路由指向其他ip地址,导致ping的reply消息的目的mac指向其他mac地址,没有回到request消息的源mac上去,导致源ip没有收到ping的reply消息。
5、ping消息的入接口和回程出接口不是设备的同一接口等等原因造成。
6、目的方发出的ping的reply包,但经过的节点有acl拦截了 ,导致源设备没有收到。
排除原则:首先排查源设备发出的是否有问题?ping的request发出是否正常?就是投进正确的邮箱。然后在目的设备侧抓包,看看ping的request消息,是否到达设备?没到,就检查前向节点,到了没回,就检查防火墙,回程路由,入出端口是否一致?回了reply,就检查这个rely是否是正确的路径和mac地址。
自己测试ping的结果如图:
看了结果给他解释:205网段和209网段都是接在三层交换机下面,在三层交换机上开了两个205和209两个vlan,对应的vlan的svi地址是这两个地址192.168.205.1和192.168.209.1,pc能ping通网关192.168.209.1,证明pc到交换机的前向路径没有问题,pc的ip在209网段,上网没有问题,证明到目的pc的ip到三层交换机的路径是通的,time out是源设备ping的request消息已经发出,但没有在对应的超时时限里收到对方的回包。应该是对方防火墙或者回程路由的问题,但pc的ip在209网段,而且能够上网,证明回程路由没有问题,所以排除2345的情况,应该是目的设备防火墙拦截ping的request消息造成的问题。
解释完,看他还是一脸茫然,但咬死网络有问题,不接受自己pc防火墙造成问题这个结论,认为交换机上应该有啥设置,没办法,上交换机给看看。
交换机上看到有对应ip的ip地址,交换机上也ping不通,说明问题不在源pc和节点交换机上。交换机上ping用的是192.168.209.1,这是直连ip,ping的,这应该跟三层核心交换机无关,就是同一二层交换机下ping估计也不通。
显然没有说服他,问他会在pc上能抓包吗?我在这里长ping你的ip,你看是否收到ping的request消息?回答pc能抓包,打发他去抓包。
去他工位上查看,发现他们组长在给他抓包,操作系统是win10的,系统托盘网卡无受限标志,抓包里看到已经收到我的ip192.168.205.201发来的ping的request消息,但没有 回包。抓包里只显示ping的request消息。告诉他们,ping的request消息已经到你的pc了,但你没有响应,ping的reply消息没有发出,但你上网正常,证明回程路由没有问题,问题可能在防火墙上。
看防火墙状态是打开的。让把防火墙关掉。
wireshark里发现有响应reply消息。问题解决。
方法:运行win+r运行firewall.cpl
ping的过程是,输完命令后,根据目的ip,先查路由表,看目的主机ip是否走直连路由,是就去检查mac地址缓存表,看是否有该地址的mac地址缓存,没有的话,是用直连路由的一个本机接口去发出请求目的ip的mac地址的arp请求request消息,收到arp响应后,用这个mac地址封装二层数据,发出icmp协议的ping请求消息。mac地址缓存里有,直接封装ping的request消息。没有得到mac地址,不发出ping的request消息,回显目的主机不可达。
查路由表发现不是直连路由和静态路由的话,走默认路由的话,就去查是否有默认网关的mac地址,没有去请求网关的mac地址,有就直接封装ping的request消息。若目的主叫收到后,由于路由原因,防火墙原因,入口或者出口不一致等,没有按原路返回,或没有回复,主机在等reply超时后一般是5s,会有相应的超时显示。
上图是wireshark时间显示调整为距上一包的间隔时间的显示。
ping一个正常能通的ip地址截图如下:
上图是wireshark时间显示调整为距第一包为起始时间的抓包显示。
win10的防火墙默认网络层是拦截丢弃ping的request消息的(但抓包是从mac层获得消息,所以抓包能抓到),导致应用程序收不到。要么在防火墙里允许ping,要么直接关闭防火墙。下图是win7的防火墙允许ping的request进入的打开方法:
总之:遇到这种ping回显time out问题,表明ping的request消息已经发出,但没有回包,有几种可能性,要么,源pc发错了地方,要么目的网关送错了地方,目的主机没有收到,要么目的主机收到,回错了地方,或者防火墙拦截,导致应用层没有收到。根据这几种可能性去排除。最直接的方法是在目的ip上抓包,收到没有回就是检查是否防火墙拦截导致,或者检查是否有回程路由,回到其他mac地址就检查路由问题。