一天,同事反馈,北京同事反馈无法访问西安这边的syn服务器,ping的结果time out。让协助定位解决。
已知北京的和西安见通过vpn对接,西安是192.168.192.0/19网段,北京是172.16.0.0/16网段,
syn服务器的地址192.168.193.75/24,网关是192.168.193.1,北京的ip是172.16.123.221。北京那边的网管跟踪结果,已经到达核心三层交换机,如下:
而且北京的能ping通192.168.193.1,据此判断是syn服务器192.168.193.75的问题,同事说本地访问正常,让她联系syn负责人检查是否有回程路由?怀疑没有没有北京172.16.0.0/16的回程路由导致ping不回reply包。
ping出现time out的可能性原因:
1、目的设备防火墙拦截的ping的request消息,导致高层无法收到,所以不回ping的reply消息。
2、跨网段环境中存在ip冲突或一设备多网卡,接在同一交换机下,回答了访问其他网卡ip的arp请求,把错误的mac给了源主机,导致网关把ping的request消息发给其他mac地址。
3、也与目的主机的路由相关,没有回程路由,如设备ip和源ip是同网段,但掩码配置错误,而且没有配置网关ip的话。
4、回程路由指向其他ip地址,没有实现mac层的源mac地址进,源mac地址回去,导致源ip没有收到ping的reply消息。
5、ping消息的入接口和回程出接口不是设备的同一接口,设备开启方向路由检测导致,入和出不在同一个接口上,舍弃进入的包,不发reply回包。就是没有实现lp层的源进源出。
6、环境中传输有问题,误码过高或者带宽被占用,导致节点压包,丢包。
一般情况下供大家内部访问linux服务器,防火墙一般不会打开,所以让他优先检查回程路由信息。
过了几天,同事又找来,说syn服务器负责人说回程路由没问题,syn服务器能ping通北京的服务器172.16.123.221,服务器的负责人建议检查节点路由?
怎么可能是节点问题?询问syn服务器的操作系统,得到是linux,要了用户名和密码,ssh登录上去看看:
首先:ping一下看看
的确能ping通,这就属于单向能ping通的问题,排除可能性中的情况2,与这边的路由相关,或者防火墙有关,先检查这边的ip和路由?
发现两个网卡,192.168.193.75配置在eth1上。
发现缺省路由在eth0上,这样ping的request来包和回包就不在同一个网卡上,符合情况5,若linux打开了反向路由检测的话,检测到入出不在一个接口上,就不会发回程包。
让北京长ping这边验证一下?ping的request消息是否从eth1进入服务器?
首先tcpdump -i eth1 -nne icmp回车,看如下结果:
查看上图源mac对应的ip地址:
确定是从eth1进来,而且是网关转发的,前向没有问题。
再抓所有的网卡,看是否一致?
tcpdump -i any -nne icmp回车。
tcpdump的-any看不到mac层的目的mac地址,只能看到源mac地址。
确定是服务器的问题,服务器没有回包。
查看反向路由检测是否打开
root@mgmt ~]# cat /proc/sys/net/ipv4/conf/all/rp_filter
1
[root@mgmt ~]# cat /proc/sys/net/ipv4/conf/eth0/rp_filter
1
[root@mgmt ~]# cat /proc/sys/net/ipv4/conf/eth1/rp_filter
1
发现都打开了,确定是这个原因造成。
询问得知,路由表中的0.0.0.0/0的gw172.160.100.1是一个内部测试的路由器的lan口地址,wan口配置能和北京通信的192.168.205.45的ip地址,所以ping出去能够ping通。
有下面两种解决方法:
一种做法,添加具体的回程路由,让目的ip172.16.123.0/24从eth1回去。
另一种,就是关闭网卡的反向路由检测。
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter 关闭所有的网卡的反向路由检测
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter 关闭eth0的检测
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter 关闭eth2的检测
决定采用前一种,添加回程路由,让走eth1回去。
[root@mgmt ~]# route add -net 172.16.123.0/24 gw 192.168.193.1
查看路由表:
再次tcpdump有如下打印:
显然,这个入包的源mac是核心交换机192.168.193.1的mac,而out的源mac是服务器eth1的mac地址,实现一个 网卡进,同一个网卡出。
问题解决。
这种time out,一般与防火墙和回程路由有关,处理思路就是源设备长ping,在目的设备抓包,看看是否有ping的request是,是否会ping的reply?收到request而没有reply回,一般都是防火墙拦截导致应用层收不到ping的requet消息或者回程路由没有,或者不对(包含反向路由检测)。若有request,也有reply,但源主机还是time out,就得根据reply的目的mac判断是否回程路由指向错误了。