MPLS L3VPN为什么要使用两层MPLS标签?

MPLS L3VPN为什么要使用两层MPLS标签?
MPLS L3VPN为什么要使用两层MPLS标签?

如上图所示,这是一个MPLS L3VPN的实验拓扑。大家都知道,MPLS L3VPN是使用两层MPLS标签的。第一个问题,那如果只使用一层外层MPLS标签会出现什么问题呢?

回答:如果在R6(172.16.6.6)上ping R1(10.1.1.1),因为在R5上R5知道10.1.1.1这条路由属于BGP路由,所以R5将会为该ping包打上这条BGP路由的下一跳IP地址的MPLS标签,而BGP VPNv4路由10.1.1.0/24的下一跳IP地址显然是R2(2.2.2.2),于是该ping包在R5上会打上去往R2(2.2.2.2)的MPLS标签。

R4收到这个带有MPLS标签的ping包时会查LFIB,然后根据LFIB的指示转发给R3。R3收到这个带有MPLS标签的ping包后会Pop Label(弹出一层MPLS标签,正常的次末跳弹出行为),然后转发给R2。所以这个纯的IP数据包到了R2上R2就懵逼了:这个ping包的目的IP地址是10.1.1.1,而R2没法判断这个ping包是要转发给R1还是R7,因为R1和R7上都有10.1.1.0/24的LAN网段。

当然啦,R2的全局路由表上也不可能会存有CE的路由,所以就算R7没有10.1.1.0/24的LAN网段,R2也不知道这个ping包该发往哪儿。

其他相关文章:

第二个问题,现在肯定有人会问:MPLS L3VPN不是用RD值来区分路由了么(64bit的RD值 + 32bit的IP地址 = 96bit的VPNv4地址)?怎么还区分不出来目的IP地址是10.1.1.1的数据包到底是要去往R1的还是去往R7的?

回答:首先,在控制层面确实是用RD值来区分路由的,但这仅仅只是控制层面,VPNv4路由是没法在数据层面上真正地去做路由转发的。正是因为数据包的目的IP地址只能是IPv4或者IPv6地址,不能是VPNv4地址,所以R2上收到一个目的IP地址是10.1.1.1的数据包它还真就懵逼了,数据包里没有存有RD值和VPNv4地址等相关信息来帮助R2转发数据包。

从全局的角度来说,我们现在也只有IPv4和IPv6的路由表,你可不会在路由器里面看到一个能用来进行数据转发的VPNv4路由表,并没有show vpnv4 route这种命令。所以,RD值(和VPNv4路由)仅仅只是在控制层面区分路由,数据层面的数据包转发只能靠IPv4路由表、IPv6路由表、FIB(如果开启了IP CEF)和MPLS。

其他相关文章:

RD值只在控制层面区分路由,不能用于数据层面的转发了,那第三个问题:MPLS L3VPN的两层MPLS标签又是如何工作的呢?

回答:首先,外层MPLS标签的工作方式就是我在第一个问题的回答里描述的那样,所以该问题只会详细描述内层MPLS标签是如何工作的。

如果只有一层外层MPLS标签,在R6(172.16.6.6)上ping R1(10.1.1.1),数据包到了R2,因为所有的MPLS标签都弹出了,所以R2只能根据数据包的目的IP地址去FIB里查找,显然R2的全局路由表里不会有CE的路由(如果你了解CEF转发机制你就知道,FIB是路由表的拷贝,他们是同步的);就算有,R2也不知道要转发给R1还是R7。所以,内层MPLS标签要解决的就是这个问题:PE如何把数据包转发给CE。

内层MPLS标签要解决的就是这个问题:PE如何把数据包给CE
内层MPLS标签要解决的就是这个问题:PE如何把数据包给CE

如上图所示,PE还会给CE上来的路由分配MPLS标签,而且是一条VPN路由分配一个MPLS标签。当R2把这些VPNv4路由发给R5时,同时还把这些MPLS标签也发了过去(上图中的2001、2002和2003就是R2为R1的三条CE路由分配的MPLS标签,2004、2005和2006就是R2为R7的三条CE路由分配的MPLS标签)。

于是,在R6(172.16.6.6)上ping R1(10.1.1.1),数据包到了R5,R5会压两层MPLS标签:

  1. 内层是R2给R1的路由10.1.1.0/24分配的MPLS标签(如上图画的那样,该内层MPLS标签就是2001)
  2. 外层是R4给R5分配的去往2.2.2.2/32路由的MPLS标签,2.2.2.2是BGP中VPNv4路由10.1.1.0/24的下一跳IP地址。

所以,当外层MPLS标签在R3上弹出后,R2还将看到编号为2001的内层MPLS标签,这个时候R2就知道这个数据包要转发给R1而不是R7。

