作者:https://blog.51cto.com/361531/1708085
Troubleshooting主要从两个层面来进行:
1, 控制层面---路由(和LDP,CEF没有关系)
控制平面主要管的事情是CE之间能通过MPLS ***相互能学习到路由.
No.1 : CE和CE之间,检查路由相互之间是否学习到。
在图中是R10和R2.
如果R10上面没有通过R8学习到对端R2的CE路由.
No.2 : 这个时候需要到R1的vrf路由表查询是否有学习到R2的路由.
因为路由是从R2往R10反方向传递的。所以本端CE没有路由,需要到对端的PE先进行查看. 在R1上面查看vrf Hank的路由表:
show ip route vrf Hank
如果,R1 vrf没有收到R2的路由,那么应该检查R1 vrf接口下面链接的CE,是否有进行网络的宣告.链路是否有问题等等。这个时候就是IGP的故障排查.R1到R2之间.
如果, R1的vrf学习到了R2宣告过来的路由.那么,
No.3 : 这个时候应该检查R1的MP-BGP中的***v4路由表中,是否有R2宣告的路由.
show ip bgp ***v4 all
如果没有,那说明可能问题存在于:在bgp中的address-family ipv4 vrf xxx中是否没有重分布vrf的IGP路由协议.导致***v4本地没有CE的路由.
那么对于IGP OSPF来说,重分布进入BGP的地址族vrf中,缺省是只重分布Internal的路由.
如果要重分布所有的。应该这样写:
router bgp xxx
address-family ipv4 vrf xxx
redistribute ospf 22 match internal external nssa-external //如果不加,R2上面如果重分布一个外部路由到ospf中,通告到R1 vrf,因为重分布只重分布内部,所以这个时候在R1上面show ip bgp ***v4 all 就绝对看不到那个外部路由.
exit
exit
如果R1上面show ip bgp ***v4能看到相关CE R2宣告的路由,说明重分布是没有问题的.这个时候:
No.4 : R1会通过MP-IBGP将这些***V4路由传递给R8去.
在R8也是一样, show ip bgp ***v4 all查看***v4路由是否送过来了.
如果这个时候在R8上面看不到路由前缀,可能有下面问题存在:
1)R1和R8的IBGP没有建立邻居. 因为使用的是MP-BGP作为承载协议。
所以使用命令:show ip bgp ***v4 all summary
来查看***v4邻居是否UP起来. 如果没有UP起来,那么就用普通的BGP故障排查来进行查看。
--本端PE的/32环回要ping到对端PE的/32环回口.
--update-source 需要使用loopback x
--在address-family ***v4中,是否有把neighbor acitve.
2)如果邻居起来了,可是依然没有***v4的路由信息在R8上面.
这个时候有可能的原因是:
---RT的EXPORT和IMPORT有问题. export和import不匹配.
show ip vrf detail
在显示信息中,RT的export和import都有明确的说明.
如果两边的PE彼此RT的export和import都相互匹配,还是没有对端CE的路由信息.那么
---有可能R1根本就没有发送RT. RT是一个扩展的MP-BGP的团体属性.需要在R1上面检查,是否在address-family ***v4中,neighbor x.x.x.x send community extend.该项默认加载,有可能被人为手工删除.攻击的时候可能会被删除掉.这个时候虽然两边RT相互匹配,但是因为MP-BGP的扩展属性没有发送,所以RT是不能携带到路由前缀中的.
---如果上面说的都有了,那么在R8上面, show ip bgp ***v4 all应该是能看到R2宣告的CE的路由的.这个时候和重分布一点关系都没有.
No.5 : R8收到了***V4的路由,也正确的重分布了,但是R10收不到.
有可能的原因:
-----R8关掉基于RT值的过滤,这样的话即使RT不匹配,我这段也能收到相关的***v4路由,但是重分布的时候,即使做对了,也不能重分布进入.例如:
router bgp xxx
no bgp default route-target filter
exit
检查命令,在R8上面:
show ip bgp ***v4 all 22.1.1.1 //可以查看相关发送过来的RT export.
show ip vrf detail //可以看到本端需要接收的RT import是多少.
------R8需要重分布bgp到vrf的IGP路由协议中.
否则的话, 在R8上面***v4的路由表有相关条目,但是show ip route vrf Hank中,是没有对端R2 CE宣告的路由的.
如果IGP是EIGRP的话,在做重分布的时候,需要将Metric的K1-5写进去,默认是无穷大.
router eigrp 99
!
address-family ipv4 vrf Hank autonomous-system 10
redistribute bgp 65000 metric 1000000 1 255 1 1500
network 17.1.1.1 0.0.0.0
exit-address-family
------如果R8 vrf有相关的CE2的路由,那R8到R10之间就用基本的IGP故障排查思路进行故障排查.
2, 数据平面---报文转发(LDP,CEF,label)
当控制层面工作正常以后,数据平面的作用是CE之间相互能传递数据报文.
测试拓扑图,R2--发送数据包--->R10:
当控制层面的问题解决完了,这个时候路由已经相互通告到对端的CE了.
现在是说R2 发送数据包,到R10,是否能正常转发的问题.
No.1 在R1上面看MPLS LDP label.
对于R1来说,标签有两层,
外层标签: LDP: 88.1.1.1
***标签:CE的路由(R10的环回口).由MP-BGP进行标签的分发.
所以,在R1上面,需要查询VRF HANK的cef表.
show ip cef vrf Hank detail
外层标签,是为bgp路由的下一跳88.1.1.1分配的标签.
这里再说一下309这个公网标签是如何分配过来的.实际上是R3分配的标签通告给R1的.使用LDP协议分配的.为88.1.1.1(R8的环回口)分配的标签.通告给R1.
如果发现,R1只有***v标签(内层标签),没有外层的LDP标签,可能的问题有:
---LDP邻居是否有起来.在R1和R3上面show mpls ldp neighbor进行验证.
如果连LDP邻居都没有起来,可能的问题有:
----1)ISP域之间采用的标签协议不同导致. LDP && TDP,可能性比较小,攻击的时候不排除.
----2)LDP的transport地址相互不可达. (使能了LDP协议以后,默认的情况是会自动选举一个LDP router-id,默认用环回口,而transport IP默认也是环回口,如果transport IP不可达,LDP的邻居建立无法成功,因为是用transport IP TCP的方式来建立邻居.)------>检查路由器是否忘记宣告环回口进入IGP路由协议中.
R1和R8一般不容易出问题. 而R3很容易出该问题.
用扩展ping来检查即可在R1和R3上面.
如果LDP邻居R1和R3起来了,但是R1依然没有收到公网标签,原因如下:
1)是否有一些标签的控制机制在作怪.
R3通告标签的控制.
R1接收标签的控制.
show run | in mpls //推荐使用,直接看有没有策略.
需要关注是否结果包含下面语句:
发送:
no mpls ldp advertise-labels //标签发送
mpls ldp advertise-labels for x to y //标签发送
标签接收:
mpls ldp neighbor 55.1.1.1 label accept 1 //仅仅接收LDP neighbor 55.1.1.1所定义的ACL1的允许的标签.
2)路由器没有启用CEF.
CEF是FIB表,如果没有cef,那么也就没有LFIB.所以对于cisco设备来说,CEF是一定要启用的.否则的话是全部的前缀状态都是no label.
3) 对于标签,不能只看其中的某个点,而是端到端一路从PE到对端PE看过去.每个设备上面都要有标签。其实简单的办法就是在R1 PE1上面,traceroute 88.1.1.1,看结果是否全部都有标签.能从R1到R8的环回口,那么外层标签是没有问题了.
因为数据到R5出口的时候,因为PHP倒数第二跳弹出机制,已经pop label了,那么最后在R8上面收到数据包的时候只有一个***v4的标签,是mp-bgp分配的,其中可以看到, local=811,而且后面是[V],说明是一个***v4的标签:
最后数通通讯成功:
label=112, 是***v4的内层标签,R1通过MP-BGP分配给22.1.1.1的***v4标签.
506和306都是P设备通过LDP向11.1.1.1(BGP的下一跳)分配的标签.