问题:
某天,有同事反映vlan211下的设备192.168.211.2无法ping通,要求排查。
自己测试,用自己的pc192.168.205.201去ping发现现象如下:
奇怪,从没见过ttl过期的打印,公司内网设备怎么会出现ttl exceeded?查资料得知,这是数据包经过的节点发现ip层的ttl值为1后回的消息,并丢弃了该包。
内网一个ping包怎么会经过多个节点传输?继续排查。
- 已知设备组网如下:
已知正常时三层交换机的路由:
三层交换机上192.168.205.0和192.168.211.0是两条直连路由,正常本机192.168.205.201去ping192.168.211.2,直接在三层交换机里接转发掉了,
ttl减1就行了,怎么可能这个包的ttl从64变成1?
排查过程
vlan211是直接在核心交换机3048光交换机的12口引出的电联口,下面有192.168.211.2,3,4,6这结果ip地址.
通常,在正常是,在三层交换机3048上arp应该有下面的显示:
现在去查arp却显示这个:
奇怪,查询一下vlan的状态?
查看一下vlan的状态?
发现vlan211接口是down的,arp表没有vlan211的缓存。
询问公司的开发人员,提示检查此vlan是否所有的物理端口access口或者trunk口的物理状态都是down的,会造成vlan状态down。
发现是1/1/12口,检查12口的所属vlan情况:
检查发现vlan211仅仅只有12口一个接口,检查12口的状态:
进机房查看,发现交换机12口灯不亮,检查设备,发现设备的电源线掉了,插紧后,出来检查发现如下:
mac地址有上报,外面的pc能ping通
vlan状态down问题分析:
交换机的VLAN虚接口承载在物理端口之上,即某VLAN所包含的物理端口UP之后,该VLAN虚接口才会UP。
交换机里mac地址的存储是ivl以vlanid为单位的存储,每个vlan一个列表,当vlan不存在时,mac地址自然不存在。
端口状态恢复后,vlan状态恢复,这时才能查到mac地址。
SVI 接口 up的 条件,下面其一满足即可:
1、有交换机接口属性是 access 属于这个vlan ,且这个物理接口 是up态的。
2、这个vlan有trunk口,并许这个vlan 通过,而且trunk口是up态的。
问题复现:
- 一直搞不清ttl exceeded是谁发的 ,为啥会发这个消息,以为是路由器上防火墙做了啥限制?过了很长时间,想搞清这个问题,复现一下当时故障,看看是啥情况?
断开192.168.211.2设备的网线,用pc192.168.205.201去ping192.168.211.2去模拟:
Ping192.168.211.2后,出口路由器的ip地址192.168.212.1回的ttl exceed。
难道是ros上的防火墙做了啥限制?不让内网出去?tracert一下看看:
tracert的结果:
tracert的结果,发现包的流程在205.1和212.1间切换。不懂为什么会这样?
pc上的抓包如下图:
发现tracert的结果,ttl=1是192.168.205.1回的消息,ttl>=2后,为偶数是192.168.212.1回的ttl exceeded消息,为奇数时是192.168.205.1发的ttl exceeded消息。为啥会这样?ttl变化的包去哪里了?
Pc的抓包只看到ping的request消息里ttl是64,而收到192.168.212.1路由器的回复ttl exceeded,却看不到中间ttl减少的包,这些包在哪里?
登录三层交换机,查看192.168.211.0的直连路由?发现拔掉网线后,直连路由消失了,如下图:
正常时的路由如下:
拔掉网线后,对应192.168.211.0/24的直连路由消失。这时,ping走默认的0.0.0.0的路由出去。
Ping的request消息被送到路由器上去了,查看一下路由器收发的包,看看它是否收到ttl为1的ping的request消息,和是否回了ttl exceeded?
镜像三层交换机192.168.212.2和ros路由器192.168.212.1间接口的抓包,发现这个ping的request消息在两个设备间来回振荡,直到ttl exceeded。如下图:
上图是显示ip层的源ip和目的ip,下图是显示数据链路层的源mac地址和目的mac地址:
三层交换机的mac地址C8:50:E9:67:FA:0C
ros路由器的mac地址00:0C:29:29:0D:C5
二层是路由器给交换机转发了源ip是自己192.168.212.1目的ip是192.168.205.201的icmp的ttl exceeded消息,三层交换机再发给pc。
查看的结论是:pc发出的ping的request包在192.168.212.2(三层交换机)和ros路由器192.168.212.1间来回发送。看上面的二层mac地址和ip地址的显示,ping包被两个设备间来回发送。
ping的request包被来回发,最后192.168.212.1收到ttl=1的ping的request消息,发出ttl exceeded包,终结了包的发送。明白过程了,但为啥这样?
查看三层交换机和ros路由器的对应192.168.211.0的路由设置。
三层交换机的默认路由:
查看ros的路由发现,piing192.168.211.2的包指向三层交换机
路由器把192.168.211.2的路由指向三层交换机192.168.212.2。
这下搞清了,vlan状态down后,路由失效导致送到路由器,路由器有回程路由,导致一个ping的request消息在两个节点间振荡。
原因分析:
原因是vlan211down后,192.168.211.0的直连路由失效,ping192.168.211.2走了默认路由,被发到路由器的内网接口192.168.212.1上,并ttl值减1。
在ros的路由表里,192.168.211.0被指向192.168.212.2,所以ping包到达路由器后,
没有走默认路由从wan口出去,路由器指回三层交换机(直连优先,管理距离相同比较掩码长度,长度长的优先),ttl-1,这样来回振荡,直到路由器收到ttl为1的包后,发出ttl exceeded消息。
ttl exceeded由ros路由器192.168.212.1发出 ,如下图:
插上网线后,路由恢复 。
Pc进行tracert192.168.211.2时,发出ttl=1-30,每个ttl值发三次request消息。当三次交换机192.168.205.1收到ttl=1的包后,直接发出ttl exceeded消息给pc。当ttl值为>=2偶数时,由于路由环路,ttl=1的包由三层交换机转发给路由器,路由器发出ttl exceeded改pc。当为奇数时,最后ttl=1会有路由器转发给三层交换机,三层交换机发出ttl exceeded包。
总结:
ttl exceeded是数据包传输过程中的节点收到ttl=1的包后,发出icmp消息给源主机,并丢弃该包数据。icmp发出的源ip是由节点的路由表决定的,会用正常的访问
时的出口ip地址给源ip返回一个icmp消息。
内网中访问的经过的路由转发过程最多三级,正常情况下192.168.205.201访问192.168.211.2的ttl就是经过三层交换机的转发,ping的reply消息ttl为63.
内网地址发出的ttl exceeded,说明该包数据在组网环境里存在路由环路的问题。
tracert如果发现,经过的节点在反复循环出现,就是内部有环路了。
vlan211就一个access口12口,当12口down后,vlan211状态就down了,交换机的arp和mac地址缓存是以vlan为单位的,这样,交换机上就查不到目的ip的mac地址,而且核心交换机3048上的192.168.211.0的直连路由失效不通了。走交换机的默认0.0.0.0送到路由器192.168.212.1上去。路由器收到这个包,查找目的ip的符合路由,又送回交换机,交换机又送出,这个包在交换机和路由器间来回发,直到路由器收到ttl为1的包,回ttl exceeded消息。所以交换机转发路由器的发icmp的ttl超出消息Time to live exceeded in transit给源主机。导致不通。若vlan的状态是up的,192.168.211.2掉电,交换机会发destination host unreachable。Time to live exceeded in transit和destination host unreachable的区别是后者直连路由是通的,消息能够到达目的网段,目的网段找不到目的主机,前者根本无法到达目的网络。若vlan211的状态是激活的,211.2不在线的话,会发destination host unreachable。