总结,以在R6(172.16.6.6)上ping R1(10.1.1.1)为例子举例:

外层MPLS标签 内层MPLS标签
谁分配的 R4(与之相连的P) R2(对端PE)
哪个协议分配 LDP BGP
FEC,转发等价类
(或标签分配对象)
R4上看,每条IGP路由就是一个FEC❶

R5上看,每条BGP路由的下一跳就是一个FEC❷

每条CE路由就是一个FEC
具体为哪个IP地址分配的MPLS标签 2.2.2.2,对端PE的BGP指定的下一跳IP地址(next-hop-self) 10.1.1.0/24,R1里的CE路由
作用 帮助数据包穿越MPLS域 帮助R2(对端PE)把数据包转发给CE

注释:

  • 注❶:在R4上看,R4给R5分配的关于2.2.2.2/32路由的MPLS标签,是R4为IGP路由2.2.2.2/32分配的MPLS标签,然后该MPLS标签发给了R5(即每一条IGP路由就是一个FEC);
  • 注❷:在R5上看,R5之所以会为该ping包打上2.2.2.2/32路由的MPLS标签是因为这是VPNv4路由10.1.1.0/24的下一跳IP地址(即每条BGP路由的下一跳就是一个FEC)。虽然这个MPLS标签是R4发给它的,但我们说的是FEC(转发等价类)嘛。

其他相关文章:

 

通过实验来验证上面的描述:

一、以下是上述实验拓扑的traceroute测试:

在R1(10.1.1.1)上 traceroute R6(172.16.7.6),可以看到具体的MPLS标签的变化。

MPLS L3VPN为什么要使用两层MPLS标签?ping包测试
MPLS L3VPN为什么要使用两层MPLS标签?ping包测试

如上图所示,外层MPLS标签都是一样的(两次ping都是3002和4000),而内层MPLS标签都不一样(两次ping,一次5001,一次5002)。

  • 外层MPLS标签都一样是因为R2上的VPNv4路由172.16.7.0/24和172.16.8.0/24的下一跳IP地址都是5.5.5.5/32,所以都是借用去往5.5.5.5/32的MPLS标签穿越MPLS域到达R5(对端PE)的。
  • 内层MPLS标签都不一样是因为R5(PE)上会给每条VPN路由分配一个MPLS标签,所以去往172.16.7.0/24的内层MPLS标签是5001,而去往172.16.8.0/24的内层MPLS标签是5002。

二、现在我们使用show命令去详细地跟踪每一跳,看每一跳MPLS标签的具体变化

在跟踪每一跳前,还得说清楚一个问题:R5给R2发的BGP的VPNv4路由都包含了什么?

回答:因为R5(PE)上会给每条CE路由分配一个MPLS标签,所以R5的BGP除了要通告每条VPN路由的VPNv4地址、每条VPN路由的下一跳IP地址和每条VPN路由携带的RT值给R2(对端PE)以外,还要通告R5为每条VPN路由分配的MPLS标签

VPNv4路由更新基本包括以下四个组成部分:

VPN路由的MPLS标签    VPNv4地址(RD值+IP地址)     下一跳     RT
           5000         100:6:172.16.6.0    5.5.5.5    6:6

使用show bgp vpnv4 unicast all labels命令就可以查看这些VPN路由的MPLS标签:

MPLS L3VPN为什么要使用两层MPLS标签?show bgp vpnv4 unicast all labels
MPLS L3VPN为什么要使用两层MPLS标签?show bgp vpnv4 unicast all labels

如上图所示,R5上为R6(CE)中的172.16.6.0/24、172.16.7.0/24和172.16.8.0/24路由所分的MPLS标签分别是5000、5001和5002。

注意:

  • 虽然实验拓扑中有R7和R8,但是为了省事儿我没配置R7和R8,因为用R1和R6就已经能说明问题了;
  • R2上我为R1配置的RD值是100:1,R5上我为R6配置的RD值是100:6。

现在开始跟踪每一跳,首先,R2具体是如何压制两层MPLS标签的呢?

回答:当R2收到一个来自R1的目的IP地址为172.16.7.6的ping包时,R2首先判断这个数据包是从CE来的,查相应VRF的FIB得知要压两层MPLS标签,内层MPLS标签为5001,外层MPLS标签为3002。

R2将ping包发给R3,ping包带有两层MPLS标签:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃   ICMP   ┃      D : 172.16.7.6       ┃       S : 10.1.1.1       ┃        Label : 5001       ┃        Label : 3002       ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛
(注:上面的图是拿字符画的,手机上一自动换行就乱了,如果出现了变形,请在电脑上观看,下同)

接着,R3和R4又是如何转发的?

