当MPLS网络进行故障排查的时候,应该遵循从控制平面和网络平面来进行故障排查。
再看看两个平面所做的事情吧.
上面是控制平面,下面是网络平面。
从转发平面也就是网络平面来说,只会有两种报文,入站为IP的分组,和入站为MPLS标签的分组,那么对应两种报文转发的时候也会有所区别,IP分组是路由转发表在进行转发,MPLS分组是LFIB--label forwarding information base在进行转发。路由转发表又是控制平面的路由表根据最优原则选举出来唯一的路径,标签转发表是依据LDP协议在IGP的基础分发而来的。
所以,一个完整的MPLS转发,首先要保证控制平面的IGP路由是正常工作的,然后要保证LDP正常分发标签,建立FEC,最后LFIB表正确建立,才能说到转发的问题.
首先来说一下标签的深度。
要在数据层面检测带标签报文的故障,首先需要知道在网络中每一条链路上的含有标签的数据报文应该有多少个标签.
下面是一些简单的场景作为示例:
○普通的IPv4 over MPLS,1个标签。(4字节,LDP分发)
○MPLS ×××或者AToM,或者6PE或者6VPE,2个标签(8字节,一个是内层标签MP-BGP分发,一个是外层标签LDP分配)
○流量工程2个标签.(8个字节,一个是内层MP-BGP分配的标签,一个是外层RSVP分配的标签).
○快速重路由FRR的流量工程,2个标签。
下面再来看看TTL,这个重要的东西在MPLS网络中扮演的角色.顺便再来复习一下普通的IP TTL的工作模式。
下面是一个普通的IP TTL的工作模式:
在这里可以看到,实际上第一个探测报文发送出去的时候他得IP TTL=1,所以在第一跳路由器2,TTL就过期了。
路由器2就会返回一个ICMP type=11,codec=0的报文回来。第二个探测报文是TTL为2,以此类推,直到traceroute到最后的目的地。
下面就是一个IP traceroute的结果,是用电脑做的,路由器大同小异,在原理上是没有区别的。
在MPLS网络中的跟踪路由与IP网络的跟踪是很相似的。一个不同的是LSR上当有一个含有标签的数据报文过期时产生的ICMP消息包含了一个新的标签扩展.这样让tracroute在MPLS中变得相当简单。
上面的截图就是从IP转发到MPLS转发的过程。
前面说过标签的深度。
2 2.1.1.2 [MPLS: Labels 16/21 Exp 0] 52 msec 136 msec 96 msec
这里有2个标签,是一个MPLS ×××的环境里面做的traceroute。在外面的16,是MPLS LDP协议分发的标签,而内层MP-BGP标签,是MP-BGP为vrf分配的标签,所以在进行故障排查的时候,关于MTU这块,IP MTU=1500的话,那么MPLS MTU=1500+2*4=1508字节.
从traceroute也可以看出来是2个标签。
在PE上面如果使能了mpls ip propagate-ttl,那么从CE上面traceroute对端的CE,中间的骨干网络MPLS是跟踪不到的。任何一个技术需求后面都有它的背景,MPLS骨干网络是运营商的网络,对于运营商来说,安全第一,运营商并不希望客户CE能了解到自己网络内的网络结构,所以隐藏TTL能达到很好的效果。光说不练假把式,下面看看实际的:
因为这个命令使能了以后,PE就把TTL隐藏掉了.
下面是正常的从CE-1到ce-2的正常的信息,通过mpls骨干网络的时候我们可以看到有标签存在:
这里,第一跳是IP,1.1.1.2,第二跳得时候就已经封装了MPLS 标签了,2.1.1.2,可以看到,外层LDP是17,内层MP-BGP是21.
等等。如果我在2.1.1.2这个PE上面用命令:
router(config)#no mpls ip propagate-ttl
那么从CE-1 traceroute到CE-2,结果如下:
区别那是相当的大啊,呵呵,第一个是一个全拓扑,把链路上CE,PE,P,PE,CE都traceroute出来了。
第二个只有CE到CE的IP,中间mpls骨干网络的信息全部都省略了。安全上面是没有说的了。
还有一个东西要重新提一下是MPLS MTU.
默认情况下,MPLS MTU和以太接口IP MTU是一样的,都是1500.
相关博客已经说明了如何计算MPLS MTU。详细请参考 http://361531.blog.51cto.com/351531/657564
计算公式很简单。
MPLS MTU=IP MTU+N*4字节 (N为MPLS 标签的个数)
如果你传输一个IP MTU=1500的报文,如果mpls标签有一个,那么也就意味着:IP MTU=MPLS MTU-1*4=1496.
也就是说在默认情况下,如果你发送一个报文IP MTU为1500的话,那么在1497的时候系统就会分片。
如何解决这个问题呢?
1,降低IP 报文的MTU到1492 (因为一般IP报文穿越的都是MPLS ×××网络,这种网络会有两个4字节的标签)
2, 应用路径MTU发现. PMTUD--path MTU discovery.
最后再总结一下关于MPLS ×××的故障排查的步骤:
1, 在PE-1和PE-2上面检查一下,是否两边的loopback都是配置的32位的掩码.这个很重要。
2,然后再PE-1上面,用扩展ping,源是PE-1的环回口,目的是PE-2的环回口。如果这样能通,证明IGP的OSPF是没有问题的。如果不同,去查找OSPF的问题。
3, 在PE-1和PE-2上面,show ip bgp summary,看看bgp有没有起来。Bgp起来的话,那么继续往下.
4, 在PE-1,P,PE-2上面,show mpls ldp neighbor,PE-1和PE-2应该是一个LDP邻居,P设备上面应该是2个LDP邻居,每个ldp邻居的状态应该是operational的。如果不是,检查相关骨干接口的配置是否正确。
5, 在PE-1和PE-2上面,show ip bgp ***v4 all.
你应该可以看到PE-1上面对于本地的VRF路由,next hop 是0.0.0.0.对于对端的vrf路由,下一跳是对端的PE-2的换回口,如果不是,请检查下面bgp的配置:
router bgp 65500
no synchronization
bgp router-id 10.1.1.1
bgp log-neighbor-changes
neighbor 10.1.1.2 remote-as 65500
neighbor 10.1.1.2 update-source Loopback0 //指定更新源是loopback 0.否则的话系统会以出接口为源。
neighbor 10.1.1.2 next-hop-self //把自己设置为下一跳
no auto-summary
!
address-family ***v4
neighbor 10.1.1.2 activate
neighbor 10.1.1.2 send-community extended
exit-address-family
!
address-family ipv4 vrf maipu
redistribute connected
redistribute static
no synchronization
exit-address-family
6, 在PE-1,P,PE-2上面show mpls forwarding-table.
看看各个标签是否工作正常。
7, 如果上面的都成立,你可以这样做一个实验。应该是能ping通的:
CE1-------(vrf test 1.1.1.1)PE1-------P---------PE2(vrf test 2.1.1.1)-----------CE2
在PE-1上面: ping vrf test 2.1.1.1
在PE-2上面:ping vrf test 1.1.1.1
这个应该是没有问题的。
如果这里都没有问题,那么最后排除两边CE的路由。
在CE1上面看看是否有默认路由指向PE-1的vrf地址为网关。
在CE2上面做同样的操作。
经过上面的操作,应该从CE-1到CE-2是没有问题的。