在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

7 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 收不到路由的这个问题,我没有做实验验证过。

Leave A Comment?

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