1、VRF 技术白皮书1 原理简介近年来网络 VPN 技术方兴未艾,日益成为业界关注的焦点。根据 VPN 实现的技术特点,可以把 VPN 技术分为以下三类:传统 VPN:FR 和 ATMCPE-based VPN:L2TP 和 IPSec 等Provider Provisioned VPNs ( PP-VPN ):MPLS L2VPN 和 MPLS L3VPN。本文介绍的 VRF 特性是 MPLS VPN 中经常使用的技术,中文含义为 VPN 路由转发实例。鉴于 VRF 与 MPLS VPN 密切相关,下面首先对 MPLS VPN 作简要介绍。图 1 是一个典型的 MPLS L3VPN 的组网图,
2、运营商通过自己的 IP/MPLS 核心网络为 BLUE 和 YELLOW 两个客户提供 VPN 服务。SITE1 和 SITE3 分别为 VPN BLUE 的两个站点,SITE2 和 SITE4 分别为 VPN YELLOW 的两个站点。VPN BLUE 两个站点内的主机可以互访,但不能访问 VPN YELLOW 内的主机。同样,VPN YELLOW 两个站点内的主机可以互访,但不能访问 VPN BLUE 内的主机。从而实现了两个 VPN 间的逻辑划分和安全隔离。CE 设备的作用是把用户网络连接到 PE,与 PE 交互 VPN 用户路由信息:向 PE 发布本地路由并从 PE 学习远端站点路由。
3、PE 作用是向直连的 CE 学习路由,然后通过 IBGP 与其他 PE 交换所学的 VPN 路由。PE 设备负责 VPN 业务的接入。P 设备是运营商网络中不与 CE 直接相连的设备,只要支持 MPLS 转发,并不能感知到 VPN 的存在。图 1 上面组网中 VPN 的设计思想是很巧妙的,但存在如下几个问题:1、 本地路由冲突问题,即:在 BLUE 和 YELLOW 两个 VPN 中可能会使用相同的 IP 地址段,比如 10.1.1.0/24,那么在 PE 上如何区分这个地址段的路由是属于哪个 VPN 的。2、 路由在网络中的传播问题,上述问题会在整个网络中存在。3、 PE 向 CE 的报文转
4、发问题,当 PE 接收到一个目的地址在 10.1.1.0/24 网段内的 IP 报文时,他如何判断该发给哪个 VPN?针对上述 3 个问题,分别有以下解决方案:1、 为了解决本地路由冲突问题,我们引入了 VRF 的概念:把每台 PE 路由器在逻辑上划分为多台虚拟路由器,即多个 VPN 路由转发实例 VRF,每个 VRF 对应一个 VPN,有自己独立的路由表、转发表和相应的接口。这就相当于将一台各 VPN 共享的 PE 模拟成多台专用 PE。这样 PE 与 CE 交互的路由信息只是该 VPN 的路由,从而实现了 VPN 路由的隔离。由于不同 VPN 的路由存放在不同的 VRF 中,所以 VPN
5、路由重叠的问题也解决了。2、 VPN 重叠路由在网络中的传播问题, 可以在路由传递的过程中为这条路由再添加一个标识,用以区别不同的 VPN。正常的 BGP4 协议只能传递 IPv4 的路由,由于不同 VPN 用户具有地址空间重叠的问题,必须修改 BGP 协议。BGP 最大的优点是扩展性好,可以在原来的基础上再定义新的属性,通过对 BGP 修改,把 BGP4 扩展成 MP-BGP。在 MP-IBGP 邻居间传递 VPN 用户路由时打上 RD 标记等 VPN 信息,这样 CE 传来的 VPN 用户的 IPv4 路由被 PE 转换为 VPN-IPv4 路由,这样就能保证对端 PE 能够区分开属于不同
6、 VPN 用户的地址重叠的路由。3、 PE 向 CE 的报文转发问题, 由于 IP 报文的格式不可更改,没有什么文章可以做,但可以在 IP 头之外加上一些信息(标签),由始发的 VPN 打上标记,这样PE 在接收报文时可以根据这个标记进行转发。每一个 VRF 可以看作一台虚拟的路由器,好像是一台专用的 PE 设备。该虚拟路由器包括如下元素:一张独立的路由表/转发表,当然也包括了独立的地址空间。一组归属于这个 VRF 的接口集合。一组只用于本 VRF 的路由协议。对于每个 PE,可以维护一个或多个 VRF,同时维护一个公网的路由表(也叫全局路由表),多个 VRF 实例相互分离独立。实现 VRF
7、并不困难,关键在于如何在 PE 上使用特定的策略规则来协调各 VRF 和全局路由表之间的关系。在 VRF 中定义的和 VPN 业务有关的两个重要参数是 RT 和 RD,RT 和 RD 长度都是 64bit。RT 是 Route Target 的缩写,RT 的本质是每个 VRF 表达自己的路由取舍及喜好的方式,主要用于控制 VPN 路由的发布和安装策略。分为 import 和 export 两种属性,前者表示了我对那些路由感兴趣,而后者表示了我发出的路由的属性。当 PE 发布路由时,将使用路由所属 VRF 的 RT export 规则,直接发送给其他的 PE 设备。对端 PE 接收路由时,首先接
8、收所有的路由,并根据每个 VRF 配置的 RT 的 import 规则进行检查,如果与路由中的 RT 属性 match,则将该路由加入到相应的 VRF 中。以下图为例:SITE-1:我发的路由是蓝色的,我也只接收蓝色的路由。SITE-2:我发的路由是黄色的,我也只接收黄色的路由。SITE-3:我发的路由是蓝色的,我也只接收蓝色的路由。SITE-4:我发的路由是黄色的,我也只接收黄色的路由。这样,SITE-1 与 SITE-3 中就只有自己和对方的路由,两者实现了互访。同理 SITE-2 与 SITE-4 也一样。这时我们就可以把 SITE-1 与 SITE-3 称为 VPN BLUE,而把 S
9、ITE-2 与 SITE-4 称为 VPN YELLOW。图 2 RD 是 Route Distinguisher 的缩写,是说明路由属于哪个 VPN 的标志。理论上可以为每个 VRF 配置一个 RD,通常建议为每个 VPN 的 VRF 都配置相同的 RD,并且要保证这个 RD 全球唯一。如果两个 VRF 中存在相同的地址,但是由于 RD 不同,这两个路由在 PE 间发布过程中也不会混淆,因为 MP BGP 把 RD 和路由一起发送,对端 PE 可以根据 RD 确定路由所属的 VPN,从而把路由安装到正确的 VRF 中。RD 并不会影响不同 VRF 之间的路由选择以及 VPN 的形成,这些事情
10、由 RT 搞定。PE 从 CE 接收的标准的路由是 IPv4 路由,如果需要发布给其他的 PE 路由器,此时需要为这条路由附加一个 RD。在 IPv4 地址加上 RD 之后,就变成 VPN-IPv4 地址族了。VPN-IPv4 地址仅用于服务供应商网络内部。在 PE 发布路由时添加,在 PE 接收路由后放在本地路由表中,用来与后来接收到的路由进行比较。CE 不知道使用的是 VPN-IPv4 地址。 2 组网应用2.1 VRF 与 MPLS 组合应用下面以图 3 为例说明 MPLS VPN 与 VRF 的典型应用:组网中两个用户站点 SITE1 和 SITE2 属于同一个 VPN,在两个 PE
11、上分别配置 VRF 参数,其中 VRF SITE1 的 RD=100:1,import RT =100:3,export RT =100:2,VRF SITE2 的 RD=100:1,import RT =100:2,export RT =100:3。通过 VRF 的配置可见:两个 VRF 的 RD 同为 100:1,说明他们属于同一个 VPN;VRF SITE1 导入和导出的 RT 分别等于 VRF SITE2 导出和导入的 RT,说明两个 VRF 分别可以接收对方的 VPN 站点内的路由;PE 连接 CE 的接口与 VRF 绑定,说明该接口是属于对于 VRF 的资源,其他 VRF 和公网是
12、看不到的。PE 和 CE 之间可以运行 OSPF、RIP2、EBGP 和静态路由。运营商网络要求为 MPLS 网络,在 PE1 和 PE2 之间建立 LSP,同时 PE1 与 PE2 间通过 MP-IBGP 来传播 VPN 路由。 BGP 和路由协议的相关配置请参考 VRP 操作手册和命令手册。图 3 VPN SITE1 内的一条路由 10.10/16 被通告到 VPN SITE2 的过程如下:PE1 从接口 S0/0 上学习到由 CE1 通告的 10.10.0.0/16 的路由,由于 S0/0 是绑定到 VRF 的接口,所以 PE1 把该路由安装到对应 VRF 的路由表中,并且分配该路由的本
13、地标签,注意该标签是本地唯一的。然后通过路由重新发布把 VRF 路由表中的路由重新发布到 BGP 中,此时通过附加 VRF 表的 RD、RT 参数,把正常的 IPv4 路由变成 VPN-IPv4 路由,如10.10.0.0/16 变成 100:1:10.10.0.0/16,同时把 export RT 值和该路由的本地标签值等信息一起通过 MP-IBGP 会话通告给 PE2。PE2 收到这条 VPN-IPv4 路由后,先根据 RD 确定该路由所属的 VRF,然后去掉 VPN-IPv4 路由所带的 RD 值,使之恢复 IPv4 路由原貌,并且根据所属 VRF 配置的导入策略( 本地 Import
14、RT 与收到的 export RT 是否一致)决定是否在本地 VRF 中安装此路由。本例中导入策略允许,所以 PE2 把 10.10.0.0/16 路由添加到 VRF 路由表中,同时记录对应的标签。PE2 再通过 CE 和 PE 之间的路由协议,把 10.10.0.0/16 路由通过与 VRF 绑定的接口 S0/1 通告出去,CE2 学习到这条路由后把该路由添加到路由表中。同样的道理 SITE2 内的路由 10.11.0.0/16 也可以被 CE1 学到。下面说明从 CE2 Ping 10.10.0.0/16 时数据报文的转发过程(假设 PE1 为该路由分配的标签为 10,从 PE2 到 PE
15、1 的 LSP 标签分别为 L1、L2):图 4 首先 Ping 包从 CE2 发出,为 IPv4 报文,在图中用绿色方块标识。当 IP 报文到达 PE2 时,PE2 根据目的地址查找 VRF 的转发表,发现该路由出标签为 10,同时该路由下一跳为 PE1,而 PE1 对应的 LSP 标签为 L1,于是 PE2 给报文分别打上 10、L1 作为内外层标签,进行 MPLS 转发。MPLS 报文到达 P 时,P 根据 MPLS 转发表项把外层标签替换为 L2 继续转发。MPLS 报文到达 PE1 时,因为 PE1 是 LSP 的终点,所以外层标签被剥掉。 PE1 根据露出的内层标签 10 判断出该
16、报文是发往 SITE1 所属 VPN 的报文。于是 PE1剥掉内层标签向 CE1 转发 IP 报文。CE1 收到的是还原后的 IP 报文,后续处理与正常 IP 处理流程一样,这里不再赘述。2.2 VRF lite 特性应用尽管 VRF 经常与 MPLS 一起使用,但 VRF 也可以脱离 MPLS 单独应用。VRF lite 就是典型例子。VRF lite 就是在 CE 设备上支持 VRF。图 5 所示为典型 MPLS VPN 组网中用户侧网络,一个企业分支内部的三个部门要求相互隔离,分别通过一台 CE 连接到 PE,形成一个 VPN。可见,该分支机构需要三台出口路由器,三条链路与 PE 连接;
17、同时 PE 需要为一个企业用户提供三个接口,这将带来端口、链路资源的浪费,直接导致成本与支出的增加。图 5 针对这种情况,我们引入 VRF lite 特性来解决问题,即在 CE 上配置 VRF 特性。具体组网如图 6 所示:此时企业分支只需要一台 CE 路由器与 PE 相连,在 CE 上配置 VRF,CE 连接三个部门的接口分别与 VRF 绑定。同时 CE 只需要一条物理链路与 PE 相连,并通过链路的子接口分别与 VRF 绑定,完成 CE 与 PE 上对应 VRF 的逻辑连接。PE 与 CE 可以在各个 VRF 中运行动态路由协议完成 VPN 路由交换。PE 上的配置和图 5 中的一样,需要
18、配置 VRF 和 MP-IBGP。图 6 这种方案的优点有:只需要一个 CE,比多 CE 情况简化了网络的配置和管理;PE 与 CE 间只需一条物理链路;节省了 PE 端口资源;允许企业内部不同部门间的地址重叠;3 应用场合VRF 特性用于实现 VPN 的需求,可以与 MPLS 配合使用,也可以单独组网应用4 配置举例4.1 VRF 与 MPLS 组合应用图 3 所示的组网配置如下:CE1 配置:# sysname CE1 # domain system # controller T3 3/0 using t3 # interface Aux0 async mode flow # interf
19、ace Ethernet0/0 /*连接 site1 内的网络 */ip address 10.10.0.1 255.255.0.0 # interface Ethernet0/1 # interface Serial3/0/0 link-protocol ppp ip address 100.10.0.1 255.255.0.0 # interface NULL0 # interface LoopBack9 ip address 28.40.1.1 255.255.255.255 # ospf 1 import-route direct area 0.0.0.0 network 100.10
20、.0.0 0.0.255.255 # user-interface con 0 idle-timeout 0 0 user-interface aux 0 user-interface vty 0 4 # returnPE1 配置:# sysname PE1# mpls lsr-id 28.40.1.2 # /*公网运行 MPLS*/mpls # mpls ldp # /*VRF 配置*/ip vpn-instance site1 route-distinguisher 100:1 vpn-target 100:2 export-extcommunity vpn-target 100:3 im
21、port-extcommunity # domain system # controller T3 3/0 using t3 # interface Aux0 async mode flow # interface Ethernet0/0 /*连接 P 的接口*/ip address 172.16.32.59 255.255.0.0 mplsmpls ldp enable# interface Ethernet0/1 # interface Serial0/0 /*连接 CE 的接口*/ ip binding vpn-instance site1link-protocol ppp ip add
22、ress 100.10.0.2 255.255.0.0 # interface NULL0 # interface LoopBack9 ip address 28.40.1.2 255.255.255.255 # bgp 100 /*配置 MP iBGP*/ undo synchronization group in100 internal peer in100 connect-interface LoopBack9 peer 46.80.1.1 group in100 /*46.80.1.1 是 PE2 的 loopback 口地址*/ # ipv4-family vpn-instance
23、blue import-route direct import-route ospf undo synchronization # ipv4-family vpnv4 peer in100 enable peer 46.80.1.1 group in100 # ospf 1 /*IP 网络上跑 OSPF*/ import-route direct area 0.0.0.0 network 172.16.0.0 0.0.255.255 # ospf 100 vpn-instance site1 /*VRF 中运行 OSPF,与 CE 交换路由*/ import-route direct area
24、 0.0.0.0 network 100.10.0.0 0.0.255.255 # user-interface con 0 idle-timeout 0 0 user-interface aux 0 user-interface vty 0 4 # return 说明:PE2 和 CE2 的配置与 PE1 和 CE1 类似,此处不再列出。关于 BGP 和 MPLS 的配置,请参考操作手册和命令手册4.2 VRF lite 特性应用图 6 中各路由器的配置如下CE 的配置:# sysname CE # ip vpn-instance MRT /*VRF MRT */route-distingu
25、isher 100:1 vpn-target 100:1 export-extcommunity vpn-target 100:1 import-extcommunity # ip vpn-instance RD /*VRF RD */route-distinguisher 200:1 vpn-target 200:1 export-extcommunity vpn-target 200:1 import-extcommunity # ip vpn-instance HR /*VRF HR */route-distinguisher 300:1 vpn-target 300:1 export-
26、extcommunity vpn-target 300:1 import-extcommunity # domain system # local-user admin # interface Aux0 async mode flow # interface Ethernet0/0ip address 110.11.0.2 255.255.0.0 /*连接 MRT 部门*/# interface Ethernet0/1 ip address 110.12.0.2 255.255.0.0 /*连接 RD 部门*/# interface Ethernet2/0 ip address 110.13.
27、0.2 255.255.0.0 /*连接 HR 部门*/# interface Ethernet2/1 # interface Ethernet2/1.1 /*VRF MRT 的子接口*/ip binding vpn-instance MRT ip address 11.11.0.2 255.255.0.0 vlan-type dot1q vid 1 # interface Ethernet2/1.2 /*VRF RD 的子接口*/ip binding vpn-instance RD ip address 11.12.0.2 255.255.0.0 vlan-type dot1q vid 2
28、# interface Ethernet2/1.3 /*VRF HR 的子接口*/ip binding vpn-instance HR ip address 11.13.0.2 255.255.0.0 vlan-type dot1q vid 3 # interface Serial1/0 link-protocol ppp ip address ppp-negotiate # interface NULL0 # ospf 1 vpn-instance MRT /*VRF MRT 与 PE 跑 ospf*/import-route direct area 0.0.0.0 network 11.1
29、1.0.0 0.0.255.255 # ospf 2 vpn-instance RD /* VRF RD 与 PE 跑 ospf */import-route direct area 0.0.0.0 network 11.12.0.0 0.0.255.255 # ospf 3 vpn-instance HR /* VRF HR 与 PE 跑 ospf */import-route direct area 0.0.0.0 network 11.13.0.0 0.0.255.255 # user-interface con 0 user-interface aux 0 user-interface
30、 vty 0 4 authentication-mode scheme # returnPE 的配置:# sysname 2840 # mpls lsr-id 28.40.0.1 # mpls # mpls ldp # ip vpn-instance MRT /* VRF MRT */route-distinguisher 100:1 vpn-target 100:1 export-extcommunity vpn-target 100:1 import-extcommunity # ip vpn-instance RD /* VRF RD */route-distinguisher 200:
31、1 vpn-target 200:1 export-extcommunity vpn-target 200:1 import-extcommunity # ip vpn-instance HR /* VRF HR */route-distinguisher 300:1 vpn-target 300:1 export-extcommunity vpn-target 300:1 import-extcommunity # interface Aux0 async mode flow # interface Ethernet0/0 ip address 172.16.0.2 255.255.0.0
32、mpls mpls ldp enable # interface Ethernet0/1 ip address 11.13.0.1 255.255.0.0 # interface Ethernet0/1.1 /* VRF MRT 的子接口*/ip binding vpn-instance MRT ip address 11.11.0.1 255.255.0.0 vlan-type dot1q vid 1 # interface Ethernet0/1.2 /* VRF RD 的子接口*/ip binding vpn-instance RD ip address 11.12.0.1 255.25
33、5.0.0 vlan-type dot1q vid 2 # interface Ethernet0/1.3 /* VRF HR 的子接口*/ip binding vpn-instance HR ip address 11.13.0.1 255.255.0.0 vlan-type dot1q vid 3 # interface NULL0 # interface LoopBack0 ip address 28.40.0.1 255.255.255.255 # bgp 10 /*BGP*/undo synchronization group 10 internal peer 10 connect-
34、interface LoopBack0 peer 28.80.0.1 group 10 /*28.80.0.1 为对端 PE lsrid*/# ipv4-family vpn-instance MRT import-route direct import-route ospf-ase 2 undo synchronization # ipv4-family vpn-instance RD import-route direct import-route ospf-ase 3 undo synchronization # ipv4-family vpn-instance HR import-route direct import-route ospf 4 undo synchronization # ipv4-family vpnv4