在MPLS L3VPN下,RD值就可以区分路由了,为什么还需要RT值?

首先,我们先回顾一下RD值和RT值的作用分别是什么?

  • RD值(Route Distinguisher):在控制层面区分路由(64bit的RD值 + 32bit的IPv4地址 = 96bit的VPNv4地址)。
    1. RD值与VPN路由一起被携带在BGP Update报文中发送给对端;
    2. RD值不具有选路能力,不影响路由的发送与接收。
  • RT值(Route Target):用来控制VPN路由的导入导出,增加VPN路由导入导出时的灵活性。
    1. 当从VRF表中导出VPN路由时,要用Export RT值对VPN路由进行标记;
    2. 当往VRF表中导入VPN路由时,只有所带RT值与VRF表中任意一个Import RT值相符的路由才会被导入到VRF表中。

接下来,我们会用一个实验拓扑来说明为什么除了需要有RD值以外,还需要有RT值。

MPLS L3VPN Spoke and Hub实验拓扑
MPLS L3VPN Spoke and Hub实验拓扑

在上面的实验拓扑中,有一个企业,它有两个Spoke(分支站点)和一个Hub(总部),Spoke和Hub之间已经实现了MPLS L3VPN通信。

RD值一般有以下两种设置方式:

R1(config)#ip vrf R1
R1(config-vrf)#rd ?
  ASN:nn or IP-address:nn  VPN Route Distinguisher
  1. ASN:nn:32bit的BGP AS号 + 32bit的标识符
  2. IP-address:nn:32bit的可全局路由的IP地址 + 32bit的标识符

如果互联网服务提供商(ISP)按照上面的方法进行设置,那RD值一般都是全局(或者说全球)唯一的。比如,对于AS号为1234的服务提供商来说,它可以为标识符为1的企业提供MPLS L3VPN服务(RD = 1234:1),也可以为标识符为2的企业提供MPLS L3VPN服务(RD = 1234:2),两个企业之间的VPN路由通过RD值区分即可,每个企业都有唯一一个RD值。

那问题来了,上面实验拓扑中的两个Spoke和一个Hub都同属于一个企业,使用RD值就好了呀?为啥还要RT值?

回答:单单使用RD值,确实可以区分路由,但如果想灵活地控制路由导入导出,就不行了。比如现在要实现以下需求:每个Spoke都需要接收来自Hub的路由,但是Spoke和Spoke之间不允许互相接收到对方的路由,而Hub又需要接收所有Spoke的路由。如果单单只有RD值,再根据上述RD值的设置方式,很明显这两个Spoke和一个Hub他们设置的RD值都是相同的(因为同属一个企业),所以就没法灵活地在Spoke和Hub之间做路由的导入导出了。

于是,我们需要引进RT值。那用RT值又该如何完成上述需求呢?

回答:如下图所示,为了在Spoke上能接收来自Hub的路由,我们需要这么做:

  1. 在Hub上,为导出的VPN路由设置Export RT值1:1;
  2. 再在两个Spoke上,导入Hub发来的VPN路由:Import RT值为1:1。
Hub上VPN路由通过RT值导入导出
Hub上VPN路由通过RT值导入导出

现在,两个Spoke上都收到来自Hub的VPN路由了,但我们还需要把Spoke上的路由发给Hub,同时要保证Spoke和Spoke之间不允许互相接收到对方的路由:

  1. 在EIGRP为138的Spoke上,为导出的VPN路由设置Export RT值138:138,
  2. 在EIGRP为249的Spoke上,为导出的VPN路由设置Export RT值249:249,
  3. 再在Hub上,导入两个Spoke发来的VPN路由:Import RT值为138:138和249:249。
Hub上VPN路由通过RT值导入导出
Hub上VPN路由通过RT值导入导出

现在,对上面的RT值的设置做一个汇总:

Import RT Export RT
Hub 138:138和249:249 1:1
EIGRP为138的Spoke 1:1 138:138
EIGRP为249的Spoke 1:1 249:249

由上表可知,Hub上接收到了所有来自Spoke的VPN路由,因为Hub设置的Import RT值为138:138和249:249,而138:138是EIGRP为138的Spoke导出的,249:249是EIGRP为249的Spoke导出的。

同时,两个Spoke都接收到了来自Hub的VPN路由,因为两个Spoke设置的Import RT值为1:1,而1:1是Hub导出的。

最后,两个Spoke之间互相接收不到对方的VPN路由,因为EIGRP为138的Spoke没有导入RT值为249:249的VPN路由,而EIGRP为249的Spoke也没有导入RT值为138:138的VPN路由。

所以,通过RT值就可以灵活地控制VPN路由的导入导出,而RD值仅仅只是为了区分路由。

Was this article helpful?

Related Articles