回答:当ping包到达R3后,因为这是带有MPLS标签的数据包,所以R3查LFIB(如下图所示)。

MPLS L3VPN为什么要使用两层MPLS标签?R3上show mpls forwarding-table
MPLS L3VPN为什么要使用两层MPLS标签?R3上show mpls forwarding-table

由上图可知,R3将数据包的外层MPLS标签从3002替换成4000后,数据包将从Et0/0.34接口发出去,下一跳是34.1.1.4,也就是转发给R4。

R3将ping包发给R4,ping包带有两层MPLS标签:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃   ICMP   ┃       D : 172.16.7.6      ┃        S : 10.1.1.1      ┃        Label : 5001       ┃        Label : 4000       ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛

ping包到了R4上,因为这还是带有MPLS标签的数据包,所以R4还查LFIB(如下图所示)。

MPLS L3VPN为什么要使用两层MPLS标签?R4上show mpls forwarding-table
MPLS L3VPN为什么要使用两层MPLS标签?R4上show mpls forwarding-table

由上图可知,R4将数据包的外层MPLS标签4000弹出后,数据包将从Et0/0.45接口发出去,下一跳是45.1.1.5,也就是转发给R5。

R4将ping包发给R5,ping包带有一层MPLS标签:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃   ICMP   ┃      D : 172.16.7.6       ┃       S : 10.1.1.1       ┃       Label : 5001        ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛

最后,R5又是如何处理这个ping包的?

回答:ping包到了R5上,因为这还是带有MPLS标签的数据包,所以R5还查LFIB(如下图所示)。

MPLS L3VPN为什么要使用两层MPLS标签?R5上show mpls forwarding-table
MPLS L3VPN为什么要使用两层MPLS标签?R5上show mpls forwarding-table

因为R2上打的内层MPLS标签是5001,所以R5查LFIB后会根据LFIB来执行下一步的处理。由上图可知,R5会弹出所有的MPLS标签(No Label),同时数据包将从Et0/0.56口发出去,下一跳是56.1.1.6,也就是转发给R6。

R5将ping包发给R6,此时的ping包是纯的IP数据包了:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃   ICMP   ┃      D : 172.16.7.6       ┃       S : 10.1.1.1       ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛

此时,数据包就转发到目的地上了。

 

本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。

这篇文章对你有帮助吗?

相关文章

13条评论

  1. lipeng101huawei

    RD值(和VPNv4路由)仅仅只是在控制层面区分路由,数据层面的数据包转发只能靠IPv4路由表、IPv6路由表、FIB(如果开启了IP CEF)和MPLS。
    请问RD值在控制层面都做了什么?
    一直都对控制层面和数据层面存在疑问,能否解释下?

      1. lipeng101huawei

        首先,在控制层面确实是用RD值来区分路由的,但这仅仅只是控制层面,VPNv4路由是没法在数据层面上真正地去做路由转发的
        大神能解读这段话吗?vpnv4有张路由表,为什么这里又说VPNv4路由是没法在数据层面上真正地去做路由转发的?

        1. 很好理解呀,企业的内网是不是有 10.0.0.0/8 这种内网 IPv4 地址,这些 IPv4 地址是没法使用在国际互联网上的,仅能在内网使用;而 VPNv4 路由表是在运营商的路由器上的(企业内部路由器可没有 VPNv4 路由表,只有 IPv4 路由表),那么这些 VPNv4 路由对运营商来说当然是没有用的;数据要想从这个 CE 传递到另一个 CE ,数据层面上可没法直接使用 VPNv4 路由表进行转发,用的是 MPLS 标签。

        2. MPLS L3VPN 的数据包最里面是 IP 包,这个 IP 包的目的 IP 地址就是 10.1.1.1/24 ,外面再加一层 MPLS 标签。如果仅有的一层 MPLS 标签弹出了,那暴露出来的就是 IP 头部,而目的 IP 地址是 10.1.1.1/24 ,所以 R2 还是不知道往哪里转发,到底是去 R1 还是去 R7 ?如果这个 IP 头部的目的地址是 VPNv4 地址那就可以了,可惜不是呀,IPv4 报文格式早就设计好了,目的地址这个字段只能有 32 位。

        3. canye508

          这么理解吧。以本文的拓扑为例,VPNv4路由表仅存在于两个PE之上。和IPv4路由比起来,IPv4路由器是全网路由器都有的,也正是因为全网都有IPv4路由,所以实现了基于IP的转发。然而VPNv4呢,并不是全网路由器都有,所以就没法根据VPNv4路由表来转发。VPNv4路由表,仅仅是为PE提供数据基础,然后根据这些数据去建立到目的PE的LSP,然后使用标签来进行转发。总结:IPv4路由表是IP转发的依据,VPNv4路由表是Label转发的依据。

  2. enze7

    您好Ricky,请教个问题;如果PE1 连接的CE是总公司A;PE2连接的CE1和CE2是分公司B和C,且CE1和CE2都有172.16.1.1/32的网段,那么在总公司ping的时候,CE是怎么决策的呢?会怎么选择内层标签?谢谢
    172.16.1.1/32 3.3.3.3 nolabel/26
    3.3.3.3 nolabel/22

    1. CE1 和 CE2 都有 172.16.1.1/32 的网段?你是说 CE1 和 CE2 都有 172.16.1.1 这个 IP 地址?那不是 IP 地址冲突了么?至于打什么标签主要看路由 172.16.1.1/32 去往哪个 CE 。

      如果 CE1 和 CE2 都有 172.16.1.0/24 的网段,那应该使用 MPLS L2VPN 而不是 MPLS L3VPN 了吧?

      1. enze7

        环回口的地址,是IP地址。但是分别在PE2的两张VRF表里面呀,不存在IP地址的冲突吧,两个分公司都有这个私有IP地址;是不是我们三层的设计上,各自分公司的内网的网段不能重复啊?
        例如分公司1和分公司2都和总公司传路由,分公司1和2就不能出现重复的网段;
        (分公司1的VRF:RT export 200 :200 import 100 :100)
        (分公司2的VRF:RT export 300:300 import 100:100)
        (总公司的VRF: RT export 100:100 import 200:200 import 300:300)
        总公司连PE1;分公司1和2连PE2;分公司都有172.16.0.0 /16 的网段,那么只能用L2是吧

        1. 我给你举一个例子你就明白了。假设你们家有一台 TPLINK 无线路由器,它自身的 IP 地址是 192.168.1.1/24 ,网段就是 192.168.1.0/24 ;你邻居家正好也有一台一模一样的路由器,它自身的 IP 地址也是 192.168.1.1/24 ,网段也是 192.168.1.0/24 。这两台 TPLINK 无线路由器自然是互不冲突的,就好像各个公司之间的内网都是互不冲突的。

          现在你想把你们家的 TPLINK 无线路由器跟邻居家的 TPLINK 无线路由器连到一起(也就是把两个内网打通)。那么你可以用一根网线把这两台 TPLINK 无线路由器连接起来,或者把这两台 TPLINK 无线路由器连到同一台二层交换机上。因为中间是二层交换机(二层交换机也算是等同于用一根网线连接两端)嘛,所以这两台 TPLINK 无线路由器是可以共存在 192.168.1.0/24 这个内网中的,唯一的问题就是 IP 地址冲突,不能两台 TPLINK 无线路由器的 IP 地址都是 192.168.1.1 。中间这台二层交换机就相当于 MPLS L2VPN 。

          那如果这两台 TPLINK 无线路由器连接到同一台三层路由器呢?你需要知道的是,同一台路由器的不同网络接口是不能位于同一个网段的(比如同一台路由器上的 eth1/1 和 eth1/2 接口不能同时位于 192.168.1.0/24 网段)。所以此时两台 TPLINK 无线路由器不仅不能配置同一个 IP 地址,还不能配置在同一个网段。其中一台 TPLINK 无线路由器如果是 192.168.1.1/24 ,那么另一台 TPLINK 无线路由器可能得是 192.168.2.1/24 。中间这台三层路由器就相当于 MPLS L3VPN 。

          我举的这个例子中,这两台 TPLINK 无线路由器其实就是两台 CE 。

          总结一下就是,要想使用 MPLS L3VPN 打通多个内网,那么不仅网段不能冲突,IP 地址也不能冲突。如果使用 MPLS L2VPN 打通多个内网,那么 IP 地址不能冲突即可(因为此时各个公司都位于同一个二层网络,或者说都连接到了同一台二层交换机上,所以此时各个公司之间将处于同一个内网中)。

          你要这么理解,你有一个内网,我有一个内网,现在要把这两个内网通过 VPN 连成一个大的内网,那这两个内网不就变成同一个内网了?自然要考虑 IP 地址冲突的问题呀。RT 就好像 ACL 访问控制列表,只是做控制和策略的,但不能否认他们是同一个内网呀。

        2. 是分别在 PE2 的两张 VRF 表里面,但是两个内网已经打通了(或者说各个分公司和总公司之间已经打通了,对于总公司来说就是 IP 地址冲突的)。就好像 A 国的互联网可以理解成一个巨大的 “ 局域网 ” ,就算是这样我也不能把 B 公司的外网 IP 地址配置在 A 国不同运营商的路由器上,对于需要访问 B 公司这个外网 IP 地址的用户来说也是 IP 地址冲突的。

  3. enze7

    太感谢作者了,豁然开朗,哈哈,向高手致敬!

发表评论?

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