问题:

某天,有同事反映vlan211下的设备192.168.211.2无法ping通,要求排查。

      自己测试,用自己的pc192.168.205.201去ping发现现象如下:

   

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机

奇怪,从没见过ttl过期的打印,公司内网设备怎么会出现ttl exceeded?查资料得知,这是数据包经过的节点发现ip层的ttl值为1后回的消息,并丢弃了该包。

内网一个ping包怎么会经过多个节点传输?继续排查。

  •       已知设备组网如下:

   

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_02

 

已知正常时三层交换机的路由:

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_03

三层交换机上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应该有下面的显示:

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_04

现在去查arp却显示这个:

 

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_05

奇怪,查询一下vlan的状态?

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_06

 

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_07

 查看一下vlan的状态?

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_08

发现vlan211接口是down的,arp表没有vlan211的缓存。

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_09

 

ReactiveRedisTemplate设置ttl ttl-exceeded_ttl传输中过期_10

询问公司的开发人员,提示检查此vlan是否所有的物理端口access口或者trunk口的物理状态都是down的,会造成vlan状态down。

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_11

发现是1/1/12口,检查12口的所属vlan情况:

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_12

检查发现vlan211仅仅只有12口一个接口,检查12口的状态:

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_13

进机房查看,发现交换机12口灯不亮,检查设备,发现设备的电源线掉了,插紧后,出来检查发现如下:

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_14

mac地址有上报,外面的pc能ping通

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_15

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。

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_16

 难道是ros上的防火墙做了啥限制?不让内网出去?tracert一下看看:

tracert的结果: 

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_17

tracert的结果,发现包的流程在205.1和212.1间切换。不懂为什么会这样?

 pc上的抓包如下图:

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_18

 

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_19

 

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_20

 

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_21

  发现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的直连路由?发现拔掉网线后,直连路由消失了,如下图:

ReactiveRedisTemplate设置ttl ttl-exceeded_ttl传输中过期_22

正常时的路由如下:

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_23

拔掉网线后,对应192.168.211.0/24的直连路由消失。这时,ping走默认的0.0.0.0的路由出去。

ReactiveRedisTemplate设置ttl ttl-exceeded_ttl传输中过期_24

Ping的request消息被送到路由器上去了,查看一下路由器收发的包,看看它是否收到ttl为1的ping的request消息,和是否回了ttl exceeded?

镜像三层交换机192.168.212.2和ros路由器192.168.212.1间接口的抓包,发现这个ping的request消息在两个设备间来回振荡,直到ttl exceeded。如下图:

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_25

上图是显示ip层的源ip和目的ip,下图是显示数据链路层的源mac地址和目的mac地址: 

三层交换机的mac地址C8:50:E9:67:FA:0C

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_26

ros路由器的mac地址00:0C:29:29:0D:C5

ReactiveRedisTemplate设置ttl ttl-exceeded_ttl传输中过期_27

 

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_28

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_29

二层是路由器给交换机转发了源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的路由设置。

三层交换机的默认路由:

ReactiveRedisTemplate设置ttl ttl-exceeded_tracert_30

查看ros的路由发现,piing192.168.211.2的包指向三层交换机 

 

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_31

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_32

路由器把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消息。

ReactiveRedisTemplate设置ttl ttl-exceeded_ttl传输中过期_33

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_34

ttl exceeded由ros路由器192.168.212.1发出 ,如下图: 

 

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_35

 

ReactiveRedisTemplate设置ttl ttl-exceeded_路由环路_36

插上网线后,路由恢复 。

ReactiveRedisTemplate设置ttl ttl-exceeded_vlan down_37

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如果发现,经过的节点在反复循环出现,就是内部有环路了。

ReactiveRedisTemplate设置ttl ttl-exceeded_三层交换机_38

 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。