www.xahztx.com
BGP&MPLS IP VPN基本原理
一.MP-BGP
VPN为什么使用MP-BGP
前面提过,传统的BGP-4(RFC1771)只能管理IPv4的路由信息,无法正确处理地址空间重叠的VPN的路由。
为了正确处理VPN路由,VPN使用RFC2858(Multiprotocol Extensions for BGP-4)中规定的MP-BGP,即BGP-4的多协议扩展。MP-BGP实现了对多种网络层协议的支持,在Update报文中,将网络层协议信息反映到NLRI(Network Layer Reachability Information)及Next Hop。
MP-BGP采用地址族(Address Family)来区分不同的网络层协议,既可以支持传统的IPv4地址族,又可以支持其它地址族(比如VPN-IPv4地址族、IPv6地址族等)。关于地址族的一些取值可以参考RFC1700(Assigned Numbers)。
说明:VRP实现多种MP-BGP扩展应用,包括对VPN的扩展、对IPv6的扩展等,不同的扩展应在各自的地址族视图下配置。默认情况下,对于IPv4地址族,只要指定了对等体的地址及其所在的AS,本端就自动具备与对等体建立会话能力。但是对于其他地址族,需要手工使能。
MP-BGP能够在PE路由器之间传播VPN组成信息和VPN-IPv4路由,是通过在BGP中引入扩展团体属性来实现的。
MP-BGP中引入了两个新的路径属性: MP_REACH_NLRI MP_UNREACH_NLRI
这两个属性都是可选非过渡(Optional non-transitive)的,不提供多协议能力的BGP发言者将忽略这两个属性的信息,不把它们传递给其它邻居。因此,在VPN中,提供多协议能力的PE设备将把VPN路由信息通过MP-BGP发布给具备该能力的对端PE或作为ASBR的PE。不具备该能力的其他BGP对等体将忽略该属性,也就不会识别和保存VPN路由信息。
说明可选非过渡是BGP的一种属性类型。如果BGP路由器不支持此类属性,则相应的Update消息会被忽略,且不会通告给其他对等体。
下面介绍这两个属性:
二.MP_REACH_NLRI
MP_REACH_NLRI(Multiprotocol Reachable NLRI),即多协议可达NLRI,用于发布可达路由及下一跳信息。该属性由一个或多个三元组<地址族信息、下一跳信息、网络可达性信息>组成,格式如下:
www.xahztx.com
图1-1 MP_REACH_NLRI属性的格式
地址族信息域 ( 3 字节 )下一跳信息域 ( 可变长度 )网络可达性信息域 ( 可变长度 )
1.地址族信息(Address Family Information)域:由2字节的地址族标识AFI(Address Family Identifier)和1字节的子地址族标识SAFI(Subsequent Address Family Identifier)组成。
?
AFI标识网络层协议,对应RFC1700的“Address Family Number”所定义的地址族值。例如IPv4的值是1,IPv6的值是2。 SAFI表示NLRI的类型。
?
AFI值为1,SAFI值为128表示NLRI中的地址为MPLS-labeled VPN-IPv4地址。
2.下一跳信息(Next Hop Network Address Information)域:由一字节的下一跳网络地址长度和可变长度的下一跳网络地址组成。下一跳网络地址是指去往目的系统的路径上的下一个路由器网络地址。MP-BGP中,BGP发言者在向EBGP对等体发布MP_REACH_NLRI属性时,会把下一跳网络地址设置为本地与对端连接的接口地址。BGP发言者在向IBGP对等体发布MP_REACH_NLRI属性时,保持下一跳网络地址不变。 3.网络层可达性信息(NLRI)域:由一个或多个三元组<长度、标签、前缀>组成。其格式如下:
图1-2 携带标签的NLRI格式
长度域 ( 1 字节 )标签域 ( 可变长度 )前缀域 ( 可变长度 )
? ?
长度域:标签域和前缀域的总比特数。
标签域:标签域由一个或多个标签组成,每个标签长度为3字节。标签的格式
与MPLS中定义的一样,最高位表示是否为栈底,接下来三位为0,后面20位是标签值。关于标签的详细介绍请参见《VRP 特性描述 MPLS》。 前缀域:在BGP/MPLS IP VPN中,前缀域由RD和IPv4地址前缀组成。
?
当两个PE(或ASBR PE)之间交换VPN路由信息时,在Update消息中携带MP_REACH_NLRI属性。一
个Update消息可以携带多条具有相同路由属性的可达路由信息。
三.MP_UNREACH_NLRI
MP_UNREACH_NLRI(Multiprotocol Unreachable NLRI),即多协议不可达NLRI,用于通知对等体删除不可达的路由。该属性的格式如下:
www.xahztx.com
图1-3 MP_UNREACH_NLRI属性的格式
地址族标识 ( 2 字节 )子地址族标识 ( 1 字节 )撤销路由 ( 可变长度 )
1.地址族标识AFI:与MP_REACH_NLRI属性中的相同,用于标识网络层协议,对应RFC1700的“Address Family Number”所定义的地址族值。
2.子地址族标识SAFI:与MP_REACH_NLRI属性中的相同,表示NLRI的类型。
3.撤销路由(Withdrawn Routes):不可达路由列表,也是由一个或多个NLRI组成。BGP发言者可以通过在撤销路由域中携带与之前发布的可达路由中相同的NLRI来撤销路由。
BGP发言者通过携带MP_UNREACH_NLRI属性的Update消息来撤销VPN-IPv4路由。一个Update消息可以携带多条不可达路由信息。
当撤销路由时,如果指定了标签,只有指定的标签被撤销;如果没有指定标签,只有不带标签的路由被撤销。
携带MP_UNREACH_NLRI属性的Update消息不再携带其他路径属性。因为不同的路径分配的标签不同,对端只需根据标签来删除对应的路由。
三.MP-BGP能力协商
BGP路由器通过Open消息协商能力,通过查看OPEN消息中的能力参数来确定对等体所具有的能力(如使用多协议扩展来携带标签映射信息的能力)。BGP路由器如果支持某功能,并且确定对方也具备该能力,那么该BGP路由器将使用该功能与对等体交互。
Open消息包含可选的能力协商参数Capabilities,由一个或多个三元组
图1-4 BGP可选能力协商参数格式
Capability Code ( 1 bytes )Capability Length ( 1 bytes )Capability Value ( variable )
1.Capability Code:唯一标识了该能力的类型。该值为1表示BGP发言者具备MP-BGP能力。 2.Capability Length:表示能力值域的长度。MP-BGP能力参数中,能力值域的长度为4。
3.Capability Value:能力值域,可变长度,决定于Capability Code。MP-BGP能力参数中,能力值域的格式如图1-5。其中,
? ?
AFI(2字节)和SAFI(1字节)的含义与MP_REACH_NLRI中的相同。 Res.为保留域(1字节)。发送方应将其置0;接收方应忽略该域信息。
www.xahztx.com
图1-5 MP-BGP能力值域的格式
AFIRes.SAFI
目前BGP不支持动态能力协商。BGP发言者发布了一个携带可选能力参数后,
1.如果收到对端回应的Notification消息,表明对端不支持能力发布。此时BGP发言者将中断与该对等体的会话,发送一个不携带任何可选能力参数的Open消息,试图重新建立BGP连接。
2.如果对端支持能力发布,但该可选能力参数是未知的或不支持的,则协商失败。此时BGP发言者将中断与该对等体的会话,发送一个不携带该可选能力参数的Open消息(可能还携带其他可选能力参数),试图重新建立BGP连接。
因此BGP能力的变化,如使能或禁止标签路由能力、使能或禁止某地址族能力(如IPv4、IPv6、VPNv4、VPNv6)、使能GR能力等,BGP发言者都会中断与该邻居的会话,之后重新进行邻居能力协商。
BGP路由交互的条件
MP-BGP对等体之间进行路由交互,必须具备如下条件: 1.MP-BGP对等体之间有互相到对方的可达路由
BGP的运行是通过消息驱动的,这些消息通过TCP协议进行传播(端口号是179)。为了在对等体之间建立TCP连接,MP-BGP对等体之间必需有到对方的可达路由。
BGP对等体不一定就是相邻的路由器,利用逻辑链路也可以建立BGP对等体关系。为了增强BGP连接的稳定性,使用32位掩码的Loopback接口地址建立连接。
BGP不会自己去发现和计算AS内部的路由信息,一般通过引入IGP路由、静态配置的路由或直连路由到BGP路由表中。
MP-BGP对等体之间建立和维持BGP会话连接
Open消息是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间才进行其他类型消息的交换。因此MP-BGP对等体之间必须建立和维持BGP会话连接。
四.VPN-IPv4路由更新请求
以下几种情况,PE设备需要向对等体请求重传BGP Update消息来刷新路由:
? ? ?
本端入口策略发生变化
本端新增或删除VPN-Instance实例
本端VPN-Instance的VPN-Target属性的添加或删除
当需要向对等体请求重传BGP Update消息时,PE向已经和自己成功进行能力协商的邻居发送Route Refresh消息,其中携带AFI和SAFI。
邻居收到Route-Refresh消息会重传满足特定AFI和SAFI的所有路由。
www.xahztx.com
五.PE上的VPN路由选择
私网路由交叉
两台PE之间通过MP-BGP传播的路由是VPNv4路由。当接收到VPNv4路由,PE先进行如下处理: 1.检查其下一跳是否可达。如果下一跳不可达,该路由被丢弃。
2.对于RR发送过来的VPNv4路由,如果本地已有该路由,需检查其Cluster ID是否相同。如果相同,丢弃该路由。
3.进行BGP的路由策略过滤,如果不通过,拒丢弃该路由。
之后,PE把没有丢弃的路由与本地的各个VPN实例的Import Target属性匹配。 VPNv4路由与本地VPN实例的VPN-Target进行匹配的过程称为私网路由交叉。PE在收到VPNv4路由后,既不进行优选,也不检查隧道是否存在,直接将其与本地的VPN实例进行交叉。
PE上有种特殊的路由——来自本地CE的属于不同VPN的路由。对于这种路由,如果其下一跳直接可达或可迭代成功,PE也将其与本地的其他VPN实例的Import Target属性匹配,该过程称为本地交叉。要使本地交叉成功,需要在被交叉的路由所属VPN对应的BGP-VPN实例地址族下引入直连路由。
说明为了能够将报文正确转发出去,BGP路由器必须先找到一个直接可达的地址,通过这个地址到达路由表中指示的下一跳。在上述过程中,去往直接可达地址的路由被称为依赖路由,BGP路由依赖于这些路由指导报文转发。根据下一跳地址找到依赖路由的过程就是路由迭代。
在PE上执行display ip routing-table vpn-instance vpn-instance-name verbose命令可查看该PE上交叉成功的私网路由和来自本地CE的路由。该命令的显示结果中,只有对应的状态带有“Active”的路由才被放入VPN实例路由表。VPN实例路由表的查看方法是执行不带参数verbose的display ip routing-table vpn-instance vpn-instance-name命令。
隧道迭代
为了将私网流量通过公网传递到另一端,需要有一条公网隧道承载这个私网流量。因此私网路由交叉完成后,需要根据目的IPv4前缀进行路由迭代,查找合适的隧道(本地交叉的路由除外);只有隧道迭代成功,该路由才被放入对应的VPN实例路由表。将路由迭代到相应的隧道的过程叫做隧道迭代。
隧道迭代成功后,保留该隧道的标识符(Tunnel ID),供后续转发报文时使用。Tunnel ID用于唯一标识一条隧道。VPN报文转发时根据Tunnel ID查找对应的隧道,然后从隧道上发送出去。
display ip routing-table vpn-instance vpn-instance-name verbose命令的显示结果中,路由的状态带有“GotQ”表示隧道迭代成功;带有“WaitQ”表示隧道迭代不成功。隧道迭代成功的交叉路由对应的隧道标识符(Tunnel ID)不为0x0。如果交叉路由的隧道标识符为0x0,表示隧道迭代不成功。去往本地CE的报文不从隧道转发,因此本地CE路由和本地交叉路由对应的隧道标识符都是0x0。
私网路由的选择规则
经过路由交叉和隧道迭代的路由并不是全部被放入VPN实例路由表。从本地CE收到的路由和本地交叉路由也不是全部被放入VPN实例路由表。
对于到同一目的地址的多条路由,如果不进行路由的负载分担,按如下规则选择其中的一条: