起因
2023年5月3日我更换了新的路由设备后出现了某些设备只能单向ping通的问题
问题描述
在同一个网段里,A可以ping通B,反过来Bping不通A。
Ping 命令概述
ping命令基于ICMP协议,通常用于判断数据包是否能通过IP协议到达目的主机
抓包看看正常的ping
我们将 192.168.1.253 这台主机记作 A,192.168.1.103 这台主机记作B
可以看到 A 先发送了一个 request 包,然后 B 回复了一个 reply 包,从此 A -> B 之间的链路是通的。
但是会出现一种问题,A -> B 通,反过来 B -> A 不通!
解决方案
通常出现单向 ping 通的原因有以下几点:
开启了防火墙
一般的做法是将来自外部的ICMP请求报文滤掉,但它却对本机出去的ICMP请求报文,以及来自外部的ICMP应答报文不加任何限制。这样,从本机Ping其他机器时,如果网络正常,就没有问题。但如果从其他机器Ping这台机器,即使网络一切正常,也会出现“超时无应答”的错误。
设置了错误的IP地址
如果该主机上存在多块网卡,恰巧又将其设置成了同一个子网,那么从IP层协议来看,该主机就有多个不同的接口处于同一个网段内,当从该主机Ping其他主机时,就会存在如下问题:
- 主机不知道将数据包发到哪个网络接口,因为有多个网络接口都连接在同一网段
- 主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去 Ping 其他机器,IP 层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机 Ping 这台主机时,请求包从特定的网卡来, ICMP 只须简单地将目的、源地址互换,并更改一些标志即可,ICMP 应答包能顺利发出,其他主机也就能成功 Ping 通这台机器了
本人遇到的问题是如下:
正常能收到 request 包,但是却没有进行任何回复,no response found!
这个问题困惑了我们很长时间,首先一方能ping通,说明链路是通的,交换机设置也没问题,那为什么另一方却ping不通?直到后来,我仔细的复盘的了一下出现问题的主机,我发现ping不通的,都是一些windows主机,linux主机完全没有这些问题。
可问题是,windows主机之前一直可以ping通啊,我没有改过任何防火墙的设置!
死马当活马医,尝试更改下windows防火墙设置,以管理员权限运行命令行,输入下面允许ICMPv4的命令
允许ICMPv4
1 | netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow |
同理,拒绝ICMPv4 可以这么写
1 | netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=block |
您猜怎么着?然后就好了!可以ping通了!
但是!但是!但是!windows主机之前一直是可以ping通的,为什么突然现在不行了,而且我没有改过任何windows防火墙的设置。
我思前想后,只有一种可能,windows的某个更新,将ping默认设置为禁止了!
但是我搜索了一下,却发现没有任何这方面的信息。
想想之前windows更新不经常是补了这个窟窿那边又捅了一个出来吗!也能理解!
不过好在现在问题解决了,是windows防火墙的原因!