MPLS L3VPN 排错方法

本文最后一次被修改是在:2017年4月14日18:39:37

一、控制平面

控制平面要从传递的顺序来理解:CE → PE → P → 对端 PE → 对端 CE

1、要保证 CE 路由己经传到 PE 上,可在 PE 上使用命令 show ip route vrf xxx 查看。

  1. IGP 邻居是否正常,IGP 的参数是否匹配,这里主要是 IGP 的问题。
    a.:比如 OSPF 的区域号是否一致。
    b:比如 OSPF 链路类型是否一致,例:接口下是否两边都配置或者都没有配置 ip ospf network point-to-point 。
    c:比如接口的 MTU 值的大小不匹配,OSPF 邻居就会卡在 Exstart 状态。
    d:比如接口的 IP 地址掩码是否匹配。
    e:比如 IGP 的 Hello 时间是否匹配。
    f:比如 IGP 认证的问题。
    g:比如 IGP router-id 的问题。
    h:等等 …
  2. 是否有路由控制(route-map)、过滤(包括是否在接口下过滤了组播的报文)。

2、PE 的 MP-BGP 是否学到了 VPNv4 的路由,可在 PE 上使用命令 show bgp vpnv4 unicast all 查看。

  1. 是否重分布;重分布 OSPF 的时候 ,是否匹配 OSPF 的外部路由。
  2. 是否有路由控制(route-map)、过滤。

3、对端 PE 上是否学到 VPNv4 的路由。

  1. MP-BGP 中的 VPNv4 的邻居是否起来,可用命令 show bgp vpnv4 unicast all summary 在 PE 上查看。
    a:IP 是否可达(IGP 的问题),TCP 是否能正常建立(BGP 邻居关系是通过 TCP 来建立的)。
    b:参数是否匹配(更新源、认证、AS 号、是否在 VPNv4 地址簇下激活 VPNv4 的 BGP 邻居关系)。
  2. 邻居正常建立,但还是无路由。
    a:是否有路由控制(route-map)、过滤。
    b:RT 值是否匹配,可用命令 show ip vrf detail 或 sh run | section ip vrf 在 PE 上查看。
    c:本端 PE 是否发送了 RT 值,例如:neighbor 3.1.1.1 send-community extended 或 neighbor 3.1.1.1 send-community both 。

4、是否从 BGP 重分布进 VRF 的 IGP 里面。

5、重分布过了,对端 PE 上也学到了 VPNv4 的路由,但对端 CE 还是学不到路由。

  1. 是否有路由控制(route-map)、过滤。
  2. 这里还是要看 RT 值是否匹配:有可能对端 PE 上敲了这条命令:no bgp default route-target filter,所以对端 PE 的 BGP VPNv4 里是学到了相应的 CE 路由的,但是 RT 值不匹配,对端 CE 才会学不到路由。看一条 VPNv4 路由到底携带的是哪个 RT 值可以使用这条命令查看:show bgp vpnv4 unicast all x.x.x.x 。

6、对端 CE 与对端 PE 之间的 IGP 错误(同第一条,这里主要是 IGP 的问题)。

二、数据平面

路由正常学习到了,那说明控制平面是没有问题的,这个时候如果还不通,那就是数据平面的问题了。

如果数据平面有问题,那归根到底就是是否学到所有 label 的问题。一般说来,内层 label 不会出问题,一般是外层 label 的错误,也就是 LSP 通道的问题。

注释:

  1. 内层 label 由 BGP 来分配,外层 label 由 LDP 来分配。
  2. 为什么内层 label 不会出问题?只要对端 PE 收到了 VPNv4 路由,那么内层 label 也顺带就传递过去了(内层 label 是由本端 PE 上的 BGP 分配的);所以从控制平面上来说,VPNv4 路由都传递到对端 PE 上了,内层 label 自然也就传递过去了,即内层 label 一般都不会出现问题的。
  3. 内层 label 也不是一定就不会出问题,比如标签空间不够用之类的,内层 label 很有可能就出问题了。

1、确定沿途的 LDP 邻居是否都 UP;LDP 邻居是否起来,可以使用命令 show mpls ldp neighbor 在 P 和 PE 设备上查看。

  1. 如果 LDP 邻居没有起来:
    a:先看 MPLS 是否配置正确,通过命令 sh run | in mpls 或者 sh run | s mpls 可以看到所有有关于 MPLS 的配置,比如:如果在全局关闭了 MPLS,那么您将会 show 出这么一条命令:no mpls ip 。
    b:可能是 IGP 的问题,看 LDP 的 router-id 或 transport IP address 是否可达,transport IP address 可以通过这条命令查看:show mpls ldp discovery 。
    c:链路两端的标签分发协议是否匹配,即 mpls label protocol ldp / tdp 。

2、LDP 邻居都正常,但还是不通。

  1. 看标签是否正常学到,这里的标签主要是指 LDP 通道的标签,即去往对端 PE 的标签是否正常学到;可以使用命令 show mpls forwarding-table 在 P 和 PE 设备上查看。
  2. 如果标签在某个路由器上没有正常学到:
    a:看沿途是否有做路由汇总,因为路由汇总会打断 LSP 通道(具体可以看这篇文章:《【实验】MPLS 下,IGP 使用路由汇总造成标签交换路径(LSP,Label Switched Path)中断的问题》)。
    b:看是否是使用直连来建立 MP-BGP 邻居,因为用直连建立的 MP-BGP 邻居会提前次末跳弹出(即一定要用 loopback 口来建立 MP-BGP 邻居)。
    c:ISP 域的 IGP 协议使用的是 OSPF 协议的时候,必须要保证 PE 节点的 Loopback 口是 32 位的主机路由,否则会出现次末跳弹出外层 label 的问题。
    d:是否做了标签过滤(具体可以看这篇文章:《【实验】MPLS LDP 标签过滤》):
    no mpls ldp advertise-labels
    mpls ldp advertise-labels for xxx to yyy
    mpls ldp neighbor 1.1.1.1 labels accept zzz
    e:CEF 是否被关闭了,no ip cef 。
    f:是否限定了一个很小的 label 空间范围,mpls label range xx yy 。

补充:如何快速定位数据平面的问题

如果两端路由都学习到了,那如何快速定位数据平面的问题呢?

其实很简单,你只需要 traceroute x.x.x.x source y.y.y.y 就可以了。哪段链路断开了,或者哪段链路没有 label,那就是那段链路的问题。

这里还要注意的是:正常情况下 traceroute 的时候,最后一跳是不显示 label 的,不是说最后一跳没有 label,而是最后一跳的 label 是 POP Label;所以当您发现 traceroute 并没有什么问题,但 MPLS L3VPN 还是不通的时候,不妨检查一下最后一跳,因为这个时候很有可能最后一跳是 No Label 。

PS:No Label 是弹出所有标签,POP Label 是弹出最外层的标签(内层标签还保留着),具体可以看这篇文章:《【实验】MPLS 下,Pop Label 和 No Label 的区别》。

这篇文章对你有帮助吗?

相关文章

1条评论

  1. 今天(2017年4月14日18:39:37)对本文进行了修改。对原有的排错思路进行重新排版,同时加入了大量新的排错思路,相当于是对本文进行了重写。

Ricky 发表评论 取消回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据