类似问题见:网络驱动器无法访问,提示找不到网络路径故障处理过程
有同事反馈他的pc192.168.205.201无法访问svn资源192.168.193.10,而其他人都能访问,让协助解决。
询问他ping的结果,反馈回显无法访问目标主机。
无法访问目的主机的可能性:
1、对方没有开机,或者开机但没有接入对应的广播域,跨网段的ip的话,所属网关arp查询消息没有得到应答,直连路由的话,本机发出arp消息没有被应答。
2、对方ip不存在。
3、设备本身路由错误,没有对应访问的路由。这种情况是所有网卡状态down,没有任何直连路由和默认路由的情况。
4、设备自身路由错误,应该走默认网关的ping消息,认为是同一网段,发出arp查询消息,在广播域里没到得到应答。
无法访问目的主机,是icmp的错误消息,由网络节点发出,直连路由的网络节点是发出ping动作的设备自身ip地址。跨网段是经过的网络节点用正常时ip导通时的ip地址回icmp错误消息。根据ping消息打印返回节点的ip地址可以判断出是直连路由还是其他跨网段非本机节点回的消息。
ping的过程流程图如下:
具体过程是,输完命令后,根据目的ip,先查路由表,看目的主机ip是否走直连路由,是就去检查mac地址缓存表,看是否有该地址的mac地址缓存,没有的话,是用直连路由的一个本机接口去发出请求目的ip的mac地址的arp请求request消息,收到arp响应后,用这个mac地址封装二层数据,发出icmp协议的ping请求消息。mac地址缓存里有,直接封装ping的request消息。没有得到mac地址,不发出ping的request消息,用自身ip回显目的主机不可达。而没有错误时,组包发出,目的主机收到后,同样的过程根据收到包的源ip进行查路由表,查mac地址缓存,发包的的过程。192.168.205.201/24去ping同网段ip192.168.205.28的wireshark流程,无需三层节点设备的参与,如下图:
无法访问目的主机的抓包和截图,一秒发出一次arp,三次收不到打印一次无法访问目的主机。
查路由表发现不是直连路由和静态路由的话,走默认路由的话,就去查是否有默认网关的mac地址,没有去请求网关的mac地址,有就直接封装ping的request消息。若目的主机收到后,由于回程路由缺失原因,防火墙原因在网络层拦截icmp探查消息,入口或者出口不一致等,没有按原路返回,或没有回复,主机在等reply超时后,会有相应的超时显示。若目的网关发出arp查询消息未找到目的主机,或者经过的节点设备发现有错误,无法到达目的主机,会选择正常时的回复接口ip给源主机发出一个icmp错误消息,提示源主机。源主机会回显错误提示。网关发给转发给目的主机,目的主机收到后,同样走查本地路由表,查下一跳ip的mac地址,二三层组包发出的过程。
如下图:192.168.205.201/24,gw192.168.205.1去ping192.168.211.2的过程,需要三层交换节点设备的参与
跨网段打印目的主机不可达的抓包,目的网关收到一个ping的request消息,同样发出三次arp查询,查询不到,3秒发出源主机一个icmp错误消息,告知无法找到目的主机。如下图:
205网段和206网段在同一三层交换机下的不同vlan,所以icmp是由205网段的网关ip192.168.205.1发出的,如图中黑色行显示的icmp消息的源ip地址。
排查过程:
跨网段是对方网关收到ping的request消息后,去找对应ip的mac地址,没有得到响应后的,网关用正常时的回消息所用ip地址作为源ip地址给发出消息的源主机发icmp消息,错误类型是目标主机不可达。pc回显结果目的主机不可达消息。考虑205网段的网关是205.1,193的网段的网关是193.1,两个网段都接在同一三层交换机下,通过三层交换机的直连路由实现跨网段访问的,告知他是否193.10未开机?
反馈其他人都能访问,奇怪,登录核心三层交换机查看arp表现?
发现该主机在,自己ping了一下,也能ping通,排除1,2的可能性,ip是存在的,而且在对应广播域里。检查是否是3,4的原因?
但他上网正常,显然情况3不成立,检查一下是否符合情况4?
到他工位让他抓包后ping进行观察?结果如下:
是自身ip192.168.205.201的回复:无法访问目的主机,若是这样证明ping动作判断目的ip使用直连路由,若是核心三层交换机回的消息,应该显示192.168.205.1的回复无法访问目的主机(因为是自身ip回显的无法访问目的主机而非其他网关地址)。
wireshark里过滤icmp发现没有任何icmp的ping的request消息发出。
难道pc认为192.168.193.10和自己的192.168.205.201是同一网段?若是那样,应该有arp消息发出。过滤arp进行查找?
用arp contains c0a8-c1来过滤arp里含有192.168.193.0/24的arp消息,显示结果如下:
发现有arp发出,没有得到响应。查看路由表看看是否有对应的直连路由?
pc有双网卡,配置了多个ip地址,为方便观察,执行route print | findstr 192.168.来过滤显示结果。
发现有两条路由,metric比较大的是usb网卡配置了192.168.0.145和192.168.1.145后的显示路由。而红线是主板集成网卡的显示。
如上图红线所示,有192.168.0.0/16的直连路由,估计就是掩码配置错误所致,因为是16位掩码,所以pc认为192.168.0.1到192.168.255.254间的目的ip的访问都是走直连路由,直接用本机的192.168.205.201发出arp查询消息。192.168.193.10也被认为是直连路由的访问,所以直接发出arp查询。但205vlan的广播域里没有这个ip,自然不会有arp响应。
确定是原因4,本身路由错误,应当走默认路由的数据,走了直连路由。
检查网口掩码:
确认掩码配置错误,是16位导致问题,让他改成24位255.255.255.0后,观察。
查看路由表如下:
如图所示:192.168.193.0网段走默认0.0.0.0的默认路由,从192.168.205.1下一跳出去,arp -d后ping抓包验证如下图:
ping一个192.168.193网段不存在的ip地址,看看
发现和之前的没改掩码前的区别,是无法访问目的主机的回显前者是自身回的,后者是网关的ip回的。抓包查看:
总结:ip访问的过程,其实是先查询路由表,根据路由表确定出口,同网段用自身ip发起arp查询,查询失败会有对应不可达的回显。不同网段走默认网关,有网关mac地址直接组包,没有发出arp消息查询网关的mac地址后组包。跨网段的访问,若对方网关没有找到主机的mac地址,会发出icmp主机不可达消息,由对方网关查找路由表,按正常回包的路由的出口ip作为源ip,发出icmp消息。本例中我们访问192.168.193.100,但这个网关没有用192.168.193.1去回icmp消息。而是查找路由表,网关自身192.168.205.0的网关192.168.205.1作为源ip去回给源主机目的主机不可达消息。如下图:
1 实现方法是主机向远程计算机发出ICMP回显请求以后,远程计算机会拦截这个请求,然后生成一条一条回显应答信息,再通过网络传回给主机。
2 假如某些原因,不能抵达目标主机,就会生成对应的ICMP错误消息("比如 目标主机访问不可达"),由原先打算建立通信的那个路径上某处的一个路由器返回。这个消息由正常时使用的对应接口ip发出。如例子里我们去ping192.168.193.xx,三层交换机上有两条路由,192.168.205.0和192.168.193.0,所以由前者发出icmp的不可达消息destination unreachable。
3 假定与主机的物理性连接并不存在问题,但远程主机已经关机或没有设置对网路事件作出相应,便需由自己的程序来执行超时检测,侦测出这样的情况。超时后给源主机发出icmp的差错消息。
另外主机路由表会根据掩码和ip生成对应的直连路由表,在网卡up后生效。