这是一例发生在运行MPLS VPN的网络上由ios软件Bug引起的故障案例,我把他整理出来供大家参考和讨论,故障的发生和解决都带有偶然性,并不重要, 只希望通过讨论,能够提高我们分析问题,解决问题的能力.
一、故障缘由
某城市A城域网骨干两台7206(R1和R2)上联核心网,下联城域,互为备份,运行MPLS,图就不画了,呵呵。某日升级城域
,对城域网进行调整和扩容。(下文中的城市B的城域结构有所不同,规模也大些,但在此例中也可按此结构理解,故不做详细说明)
升级过程:
1、 升级7206ios
2、 业务割接
3、 冗余测试、HSRP测试和全网测试、业务测试,做最后一次用户连通性测试,OK,走人!
4、 观察阶段。
第二天,某用户报MPLS VPN网络不通。
(注:割接过程不对用户配置进行修改!)
二、故障现象
用户报割接城市A到另外城市B的MPLS VPN业务中断。
城市A的某用户业务是通过CE设备以MPLS VPN的形式接入到城市A的PE路由器上(就是刚刚将的升级过的骨干路由器Cisco VXR 7206)的,同样,城市B的某用户业务是通过CE设备以MPLS VPN的形式接入到省骨干网相应的PE路由器。
故障现象是城市A的某用户可以PING通城市A本地的PE路由器,城市A某用户本地网络连接无任何问题,但不能PING通远端城市B的PE路由器的某用户业务子接口。
同样城市B的某用户可以PING通城市B本地的PE路由器,城市B某用户本地网络连接无任何问题,但不能PING通远端城市A的PE路由器。
最奇怪的是: 城市A某用户业务所连接的PE路由器上,同时存在其他五个VPN的用户,这五个VPN用户网络业务运行完全正常。 且其网络业务的设置与某用户业务的设置是同一类型的。所有的VPN业务之间的命令比较,不多一句,不少一句。
某用户VPN业务,城市A和城市B之间的VPN及IPV4的路由完全正常!
三、排错过程
(1)故障的隔离
第一时间在城市A某用户VPN所在的省骨干PE路由器上 Cisco 7206VXR上开设逻辑端口Loopback1, 并将Loopback1 划入某用户VPN, 此时城市B某用户VPN可以收到此Loopback 地址的路由,但仍旧无法PING通该Loopback地址。因此可证明某用户VPN的中断不是新增的城域网设备引起的,问题产生在省骨干路由器之间的MPLS交互进程上。此时我们把所有的工作重点放在省骨干网之间的排错上。
(2)命令处理流程
主要的处理工作如下:
1. 在城市A的骨干路由器r2上使用命令show ip vrf 检查mpls vpn的配置和RD的名字。发现都是正确的。使用命令show ip vrf detail vpn9:XXX.VPN和show ip vrf interface检查某用户vpn的路由属性,和它的接口状态和ip地址。发现都是正确的。使用命令show ip bgp neighbors/show ip bgp vpnv4 all /show ip bgp vpnv4 vrf vpn9:XXX.VPN检查城市A和城市B两PE间的BGP关系。发现都是正确的。
2.在城市A的骨干路由器r2上使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市A本地某用户)和一条bgp的路由(城市B某用户)。使用命令ping vrf vpn9:XXX.VPN 210.5.2.130 。测试城市A本地PE到城市A本地CE的联通性。测试结果是通的。使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市A本地PE到城市BPE的联通性。测试结果是ping不通。
3.然后telnet到城市B的PE路由器上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条bgp的路由(城市A某用户)。使用命令ping vrf vpn9:XXX.VPN 210.5.0.222 。测试城市B本地PE到城市B本地CE的联通性。测试结果是通的。使用命令ping vrf vpn9:XXX.VPN 210.5.2.129.。测试城市BPE到城市A PE的联通性。测试结果是ping不通。
因为这个vpn两端的路由都是正确的,而且在割接过程中没有做任何的改动。割接后的测试也是正常的。讨论后得出初步结论,认为问题不是割接造成的。有可能是其他的原因引起。分析问题的方向应该和割接无关,重点在mpls vpn的方向。
4.在城市A的骨干路由器r2上使用命令clear ip route vrf vpn9:XXX.VPN *,使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,bgp路由(城市B某用户)已经消失。稍后使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,除了直连的路由(城市A本地某用户),一条bgp的路由(城市B某用户)重新出现。在城市B的PE路由器上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条bgp路由(城市A某用户)。在城市A的骨干路由器r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市APE的联通性。测试结果是ping不通。
5.在城市B的PE路由器上使用命令clear ip route vrf vpn9:XXX.VPN *,使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,bgp路由(城市A某用户)已经消失。稍后使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,除了直连的路由(城市B本地某用户),一条bgp的路由(城市A某用户)重新出现。在城市A的骨干路由器r2上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条bgp路由(城市A某用户)。在城市A的骨干路由器r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市A PE的联通性。测试结果是ping不通。
6.在城市A的骨干路由器r2上某用户的子端口上使用命令shutdown,使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,直连的路由(城市A本地某用户)已经消失。使用no shutdown,使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,直连的路由(城市A本地某用户)重新出现,一条bgp的路由(城市B某用户)仍然存在。在城市B的PE路由器上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条新学到的bgp路由(城市A某用户)。在城市A的骨干路由器r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市APE的联通性。测试结果是ping不通。
7.在城市B的PE路由器上某用户的子端口上使用命令shutdown,使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,直连的路由(城市B本地某用户)已经消失。使用no shutdown,使用命令show ip route vrf vpn9:XXX.VPN可以看到vpn的路由已经有变化,直连的路由(城市B本地某用户)重新出现,一条bgp的路由(城市A某用户)仍然存在。在城市A的骨干路由器r2上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市A本地某用户)和一条新学到的bgp路由(城市B某用户)。在城市A的骨干路由器r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市A PE的联通性。测试结果是ping不通。
8.在城市A的骨干路由器r2上某用户的子端口上使用命令去掉此vpn的配置命令。稍后使用原来的命令重新配置。配置完毕在r2上使用命令show ip route vrf vpn9:XXX.VPN可以看到正确的vpn路由,直连的路由(城市A本地某用户)和一条bgp的路由(城市B某用户)。在城市B的PE路由器上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条bgp的路由(城市A某用户)。在r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市APE的联通性。测试结果是ping不通。
9.在城市A的骨干路由器r2上某用户的子端口上使用命令去掉此vpn的配置命令。使用原来的命令重新在城市A的骨干路由器r1配置。配置完毕在r1上使用命令show ip route vrf vpn9:XXX.VPN可以看到正确的vpn路由,直连的路由(城市A本地某用户)和一条bgp的路由(城市B某用户)。在城市B的PE路由器上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条bgp的路由(城市A某用户)。在r1上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市A PE的联通性。测试结果是ping不通。为了稳妥起见,我们又把某用户vpn的配置重新挪回到r2上,并删除r1的某用户vpn配置。
10.因为在割接前曾经升级了城市A的骨干路由器r1和r2的IOS软件。考虑到有可能是IOS软件BUG引起这个问题。尝试把r2路由器的IOS版本降级回原来使用的版本。在r2路由器上使用配置命令boot system flash disk0:c7200-p-mz.120-17.ST1.bin,存盘后执行命令reload。等r2路由器启动完毕。在r2上使用命令show ip route vrf vpn9:XXX.VPN可以看到正确的vpn路由,直连的路由(城市A本地某用户)和一条bgp的路由(城市B某用户)。在城市B的PE路由器上,使用命令show ip route vrf vpn9:XXX.VPN。可以看到vpn的路由是正确的,分别是一条直连的路由(城市B本地某用户)和一条bgp的路由(城市A某用户)。在r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市APE的联通性。测试结果是ping不通。
11.重复步骤10的操作,改为使用其他的软件版本。一共尝试了3个软件版本。软件版本分别是:c7200-p-mz.122-11.T1.bin,c7200-p-mz.120-17.ST1.bin,c7200-p-mz.120-23.S1.bin
12.在城市A的骨干路由器r2上使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X检查城市B某用户路由的标签。发现标签堆栈里只有一级标签。这个标签是城市B的PE路由器分发的关于城市B某用户路由的标签。但是缺少了和城市A PE直连的P路由器分发的mpls标签。这会导致城市A的PE不懂如何转发mpls数据帧到mpls骨干,也就是P路由器。最终的结果是导致某用户在城市A和城市B的vpn不通。
13.在城市A的r2上使用命令clear ip bgp *,稍后再使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X检查城市B某用户路由的标签。发现标签堆栈里仍然只有一级标签。
14.重复13的操作接近10次,在这过程中也曾经使用show tech命令去检查r2的各种状态信息,但是没有任何异常。在大概15点00分,突然发现show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X的输出显示城市B某用户路由的标签堆栈里有了两级标签。在r2上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市APE的联通性。测试结果是ping不通。
15.在城市A的骨干路由器r2上使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X检查城市B某用户路由的标签。同时在城市B的PE路由器上使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail。发现问题所在,城市B的PE路由器对城市B某用户的路由的标签在分发到城市A的PE路由器上后标签值不一致。导致城市A PE分发的MPLS数据包到达城市BPE路由器时,城市BPE路由器不知道该怎么处理,因为城市A传输过来的数据的标签并不是城市BPE分发的。所以城市BPE路由器只能把它丢弃。导致网络不通。
16.在城市B的PE路由器上使用命令clear ip bgp *,稍后在城市A的骨干路由器r2上使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X检查城市B某用户路由的标签。同时在城市B的PE路由器上使用命令show tag forwarding-table vrf vpn9:XXX.VPN *.*.*.* detail。发现标签仍然不匹配。
17.在城市B的PE路由器上某用户的子端口上使用命令no ip address,稍后重新配置原来的ip地址。稍后在城市A的骨干路由器r2上使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X检查城市B某用户路由的标签。同时在城市B的PE路由器上使用命令show tag forwarding-table vrf vpn9:XXX.VPN 210.5.2.129detail。发现标签仍然不匹配。
18.重复16的操作。但是结果仍然是标签不匹配。
认为应该是CISCO IOS的软件BUG引起的问题。但是不能通过象clear ip bgp * ,no ip address 等手段解决。在CISCO寻求帮助。
19. Cisco负责支持项目的工程师,也说不出所以然的理由;在跟Cisco工程师的电话沟通的同时,我们仍旧在做尝试,在城市A的骨干路由器r2上某用户的子端口上使用命令去掉此vpn的配置命令。使用原来的命令重新在城市A的骨干路由器r1配置。配置完毕在r1上使用命令show tag forwarding-table vrf vpn9:XXX.VPN X.X.X.X detail和命令show ip cef vrf vpn9:XXX.VPN X.X.X.X检查城市B某用户路由的标签。同时在城市B的PE路由器上使用命令show tag forwarding-table vrf vpn9:XXX.VPN *.*.*.* detail。发现标签是匹配的。在r1上使用命令ping vrf vpn9:XXX.VPN X.X.X.X。测试城市BPE到城市APE的联通性。测试结果是ping通。
20. 全面的网络测试, 类似问题没有产生!
四、故障的具体技术分析
在发生故障的当时我们分别检查了城市A和城市B PE路由器上的路由表。在城市A的PE路由器上发现某用户VPN的路由是正确的。同时在城市B的PE上也发现某用户VPN的路由是正确的。也就是说城市A城市B某用户两端的路由都是正确的。
MPLS VPN的路由正确都是不能PING通,问题出现在底层的MPLS的交换过程。这个也是CISCO早期实现MPLS VPN技术时发生的软件BUG。具体表现为:一个MPLS VPN在正常的使用过程中,突然发现不通,但是从MPLS VPN路由表上看不到任何的异常。这些现象和某用户VPN的故障完全一致。
经过进一步检查,发现导致某用户VPN城市A和城市B不通的直接原因是因为城市A的省骨干PE路由器(Cisco 7206VXR),和PE直接连接的省骨干P路由器(Cisco GSR 12016),城市B的省骨干PE路由器(Cisco GSR12016)这三者间的MPLS标签的分发出现了问题。因为MPLS VPN的IP包在MPLS骨干网中传输需要在IP包头加上两级的MPLS标签,依次为IP V4标签和VPN V4标签。如下图:
| IP V4 标签 | VPN V4标签 | VPN的IP 包
其中IP V4标签是由和城市A PE直接连接的P路由器分发的,VPN V4标签是由城市B PE路由器分发的。如果这两级标签任一不正确,都可以导致VPN不通。
当时就发现发生故障的PE路由器上的MPLS标签不正确。刚开始是只收到一级的标签,即只收到VPN V4的标签,没有收到IP V4的标签。努力解决了IP V4标签的问题后又发现VPN V4的标签不正确,即由城市B PE路由器分发的标签经过传输后在城市A PE路由器上显示为另一标签。
以上MPLS 标签的不正确是导致城市A和城市B某用户VPN路由正确但是不通的原因。
转载地址:http://www.net130.com/CMS/Pub/network/network_manage/162415.htm