基本原理
私网标签分配
在BGP/MPLS IP VPN中,PE通过MP-BGP发布私网路由给骨干网的其他相关的PE前,需要为私网路由分配MPLS标签(私网标签)。当数据包在骨干网传输时,携带私网标签。
- 基于路由的MPLS标签分配:为VPN路由表的每一条路由分配一个标签(one label per route)。这种方式的缺点是:当路由数量比较多时,设备入标签映射表ILM(Incoming Label Map)需要维护的表项也会增多,从而提高了对设备容量的要求。
- 基于VPN实例的MPLS标签分配:为整个VPN实例分配一个标签,该VPN实例里的所有路由都共享一个标签。使用这种分配方法的好处是节约了标签。
MP-BGP为私网路由分配标签的前提是PE上使能MPLS功能。
私网路由交叉
两台PE之间通过MP-BGP传播的路由是VPNv4路由。当接收到VPNv4路由,PE先进行如下处理:
检查其下一跳是否可达。如果下一跳不可达,该路由被丢弃。
对于RR发送过来的VPNv4路由,如果收到的路由中cluster_list包含自己的cluster_id,则丢弃这条路由。
进行BGP的路由策略过滤,如果不通过,则丢弃该路由。
之后,PE把没有丢弃的路由与本地的各个VPN实例的Import Target属性匹配。VPNv4路由与本地VPN实例的Import VPN-Target进行匹配的过程称为私网路由交叉。
PE上有种特殊的路由,即来自本地CE的属于不同VPN的路由。对于这种路由,如果其下一跳直接可达或可迭代成功,PE也将其与本地的其他VPN实例的Import Target属性匹配,该过程称为本地交叉。例如:CE1所在的Site属于VPN1,CE2所在的Site属于VPN2,且CE1和CE2同时接入PE1。当PE1收到来自CE1的VPN1的路由时,也会与VPN2对应的VPN实例的Import Target属性匹配。
为了能够将报文正确转发出去,BGP设备必须先找到一个直接可达的地址,通过这个地址到达路由表中指示的下一跳。在上述过程中,去往直接可达地址的路由被称为依赖路由,BGP路由依赖于这些路由指导报文转发。根据下一跳地址找到依赖路由的过程就是路由迭代。
公网隧道迭代
为了将私网流量通过公网传递到另一端,需要有一条公网隧道承载这个私网流量。因此私网路由交叉完成后,需要根据目的IPv4前缀进行路由迭代,查找合适的隧道(本地交叉的路由除外);只有隧道迭代成功,该路由才被放入对应的VPN实例路由表。将路由迭代到相应的隧道的过程叫做隧道迭代。
隧道迭代成功后,保留该隧道的标识符(Tunnel ID),供后续转发报文时使用。Tunnel ID用于唯一标识一条隧道。VPN报文转发时根据Tunnel ID查找对应的隧道,然后从隧道上发送出去。
私网路由的选择规则
经过路由交叉和隧道迭代的路由并不是全部被放入VPN实例路由表。从本地CE收到的路由和本地交叉路由也不是全部被放入VPN实例路由表。
对于到同一目的地址的多条路由,如果不进行路由的负载分担,按如下规则选择其中的一条:
同时存在直接从CE收到的路由和交叉成功后的同一目的地址路由,则优选从CE收到的路由。
同时存在本地交叉路由和从其他PE接收并交叉成功后的同一目的地址路由,则优选本地交叉路由。
对于到同一目的地址的多条路由,如果进行路由的负载分担,则:
优先选择从本地CE收到的路由。只有一条从本地CE收到的路由而有多条交叉路由的情况下,也只选择从本地CE收到的路由。
只在从本地CE收到的路由之间分担或只在交叉路由之间分担,不会在本地CE收到的路由和交叉路由之间分担。
负载分担的AS_PATH属性必须完全相同。
BGP/MPLS IP VPN的路由发布
基本BGP/MPLS IP VPN组网中,VPN路由信息的发布涉及CE和PE,P设备只维护骨干网的路由,不需要了解任何VPN路由信息。PE设备一般维护所有VPN路由。
VPN路由信息的发布过程包括三部分:本地CE到入口PE、入口PE到出口PE、出口PE到远端CE。完成这三部分后,本地CE与远端CE之间建立可达路由,VPN路由信息能够在骨干网上发布。
下面分别对这三部分进行介绍。
本地CE到入口PE的路由信息交换
CE与直接相连的PE建立邻居或对等体关系后,把本站点的IPv4路由发布给PE。CE与PE之间可以使用静态路由、RIP(Routing Information Protocol)、OSPF(Open Shortest Path First)、IS-IS(Intermediate System to Intermediate System)或BGP(Border Gateway Protocol)。无论使用哪种路由协议,CE发布给PE的都是标准的IPv4路由。
入口PE到出口PE的路由信息交换
PE从CE学到VPN路由信息后,存放到VPN实例中。同时,为这些标准IPv4路由增加RD,形成VPN-IPv4路由。
入口PE通过MP-BGP的Update报文把VPN-IPv4路由发布给出口PE。Update报文中携带Export VPN Target属性及MPLS标签。
出口PE收到VPN-IPv4路由后,在下一跳可达的情况下进行路由交叉、隧道迭代和路由优选,决定是否将该路由加入到VPN实例的路由表。被加入到VPN路由表的路由,本地PE为其保留如下信息以供后续转发报文时使用:
MP-BGP Update消息中携带的MPLS标签值
Tunnel ID
出口PE到远端CE的路由信息交换
远端CE有多种方式可以从出口PE学习VPN路由,包括静态路由、RIP、OSPF、IS-IS和BGP,与本地CE到入口PE的路由信息交换相同。此处不再赘述。值得注意的是,出口PE发布给远端CE的路由是普通IPv4路由。
下面以图2-7(PE-CE之间使用BGP,公网隧道为LSP)为例,说明将CE2的一条路由发送到CE1的过程。
在CE2的BGP IPv4单播地址族下引入IGP(Interior Gateway Protocol)路由。
CE2将该路由随EBGP的Update消息一起发布给Egress PE。Egress PE从连接CE2的接口收到Update消息,把该路由转化为VPN IPv4路由,加入对应的VPN实例路由表。
Egress PE为该路由分配MPLS标签,并将标签和VPN IPv4路由信息加入MP-IBGP的Update消息中的NLRI字段中,Export-RT属性加入MP-BGP Update消息的扩展团体属性字段中,将Update消息发送给Ingress PE。
Ingress PE对该路由进行路由交叉。交叉成功则根据路由目的IPv4地址进行隧道迭代,查找合适的隧道。如果迭代成功,则保留该隧道的Tunnel ID和标签,并将路由加入该VPN实例路由表。
Ingress PE把该路由通过BGP Update消息发布给CE1。此时路由是普通IPv4路由。
CE1收到该路由后,把该路由加入BGP路由表。通过在IGP中引入BGP路由的方法可使CE1把该路由加入IGP路由表。
上面过程只是将CE2的路由发布给CE1。要实现CE1与CE2的互通,还需要将CE1的路由发布给CE2,其过程与上面的步骤类似,此处不再赘述。
BGP/MPLS IP VPN的报文转发
- 第一层(公网)标签在骨干网内部进行交换,指示从PE到对端PE的一条LSP。VPN报文利用这层标签,可以沿LSP到达对端PE;
- 第二层(私网)标签在从对端PE到达CE时使用,指示报文应被送到哪个Site,或者更具体一些,到达哪一个CE。这样,对端PE根据内层标签可以找到转发报文的接口。
特殊情况下,属于同一个VPN的两个Site连接到同一个PE,这种情况下只需要知道如何到达对端CE。
以图2-8为例说明BGP/MPLS IP VPN报文的转发过程。图2-8是CE1发送报文给CE2的过程。其中,I-L表示内层标签,O-L表示外层标签。
CE1发送一个VPN报文。
Ingress PE从绑定了VPN实例的接口上接收VPN数据包后进行如下操作:
先根据绑定的VPN实例的RD查找对应VPN的转发表。
匹配目的IPv4前缀,查找对应的Tunnel ID。
将报文打上对应的标签(I-L),根据Tunnel-ID找到隧道。
将报文从隧道发送出去。此例的隧道是LSP,则打上公网(外层)MPLS标签头(O-L1)。
接着,该报文携带两层MPLS标签穿越骨干网。骨干网的每台P设备都对该报文进行外层标签交换。
P2收到该携带两层标签的报文,交给MPLS协议处理。由于使能了倒数第二跳弹出功能,MPLS协议将去掉外层标签(O-L2),将携带内层标签的报文发送给Egress PE。
此时Egress PE就可以看见内层标签,发现该标签处于栈底,将内层标签剥离。
Egress PE将报文从对应出接口发送给CE2。此时报文是个纯IP报文。
这样,报文就成功地从CE1传到CE2了。CE2按照普通的IP转发过程将报文传送到目的地。