9 Comments

  1. MMCC

    抱歉楼主。。我想反过来问一下。。既然RT也可以为路由打上标签,而且功能更强大,为什么还要有RD?

    1. 本文中我提到过,每个企业都有唯一一个 RD 值,而 RT 值负责灵活地做路由的导入导出。如果没有 RD 值,就意味着所有的企业都使用同一个 VPN 环境。如果所有的企业的路由都可以放进同一个路由表,而仅仅依靠 RT 值来对路由做导入导出,那么这完全不利于管理 —— 你怎么知道哪一个 RT 值是属于 A 企业的,哪几十甚至几百个 RT 值是属于 B 企业的,这样很容易乱套。用 RD 值就能很好地区分企业(或用户),因为一个企业(或用户)只需要使用一个 RD 值。我们应该先使用 RD 值来区分出企业(或用户),如果企业(或用户)需要灵活导入导出路由才会使用 RT 值。

      总的来说就是先用 RD 值区分出不同的企业(或用户),如果这个企业(或用户)需要进一步的灵活性才会使用 RT 值。

      1. huxincheng

        没有rd值,也不意味着所有企业就在vpn下面吧,我理解纯靠rt值也能区分不同vpn:本身路由在pe之间传播,pe接收路由时就要通过自己的import rt和传递给它的export rt比对确认是否接收并加入对应的vpn实例;
        rd的真正作用,应该是rd+ipv4地址构成了全局唯一的vpnv4路由前缀,在mpbgp网络中,pe1传路由给对等体pe2时,保证了vpnv4路由的唯一性,但这个唯一性到底有没有作用我就不清楚了,在pe上我配置多个vpn实例,哪怕不配rd值,我看路由也是按不同vpn维护各自的路由表,并没有冲突。
        还请指教。

        1. 没有 RD 值确实不意味着所有企业的路由都混在了一起,community 的 RT 是可以区分条目属于哪个 VRF 的。

          没有 RD 值就意味着没有全局唯一的 VPNv4 地址了,这个问题可以转换为为啥要有 VPNv4 地址。RD 主要就是为了做本地区分,不然 BGP 的 RIB( Routing informaiton base )会乱,这涉及到 BGP 的工作方式。

          BGP 收到条目之后,会存到 RIB ,这个时候如果有相同的 prefix ,那么新的会替代掉旧的,之后才会处理 comunity ,comunity 在这个问题里就是 RT 。这是 BGP4 ,也就是老 BGP 协议的工作方式。MPBGP 对 BGP 进行扩展,本质上没有改变 BGP 的工作方式,只是增加了几个地址族,所以 MPBGP 沿用了这个处理方式。

          在 MPLS VPN 中,如果没有 RD ,那么不同 VPN 的相同 prefix ,比如都是 192.168.1.0/24 ,后来的会覆盖先到的,相应的 RT 也会覆盖。比如 192.168.1.0/24 + RT1 先到,192.168.1.0/24 + RT2 后到,那么 RT1 会丢失,MPBGP 的 RIB 里面只会存 192.168.1.0/24 + RT2 ,而 RT1 对应的 VRF 应该会收不到这条路由。

          有了 RD ,在 MPBGP 的 RIB 里面可以区分不同 VPN 的相同 prefix 了。我没有做实验过,你可以试一下?

          1. huxincheng

            感谢分享,所以问题关键在于相同prefix(rd+ipv4)会有后来居上的问题;
            实际配置中,mpbgp下关联vpn的地址族是必须要配置rd值的,而同一台设备又是2个vpn不允许配置一样的rd值,所以不会有不同vpn的prefix前缀一样的情况。
            ipv4地址相同,rd值不同,是可以区分的,我实验过了。

            1. 噢噢,我是说后来的会覆盖先到的,然后导致对应的 VRF 收不到路由的这个问题,我没有做实验验证过。

  2. tarhone

    您好,我想请问mpls的内层标签,也就是通过bgp打的标签,为了去往相应的ce,这个标签实际上是rt吗?或者说bgp为什么还可以打标签呢?这个内层标签pop之后再去看rt么?

    1. 我们先来看看 MPLS 是如何工作的:如果开启了 MPLS ,那么数据包就会通过 MPLS 标签转发而不是通过路由表来转发了,那路由表是不是就没有用了呢?不是的,因为 MPLS 标签是根据路由表来创建的。

      您这个问题也是类似的,控制路由自然需要 RT 值和 RD 值(可理解为控制层面),但数据包在进行转发时看的是 MPLS 标签(可理解为数据层面),而这些 MPLS 内层标签需要根据 RT 值和 RD 值来创建。

      我来回答您的问题:这个 MPLS 内层标签不是 RD 值或 RT 值本身,但它是根据 RT 值和 RD 值来创建的。BGP 属于控制层面,而数据层面靠的是 MPLS ,所以 “ BGP 还可以打标签 ” 。因为 MPLS 内层标签就是根据 RT 值和 RD 值来创建的,所以这个 MPLS 内层标签 POP 后不需要再去看 RT 值或者 RD 值了,此时数据包已经直接转发到对应的 CE 了。

      其实这个问题,在《 MPLS L3VPN 为什么要使用两层 MPLS 标签?》或者在《 MPLS L3VPN 下,PE 会为每条 VPN 路由分配一个MPLS标签,但 PE 也可以为每个 VRF 分配一个 MPLS 标签》中评论会更合适一点。

Leave A Comment?

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