BGP是个复杂而又庞大的距离矢量类型动态路由协议。与RIP、OSPF、IS-IS路由协议属于内部网关协议(IGP)不同,BGP路由协议属于外部网关协议(EGP)。BGP本身不产生路由,而是通过引入其他类型的路由在对等体中间传播的。所以BGP路由协议解决的不再是同一AS不同路由器之间的选路问题,而是解决不同AS之间的选路问题(也可在同一AS内部路由器上运行,称之为IBGP),这也正是BGP路由协议广泛应用于广域网的根本原因。
BGP基础
BGP(Border Gateway Protocol,边界网关协议)是一种实现AS(自治系统)之间路由的距离矢量性动态路由协议。
一、BGP简介
1982年,EGP被用于在AS之间动态交换路由信息,但EGP只发布网络可达的路由信息,不对路由信息进行优选,同时没有考虑环路避免等问题。
BGP是用于取代最初的EGP而设计的另外一种外部网关协议。BGP能够进行路由优选、避免路由环路、更高效的传递路由和维护大量的路由。早期发布3个版本分别是BGP-1(RFC1105)、BGP-2(RFC1163)、BGP-3(RFC1267)。1994年使用BGP-4(RFC1771);2006年之后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络使用的版本是MP-BGP(RFC4760);再后来BGP-4+提供了对IPv6单播网络的支持,用于控制IPv6单播网络中路由的传播和选择。
在BGP视图下的配置将对BGP-4、BGP-4+和MP-BGP同时生效,缺省情况下,在BGP IPv4单播地址族视图下配置的命令也可在BGP视图下直接配置,但只对BGP4生效。
虽然BGP用于在AS之间传递路由信息,但并不是所有AS之间传递路由信息都需要运行BGP。在一些网络出口比较单一的AS边界,可以用更为简单的静态路由来配置。
1、BGP中的AS
AS是指在一个组织机构管辖下的拥有相同选路策略的IP网络。BGP网络中的每个AS都被分配了一个唯一的AS号,用于区分不同的AS。BGP中的AS号分为2字节AS号和4字节AS号,其中2字节AS号的范围为1~65535的整数,4字节AS号范围为1~4294967295的整数,属于扩展AS号。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。
2、BGP分类
BGP按照运行方式分为EBGP(External/Exterior BGP,外部BGP)和IBGP(Internal BGP,内部BGP)。
①EBGP:运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发来的路由时,会将路由信息AS_Path列表中带有本地AS号的路由丢弃。
②IBGP:运行于同一AS内部的BGP称为IBGP。为防止AS内产生环路,BGP设备不将从IBGP对等体学习到的路由发布给其他IBGP对等体。缺省需要与所有IBGP对等体建立全连接才能实现AS内部各IBGP设备间的路由互通。为了解决现实网络中多数情况下AS内部各IBGP设备间很难实现全连接的问题,BGP提供了“路由反射器”和“联盟”两种解决方案。
如果在AS内一台BGP设备收到EBGP对等体发送的路由后,需要通过另一台BGP设备将该条路由信息传播给其他AS时,则建议将这两台BGP设备配置运行IBGP。如上图,位于AS200中的R1收到EBGP对等体R3发送的路由后,希望把这条路由信息通过R2传播到AS300中,所以R1与R2要配置为运行IBGP。实际上就是让他们成为IBGP对等体。由此可见IBGP对等体不一定就是直接连接的。
3、两种BGP报文交互角色
BGP报文交互中分为Speaker和Peer两种角色。
①Speaker:发送BGP报文的设备称为BGP Speaker(发言者)。它接收或产生新的报文信息,并发布给其他BGP Speaker。Speaker角色是针对具体报文发送过程而言的,网络中每台BGP路由器均可成为自己发送BGP报文的Speaker。
②Peer:相互交换报文的Speaker之间互称Peer(对等体)。多个相关的对等体可以构成对等体组(PeerGroup),然后可以为这个对等体组进行集中配置。
4、BGP的路由器ID(RouterID)
与OSPF一样,BGP也是采用RouterID(路由器ID)来标识一个BGP设备的。路由器ID会在BGP会话建立时发送的Open报文中携带,也是一个32位值,通常是IP地址的形式。在对等体之间建立BGP会话时,每台BGP设备都必须有唯一的路由ID,否则对等体之间不能建立BGP连接。
在整个BGP网络中,每台BGP设备的路由器ID必须唯一,可采用手动配置,也可让BGP自己在设备上选取。在没有手动配置路由器ID的缺省情况下,BGP选择设备上的Loopback接口的IP地址作为BGP的路由器ID。否则选择设备上物理接口中最大的IP地址作为BGP的路由器ID。一旦选出路由器ID,除非发生接口地址删除等事件,否则即使配置了更大的接口IP地址,也会保持原来的路由器ID。
二、BGP AS
BGP的AS用于将整个外部网络划分为一个个应用本地路由策略的路由子域,这样公司通过BGP可以简化路由域管理和统一策略配置,因为一个BGP设备可以连接多个AS。在BGP设备连接的每个AS中可以支持多种不同的路由协议,但BGP本身不产生路由,需要通过引入各种IGP路由、直连路由和静态路由来实现与各个子网络的连接。不同的BGP AS中的BGP路由器间需通过EBGP对等会话动态交换路由信息;同一个AS内部的BGP路由器间通过IBGP对等会话交换路由信息。
因为BGP主要用于基于Internet这样的公网连接,所以它的AS又与仅应用于公司内部网络的AS不一样,在公网中使用的AS(称之为“公用AS”)必须是在公网注册,并由ISP统一分配,且在整个Internet中都是唯一的,就像公网IP地址一样。
RFC5398中规定,在1~64511间的2字节AS号是公网AS,64512~65534之间的2字节AS号是私网AS(AS号65535是保留用于特定用途的)。私有AS号可以用于内部路由域,但不能传输到达Internet的通信,不要配置通告私有AS号到外部网络。
上图说明了在分隔AS中的两个路由器可以通过EBGP协议进行连接。RouterA和RouterB是两个使用公用AS号的独立路由子域上的ISP路由器。这两个路由器通过Internet来传输通信。RouterA和RouterB是通过EBGP对等会话进行连接的。每个直接连接Internet的公用AS各自分配一个由ISP提供的AS号,用于标识BGP进程和AS。
1、BGP AS号格式
在2009年1月之前,RFC4271 BGP-4中使用的AS号是一个2字节数,取值在1~65535范围之间。IANA从2009年1月开始在RFC5396中定义了4字节的AS号,取值范围从65536~4294967295。AS有以下两种表示格式:
(1)Asplain AS(无格式AS)
Asplain AS号格式是一个普通的十进制整数,可以是2字节的,也可以是4字节的,不同长度仅代表As编号的取值范围不同,是BGP缺省的AS号格式。
(2)Asdot AS(点分AS)
Asdot AS格式AS号是一个点分记数法所表示的十进制数。它规定:如果是2字节的AS号(最大值为65535),则直接用它的十进制整数表示;如果是4字节的AS号,则采用点分计数法表示。点分记数法的计算方法是先把这个十进制AS号转换成二进制,然后从右向左每16位(2字节)分成一段,在两段之间以小圆点分隔,再将这两段分别换算成十进制。
尽管可以任意使用Asplain格式或者Asdot格式4字节AS号,但在display命令的输出中,或者在正则表达式中仅显示或控制一种格式。
2、保留的AS号
在RFC4893 BGP-4标准中,支持由2字节AS向4字节的过渡。但这个标准中新增了保留的AS号23456。后来又在新的RFC5398标准中规定了新的保留AS号,它们是在64496~64511之间的2字节AS号和在65536~65551之间的4字节AS号。
三、BGP地址族
最初BGP-4标准仅支持IPv4网络,为解决BGP对多种网络层协议的支持,IETF对BGP-4进行了地址族能力扩展,形成MP-BGP(Multi-Protocol BGP,多协议BGP),使BGP能够为多种网络应用提供路由信息。在RFC4760(Multiprotocol Extensions for BGP-4)中,定义了两个新的可选非过度属性(“非过度属性”就是该属性不能传递到其他设备上,仅在本地设备上使用),BGP的多种协议扩展都用到了这两个属性。
①扩展协议可达NLRI(MP_REACH_NLRI,属性类型14)。
②扩展协议不可达NLRI(MP_UNREACH_NLRI,属性类型15)。
这两种属性适用于所有BGP协议扩展。为了对不同的扩展类型进行区分,在这两种属性中都携带了BGP地址族(Address Family)和子地址族(Sub-Address Family)信息。所谓“地址族”就是一种网络层协议(如TCP/IP网络中的IPv4、IPv6,以及OSI网络中的CNLS)配置模块,简单说就是把不同类型的网络分块进行配置。其目的就是把针对运行不同网络层协议的网络分别进行功能配置,这样配置起来就更加有条理,因为这些不同网络层协议的地址格式的应用需求或许根本不一样。
为了进一步区分同一类型网络中不同类型的网络应用(如IPv4和IPv6网络中都有单播、组播、VPN等),又可在地址族下划分子地址族。“地址族”使用AFI(Address Family Identifier,地址族标识符)进行标识,对应的子地址族为SAFI(Subsequent AddressFamily Identifier,子序列地址族标识符)。
目前在IP网络中,MP-BGP主要包括4个地址族:IPv4、IPv6、L2VPN和VPLS地址族。在IP地址族(应该是IPv4地址族吧)下又有IPv4单播、IPv4组播、IPv4 VPN、IPv4 MPLS和IPv4 MDT子地址族等,IPv6地址族下有IPv6单播和IPv6组播子地址族等。
BGP报文类型及格式
BGP-4协议有5种报文:Open(建立)、Update(更新)、Notification(通知)、Keepalive(保持活跃)和Route-refresh(路由刷新)。
各字段解释:
①Marker:占16字节,用于标明BGP报文边界,固定值为所有比特均为“1”,相当于一个报文的头部标识符。
②Length:占2字节,标识BGP报文总长度(包括报头在内),以字节为单位。
③Type:占1字节,标识BGP报文的类型。其取值从1到5,分别表示Open、Update、Notification、Keepalive和Route-refresh消息。
一、Open报文格式
Open(建立)是TCP连接建立后发送的第一个报文,包含本地Speaker信息以及用于后面对等体间建立TCP会话的信息,用于建立BGP对等体之间的连接关系。报文格式如下:
Open报文中的各字段信息必须在对等体之间进行路由信息交换之前协商确定好。
①Version:标识本地设备使用的BGP版本,占1字节。对BGP-4,其值为4。
②My autonomous system:标识本地AS号,占2字节或4字节。通过比较两端的AS号可以确定是EBGP连接(不同时)还是IBGP连接(相同时)。
③Hold time:标识对等体与本设备保持连接的时间,占2字节,以秒为单位。在建立对等体关系时两端要协商Holdtime,并保持一致。如果在这个时间内未收到对端发来的Keepalive消息或Update消息,则认为BGP连接中断。
④BGP identifier:标识BGP路由器的路由器ID,占4字节,采用点分十进制格式的IP地址的形式,用来识别BGP路由器。
⑤Opt Parm Len(Optional Parameters Length):可选参数的长度,占1字节,标识可选参数的总长度,如果为0则没有可选参数。
⑥Optional Parameters:可选参数,长度可变,用于多协议扩展(Multiprotocol Extensions)等功能,如BGP验证信息。
二、Update报文格式
在BGP对等体之间成功建立了BGP会话后,双方就可以开始利用Update(更新)报文进行路由信息交换了,包括要向对等体通告的每条路由信息。但Update报文既可以发布可达路由信息,也可以撤销不可达路由信息。
一条Update报文可以通告一类具有相同路径属性的可达路由,这些路由放在NLRI(Network Layer Reachable Information,网络层可达信息)字段中,Path Attributes字段携带了这些路由的属性,BGP根据这些属性进行路由的选择;同时Update报文还可以携带多条不可达路由信息,被撤销的路由放在Withdrawn Routes字段中,用来通知对等体要撤销的路由。
①Unfeasible routes length:标识不可达路由(Withdrawnroutes)字段的长度,占2字节,以字节为单位,包含通知对等体从它的BGP路由表中要撤销的当前不可达路由的数量。如果为0则说明没有要撤销的路由,也就没有下面的Withdrawn routes字段。
②Withdrawn routes:不可达路由列表,长度可变,包含要从对等体BGP路由表中撤销的当前不可达路由的网络地址及前缀。
③Total path attribute length:标识路径属性(Path attributes)字段的长度,占2字节,以字节为单位。如果为0则说明没有下面的Path attributes字段。
④Path attributes:与NLRI字段相关的所有路径属性列表,每个路径属性由一个TLV(Type-Length-Value)三元组构成,可变长度。BGP正是根据这些属性值来避免环路,进行选路、协议扩展等。
⑤NLRI(Network Layer Reachability Information):标识网络层可达信息,包含要向对等体通告的每条可达路由的前缀,长度可变。这些可达路由信息来自本地Adj-RIB-In(AdiacentRouting Information Base,Incoming,入方向邻接路由信息库),然后又将加入到对端Adj-RIB-In中。
三、Notification报文格式
当BGP检测到错误状态时,就会向对等体发出Notification(通知)报文,之后BGP连接会立即中断。
①Error code:差错码,占1字节,指定错误类型。
②Error subcode:差错子码,占1字节,描述错误类型的详细信息。
③Data:错误消息内容,可变长度,用于辅助发现错误的原因。内容依赖于具体的差错码和差错子码,记录的是出错部分的数据。
四、Keepalive报文格式
BGP会周期性的向对等体发送Keepalive(保持活跃)报文,用来保持对等体连接的有效性。报文格式仅包含BGP报头,没有附加其他任何字段。
五、Route-refresh报文格式
Route-refresh(路由刷新)报文用来要求对等体重新发送指定地址族的路由信息。
①AFI:Address Family Identifier,地址族标识,占2字节,用于标识所采用的地址族类型。
②Res:保留,1字节,必须为0
③SAFI:subsequent Address Family Identifier,子地址族标识,1字节,用于标识子地址族类型。
BGP的主要路由属性
BGP路由属性是随着通过Update报文发送的BGP路由信息一起发布的一组参数。它对特定的路由进行了进一步的描述,使得路由接收者能够根据路由属性值对路由进行过滤和选择。它们可以被看做选择路由的度量(metric)。(个人理解是封装在path attribute字段中的各个TLV)
一、BGP路由属性分类
BGP路由信息包括许多属性,总体分为4类:
①公认必须遵循(Well-know mandatory):所有BGP设备都可以识别此类属性(这就是“公认”的含义),且必须在Update报文中存在(这就是“必须遵循”的含义),否则对应的路由信息就会出错。
②公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中(这就是“任意”的含义),即就算缺少这类属性,路由信息也不会出错。
③可选过渡(Optional transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,仍然会接收这类属性(这就是“可选”的含义),且可将该属性通告给其他对等体(这就是“过渡”的含义)。
④可选非过渡(Optional non-transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,也会接收这类属性,但在接收时忽略该属性,不会将该属性通告给其他对等体(这就是“非过渡”的含义),即仅在本地路由器上使用。
二、ORIGIN(源)属性
Origin属性公认必须遵循(就是所有BGP路由器都可识别,且必须在Update报文中存在)的BGP路由属性,用来标记一条BGP路由的路由信息源类型,指明了当前BGP路由是从哪类设备中产生的。有以下三种类型:
①IGP(i):是IBGP设备通过network命令通告的路由,是本AS内产生的路由,优先级最高。
②EGP(e):是从EGP对等体那里学习得到的路由,优先级次之。
③incomplete(?):优先级最低,是通过其他方式学习到的路由信息,比如BGP通过import-route命令引入的外部路由。但它并不是说明路由不可达,而是表示路由的来源无法确定。
三、AS_PATH属性
AS_Path(AS路径)属性也是公认必须遵守的BGP路由属性。AS_PATH属性按矢量(所谓“矢量”就是带有方向性的变量)顺序记录了某条路由从本地到达目的地址所经过的所有AS号,即“AS路径列表”的含义。AS路径列表可以理解为一个小括号里面包括所经过的AS号,各AS号间以逗号分隔,且离本地设备越近的AS编号越在前面(小括号的左边),如(200,400,100)表示该路由经过了AS200、AS400、AS100三个AS,其中AS200离本地设备最近,AS100离本地设备最远,也即路由的源AS。
通过观察路由的AS_Path属性,BGP设备可以找出该路由是从哪个AS产生的,以及该路由在传递过程中经过了多少AS。AS路径最右边的AS号就是路由的产生者(即源AS),最左边的AS号就是刚刚声明该路由的那个相邻的AS。处于AS_Path中间的AS号是路由传递经过的AS。这样的AS_Path序列被称为AS_Sequence。
当BGP路由器在通告路由信息时,遵循以下原则:
(1)当BGP Speaker通告自身引入的路由时
①当BGP Speaker将这条路由发布到EBGP对等体时,便会在Update报文中创建一个携带本地AS号的AS路径列表。
②当BGP Speaker将这条路由发布给IBGP对等体时,便会在Update报文中创建一个空的AS路径列表。
(2)当BGP Speaker通告从其他BGP Speaker的Update报文中学习到的路由时
①当BGP Speaker将这条路由发布给EBGP对等体时,便会把本地AS编号添加在AS路径列表的最前面(最左面)。收到此路由的BGP设备根据AS-Path属性就可知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
②当BGP Speaker将这条路由发布给IBGP对等体时,不会改变这条路由相关的AS_Path属性。
如上图,有两条从AS 50区域中路由器到达目的网络8.0.0.0的路由,根据箭头所示的路由发布方向(路由发布方向是到达目的地址的路由路径的反方向)可看出,在AS_Path列表中依次添加了所经过的AS号,并且是最近的处于最前面,其他AS号按顺序依次排列,中间以逗号分隔。如最后D=8.0.0.0(30,20,10)和D=8.0.0.0(40,10)。
缺省情况下,BGP不会接受AS_Path中已包含本地AS号的路由,从而避免了环路形成,与RIP的水平分割特性功能类似。也就是只有在EBGP对等体之间通告路由时才会在AS路径列表中添加AS号,同一个AS中的通告不会添加AS号。如果某台BGP路由器从其外部对等体收到某条路由的AS路径列表中包含了自己的AS号,则该路由器就知道出现了环路,因而将丢弃该路由。
同时,AS_Path属性也可用于路由的选择和过滤。在其他因素相同的情况下,BGP会优先选择路径较短的路由。如上图,AS50中的BGP路由器会优先选择经过AS40的路径作为目的地址8.0.0.0的最优路由。
在某些应用中,还可以使用路由策略来人为增加AS路径长度,以便更灵活控制BGP路由路径的选择。通过配置AS路径过滤列表,还可针对AS_Path属性中所包含的AS号来对路由进行过滤。
四、NEXT_HOP属性
Next_Hop(下一跳)属性也是公认必须遵守的BGP属性。因为BGP主要用于AS间网络的连接,所以它的“下一跳”仅是针对不同AS中的EBGP对等体间的路由发布而言的,是指下一个AS,而不是指下一个路由器,因为在IBGP对等体间的路由发布中其下一跳属性是不会改变的。
动态路由(包括RIP、OSPF、IS-IS和BGP)的“下一跳”都是针对接收路由信息的设备而言的,而不是针对发送路由信息而言的,因为路由中的目的地址所在网络总是在通告路由的路由器之前,即路由自身的路径与路由被通告的路径是相反的。只有理解这一点,才能理解“BGP路由下一跳为路由器的出接口IP地址”的含义。另外,无论是EBGP对等体,还是IBGP对等体,不一定都是直接连接的,非直接连接的BGP路由器之间也可建立EBGP或者IBGP对等体连接。
通常情况下,Next_Hop属性遵循下面的规则:
①BGP Speaker在向EBGP对等体发布(包括转发)某条路由时,会把该路由信息的下一跳属性修改为本地与对端建立EBGP对等体连接关系的出接口IP地址。
如下图14-9图,AS100路由器产生到达8.0.0.0网络的路由并发布给AS200路由器时,下一跳地址就是AS100路由器与AS200路由器连接时所用的出接口IP地址1.1.1.1/24。
再次解释一下为什么该路由的下一跳会变成发送路由发布的AS100中的路由器的出接口IP地址1.1.1.1/24。因为对于接收这条路由的AS200中的路由器来说,它到达1.1.1.1/24的路由方向其实就是由AS100中的路由器向他自己通告这条路由的反方向(也就是图中箭头方向的反方向),而在这个反方向中的下一跳正好就是AS100中的路由器的出接口。
同理,AS200向AS300中左边那台路由器转发从AS100得到的路由发布时,其路由的下一跳地址为AS200与AS300中左边那台路由器相连时所用的出接口的IP地址1.1.2.1/24。
②BGP Speaker将本地始发的路由(也就是这条路由的目的网络就是直接连接在该BGP Speaker上)发布给IBGP对等体时,也会把该路由信息的下一跳属性设置为本地与对端建立IBGP邻居关系的出接口IP地址。但是收到该IBGP路由的IBGP对等体不会再转发给其他的IBGP对等体,这是为了避免在AS内部出现路由环路。即BGP Speaker从IBGP对等体获得的IBGP路由不再向其他IBGP对等体发布。
③BGP Speaker在向IBGP对等体转发从EBGP对等体学习到的路由时,不改变该路由信息的下一跳属性(但通过配置也改为转发路由的BGP设备的出接口IP地址),但收到转发的EBGP路由的IBGP对等体可以再转发给其他IBGP对等体。且如果配置了负载分担,路由被发给IBGP对等体时则会修改其下一跳属性。
如上图,AS300左边那台路由器转发从AS200获得的路由发布到相同区域中的右边那台路由器时,其下一跳没有改变,仍为AS200与AS300中左边那台路由器相连时所用的接口的IP地址1.1.2.1/24。
五、LOCAL_PREF属性
Local_Pref(本地优先级)属性是公认任意(所有BGP路由器都可识别,但可以不在Update报文中存在)的BGP属性,表明BGP路由器自身(不是针对具体路由)的BGP优先级(Local_Pref属性值越大,优先级越高),用于判断流量离开本地AS时的最佳路由。路由器配置了Local_pref属性后,本路由器上所有的BGP路由都具有相同的本地优先级。
当一个AS内部的BGP的设备通过得到不同的IBGP对等体到达位于其他AS中的相同目的地址,但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。Local_Pref属性仅在IBGP对等体之间交换和比较,不通告给其他AS。
如下图,在RouterD上学习到了两条通过同一AS中的IBGP路由器路径到达RouterA的路由,这时就可以使用本地优先级进行选路了,经过比较最终确定选择RouterC作为从AS20到AS10的出口(如虚箭头方向),因为RouterC中的Local_Pref属性值为200,高于RouterB中的Local_Pref属性值100。
六、MED属性
MED(多出口)属性是一个可选非过渡(不要求在Update必须存在,且不可向其他对等体通告)属性,用于EBGP对等体判断流量进入其他AS时的最优路由。
MED属性仅在相邻两个AS之间交换,收到此属性的AS一方不会再将其通告给任何其他第三方AS。当一个BGP路由器通过不同的EBGP对等体得到目的地址相同,但下一跳不同的多条路由时,在其他条件相同的情况下,将优先选择MED值较小者作为进入EBGP对等体所在AS的最优路由,即MED值越小,优先级越高。
如上图,从AS10到AS20的流量将选择RouterB作为入口(虚箭头方向),因为RouterB中的MED值为0,小于RouterC中的MED值100。
一般情况下,EBGP路由器只比较来自同一个其他AS中多个EBGP对等体路径的MED属性,不比较来自不同AS的MED值。若非要比较的话,则可以通过手动配置强制BGP比较来自不同AS的路由的MED属性值。如果路由器没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。
七、团体属性
Community(团体)属性是一个可选过渡(不要求在Update必须存在,但可向其他对等体通告)的BGP属性,是一组有相同特征的目的地址的BGP路由集合,用来简化路由策略的应用和降低维护管理的难度,因为这样可以为团体中的路由成员一次性配置相同的参数属性和路由策略,也可通过团体属性进行路由过滤。而且,团体中具体集合的路由数量没有物理上的边界,与其所在的AS无关,也就是可以是不同AS路径的路由。
BGP团体属性可分为基本团体属性和扩展团体属性两种:
1、基本团体属性
基本团体属性的“Type code”(类型代码)字段值是8,属性取值占32位,可以解析为一个十进制数,也可解析为aa:nn的格式,各占16位。32位团体属性值中0x00000000~0x0000FFFF和0xFFFF0000~0xFFFFFFFF被保留。RFC1997中规定,前16位表示路由的源AS号,后16位可以理解为源AS划分的子AS号,也可用来标识路由来自不同的IGP路由类型,或者其他属性,如本地优先级值、MED属性值等,应用非常灵活。
RFC1997还规定了以下几种公认的基本团体属性:
①INTERNET:缺省情况下,所有的路由都属于INTERNET团体。具有此属性的路由可以被通告给所有的BGP对等体。
②NO_EXPORT(属性值为十进制的4294967041,或者十六进制的0xFFFFFF01):具有此属性的路由在被收到后,不能被发布到本地AS之外。如果使用了联盟(Confederation),则不能被发布到BGP联盟之外,但可以发布给联盟中的其他子AS。
BGP联盟其实就是一个AS下面的子AS划分,满足一些较大企业用户需要多个AS,但又想进行集中路由域管理的需求。这样在一个大的组织机构划分多个子网络管理区域,每个子区域独立分配成为1个子AS,可以减少同一个AS中BGP路由的数量,提高了路由和管理效率。
③NO_ADVERTISE(属性值为十进制的4294967042,或者十六进制的0xFFFFFF02):具有此属性的路由被接收后,不能被通告给任何其他的BGP对等体。
④NO_EXPORT_SUBCONFED(属性值为十进制的4294967043,或十六进制的0xFFFFFF03):具有此属性的路由被接收后,不能被通告到本地AS之外,也不能通告到联盟中的其他子AS。
2、扩展团体属性
因为团体属性的使用越来越丰富,原有的32位定义已经不能满足各种应用,所以应运而生了扩展团体属性。扩展团体属性使用了新的“Type code”(为16)格式。比起原来的基本团体属性,扩展团体属性提供了更长的取值范围(占64位),以减少冲突的可能;同时,还增加了一个Type字段,可以使得路由策略直接基于扩展团体属性的Type字段进行操作。相当于将一些原来需要通过复杂的团体属性配置才能实现的功能,直接添加到了扩展团体属性的结构中。
路由反射器与联盟
在BGP中,为了防止路由环路的出现,对于EBGP路由和IBGP路由分别作了如下规定:
①对于AS之间学习到的EBGP路由,通过AS_Path属性记录途经的AS路径,规定在收到带有本地AS号的路由将被直接丢弃。
②对于AS内部学习到的IBGP路由,规定在收到路由后禁止向其他IBGP对等体发布。也就是IBGP对等体之间仅能学习到对等体(IBGP的对等体可以不是直接连接的)之间的路由,不能学习到非邻居之间的路由。
从上可看出,IBGP设备之间只有对等体之间可以相互学习到路由,这样就带来一个问题,即非IBGP对等体之间不能彼此交互路由信息,变成路由不可达了。为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接关系。即假设在一个AS内部有n台设备,那么建立的IBGP连接数就是n*(n-1)/2。这样一来,当一个AS中的BGP设备很多时,设备配置将十分复杂且消耗网络和CPU资源。
为解决以上问题,BGP提供了两种解决方案:一个是在IBGP对等体间使用路由反射器(Route Reflector,RR),另一个就是联盟(Confederation)。
一、路由反射器
在RR技术中,为一个AS内部的各IBGP设备定义了以下几种角色:
①路由反射器(RR):允许把从IBGP对等体学习到的路由反射到其他IBGP对等体,与OSPF网络中的DR(指定路由器)或者IS-IS网络中的DIS(指定IS)类似。
②客户机(Client):与RR形成反射邻居关系的IBGP设备,类似于OSPF中的DROther,或者IS-IS网络中的DISOther。在AS内部,客户机只需要与RR直连,彼此交换路由信息,客户机之间无需直接连接,也无需交换路由信息。
③非客户机(Non-Client):既不是RR,也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
④集群(Cluster):路由反射器及其客户机的集合,通过专门的Cluster_List属性可以防止集群间产生路由环路。
⑤始发者(Originator):在AS内部始发IBGP路由的BGP设备。通过专门的Originator_ID属性可防止集群内产生路由环路。
1、路由反射器原理
在路由反射器技术中规定,同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立IBGP连接,不需要与其他客户机建立IBGP连接,从而减少了IBGP连接数量。
RR突破了“从IBGP对等体获得的BGP路由只能发布给它的EBGP对等体”的限制,并采用独有的Cluster_List属性和Originator_ID属性分别防止了集群之间和集群内部的路由环路出现。RR向IBGP邻居发布路由规则如下:
①从非客户机学习到的路由,发布给所有客户机
②从客户机学习到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
③从EBGP对等体学习到的路由,发布给所有的非客户机和客户机。
2、Cluster_List属性
路由反射器和它的客户机组成一个集群(Cluster),使用AS内唯一的Cluster ID作为标识。为了防止集群间产生路由环路,路由反射器使用Cluster_List属性来记录路由经过的所有集群的ClusterID,类似EBGP路由中所使用的AS_Path属性。具体流程如下:
①当一条路由第一次被RR通告时,RR会把本地Cluster ID添加到Cluster_List的前面。如果没有Cluster_List属性,RR就创建一个。
②当RR接收到一条更新路由时,RR会检查Cluster_List。如果Cluster_List中已经有本地Cluster ID,则丢弃该路由;否则,将其加入Cluster_List,然后通告该更新路由。
3、Originator_ID属性
Originator_ID由RR产生,使用路由始发者的RouterID进行标识,用于防止集群内产生路由环路。具体流程:
①当一条路由第一次被RR通告时,RR将路由始发者的Originator_ID属性加入这条路由,标识这条路由的发起设备。如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID属性。
②当IBGP接收到这条路由的时候,将比较收到的Originator_ID和本地的RouterID,如果两个ID相同,则丢弃该路由,否则,接收该更新路由。
4、备份路由反射器
为增加网络可靠性,防止单点故障,需要在一个集群中配置一个以上的RR。由于RR打破了从IBGP对等体收到的路由不能传递给其他IBGP对等体的限制,所以如果同一集群内存在多个RR,则它们之间中又可能存在环路,因此这里又规定,同一集群中的所有RR必须使用相同的Cluster ID,以避免RR之间的路由环路。
如上图,路由反射器RR1和RR2在同一个集群内,配置了相同的Cluster ID。下面是备份路由反射器解决路由环路的具体流程:
①当客户机Client1从EBGP对等体接收到一条更新路由时,它将通过IBGP同时向RR1和RR2通告这条路由。
②RR1和RR2在接收到该更新路由后,将本地Cluster ID添加到Cluster_List前面,然后向其他的客户机(Client2、Client3)通告。
③当Client2、Client3客户向RR1和RR2进行路由发布时,RR1和RR2有可能收到原来由自己向客户机通告的路由。这时RR1和RR2会检查路由发布中的Cluster_List,如果发现自己的ClusterID已经包含在通告路由的Cluster_List中,就丢弃该更新路由,从而避免了路由环路。
5、多集群路由反射器
一个AS中可以存在多个集群,各个集群的RR之间可以建立IBGP对等体。当RR所处的网络层不同时,可以将较低网络层次的RR配成客户机,形成分级RR。当RR所处的网络层相同时,可以将不同集群的RR全连接,形成同级RR。在实际的RR部署中,常用的是分级RR场景。
如14-14图所示,ISP为AS100提供Internet路由。AS100内部分为两个集群,其中Cluster1内的4台设备是核心路由器,采用备份RR的形式保证可靠性;而Cluster2内的两台设备是下级路由器,采用单RR结构。
图14-15所示,一个骨干网被分成多个集群。各集群的RR间互为非客户机关系,并建立全连接。此时虽然每个客户机只与所在集群的RR建立IBGP连接,但所有RR和客户机都能收到全部路由信息。
二、BGP联盟
解决AS内部的IBGP网络连接激增问题,还可以使用联盟(Confederation)技术。
联盟将一个AS划分为若干个子AS。每个子AS内部建立IBGP全连接关系,子AS之间建立联盟EBGP连接关系,但联盟外部AS仍会认为联盟是一个AS。配置联盟后,原AS号将作为每个路由器的联盟ID。这样有两个好处:一是可以保留原有的IBGP属性,包括Local Preference属性、MED属性和Next_Hop属性等;二是联盟相关的属性在传出联盟时会自动被删除,即管理员无需在联盟的出口处配置过滤子AS号等信息的操作。
如下图14-16,AS100使用联盟后被划分为3个子AS:AS65001、AS65002、AS65003,使用AS100作为联盟ID。此时IBGP的连接数量从10条减少到4条,不仅简化了设备的配置,也减轻了网络和CPU的负担。AS100外的BGP设备因为仅知道AS100的存在,并不知道AS100内部的联盟关系。
联盟的缺陷是:从非联盟方案向联盟方案转变时,要求路由器重新进行配置,逻辑拓扑也要改变。
BGP工作原理
BGP路由有许多属性,这些属性影响着最终的路由选择。BGP本身不产生、发现路由,它是将各种IGP路由、静态路由、直连路由引入后向其他AS或本地AS的对等体进行发布。
一、BGP协议的选路规则
由于BGP连接的是一个非常复杂,且可能混合多种IGP路由协议的网络,因此就可能通过不同接口学习到多条到达同一目的地的不同路径、不同协议的路由。这就决定了BGP在路由选择方面要考虑到许多方面。
为了指导路由选择,BGP规定了下一跳策略(即“首先丢弃下一跳(Next_Hop)不可达的路由”的策略)和路由选路规则,其中下一跳策略的优先级比BGP路由选路规则高。在执行完下一跳策略后,BGP使用如下选路规则进行路由选择(由上至下优先级依次降低)。
⑴优选协议首选值(Preferred-value)属性值最高的路由。协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。
⑵优选本地优先级(Local_Pref)属性值最高的路由。如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。通过执行default local-preference修改BGP路由的缺省本地优先级。
⑶依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由。
⑷优选AS路径(AS_Path)最短的路由。
⑸依次优选Origin类型为IGP、EGP、Incomplete的路由。
⑹对于来自同一AS的路由,优选MED属性值最低的路由。
⑺依次优选EBGP路由、IBGP路由。
⑻优选到BGP下一跳IGP度量值(metric)最小的路由。但在IGP类型路由协议中,对到达同一目的地址的不同路由,不同IGP路由协议会根据本身的路由算法计算路由的度量值。
⑼优选Cluster_List最短的路由。
⑽优选RouterID最小的设备发布的路由。但如果该路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小,不比较RouterID,优选Originator_ID最小的路由。
⑾优选从具有最小IP Address的对等体学来的路由。
当到达同一目的地址存在多条等价路由时,可以通过BGP等价负载分担实现均衡流量的目的。形成BGP等价负载分担的条件是以上“BGP选择路由的策略”中1~8条规则中需要比较的属性值完全相同。
二、BGP对等体交互原理
BGP对等体的建立、更新和删除等交互过程主要有5种报文、6种状态机和5个原则。
1、5种BGP的报文
BGP对等体间通过以下5种报文进行信息交互,其中Keepalive报文为周期性发送,其余报文为触发式发送。
①Open报文:用于建立BGP对等体连接。
②Update报文:用于在对等体之间交换路由信息。
③Notification报文:用于中断BGP连接。
④Keepalive报文:用于保持BGP连接。
⑤Route-refresh报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。
2、6种BGP状态机
在BGP对等体的交互过程中存在6种状态机:空闲(Idele)、连接(Connect)、活跃(Active)、Open报文已发送(OpenSent)、Open报文已确认(OpenConfirm)和连接已建立(Established)。在BGP对等体建立的过程中,使用了Idle、Active和Established三种状态机。
①Idle状态是BGP初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start(开始)事件后,BGP才开始尝试和其他BGP对等体进行TCP连接,并转换至Connect(连接)状态。
Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程,或者路由器软件重置BGP过程引发的。任何状态中收到Notification报文或TCP拆链通知等Error(错误)事件后,BGP都会转至Idle状态。
②在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
◆如果TCP连接成功,那么本地BGP向BGP对等体发送Open报文,并转换至OpenSent状态。
◆如果TCP连接失败,那么本地BGP转换至Active状态。
◆如果连接重传定时器超时后本地BGP仍没有收到BGP对等体的响应,那么本地BGP会继续尝试和其他BGP对等体进行TCP连接,停留在Connect状态。
③在Active状态下,本地BGP总是在试图建立TCP连接。
◆如果TCP连接成功,那么本地BGP向BGP对等体发送Open报文,关闭连接重传定时器,并转换至OpenSent状态。
◆如果TCP连接失败,那么本地BGP停留在Active状态。
◆如果连接重传定时器超时后本地BGP仍没有收到BGP对等体的响应,那么本地BGP转换至Connect状态。
④在OpenSent状态下,本地BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
◆如果收到的Open报文正确,那么本地BGP向BGP对等体发送Keepalive报文,并转换至OpenConfirm状态
◆如果发现收到的Open报文有错误,那么本地BGP向BGP对等体发送Notification报文给对等体,并转换至Idle状态。
⑤在OpenConfirm状态下,本地BGP等待来自BGP对等体的Keepalive或Notification报文。如果收到Keepalive报文,则转换至Established状态;如果收到收到Notification报文,则转换至Idle状态。
⑥在Established状态下,本地BGP可以和BGP对等体交换Update、Keepalive、Route-refresh报文和Notification报文。
◆如果收到正确的Update或Keepalive报文,那么本地BGP就认为对端处于正常运行状态,将保持BGP连接。
◆如果收到错误的Update或Keepalive报文,那么本地BGP发送Notification报文通知对端,并转换至Idle状态。
◆Route-refresh报文不会改变BGP状态。
◆如果收到Notification报文,那么本地BGP转换至Idle状态。
◆如果收到TCP拆链通知,那么本地BGP断开连接,转换至Idle状态。
3、BGP对等体之间的5种交互原则
BGP设备将最优路由加入BGP路由表,形成BGP路由。BGP设备与BGP对等体间成功建立邻居关系后,缺省情况下将采取以下5种交互原则:
◆从IBGP对等体获得BGP路由,只发给它的EBGP对等体。
◆从EBGP对等体获得的BGP路由,发给它所有EBGP和IBGP对等体。
◆当存在多条到达同一目的地址有效路由时,BGP设备只将最优路由发布给对等体。
◆路由更新时,BGP设备只发送要更新的BGP路由,不是发送整个路由表。
◆所有对等体发送的路由,BGP设备都会接收。
三、BGP与IGP交互原理
由于BGP与IGP在设备中使用不同的路由表,因此为了实现不同AS间相互通信,BGP需要与IGP进行交互,即BGP路由表和IGP路由表相互引入。
1、BGP引入IGP路由
BGP协议本身不产生、发现路由,因此需要将其他路由引入BGP路由表,实现AS间的路由互通。当一个AS需要将路由发布给其他AS时,AS边缘路由器会在BGP路由表中引入IGP的路由。为更好规划网络,BGP在引入IGP路由时,可使用路由策略进行路由过滤和路由属性设置,也可以设置MED属性指导EBGP对等体判断流量进入AS时选路。
BGP引入路由时支持Import和Network两种方式:
①Import方式是按协议类型,将RIP、OSPF、ISIS等协议的路由引入到BGP路由表中。为了保证引入的IGP路由的有效性,Import方式还可以引入静态路由和直连路由。
②Network方式是逐条将IP路由表中已经存在的路由引入到BGP路由表中,比Import方式更精确。
2、IGP引入BGP路由
当一个AS需要引入其他AS的路由时,AS边缘路由器会在IGP路由表中引入BGP的路由。为避免大量BGP路由对AS内设备造成影响,当IGP引入BGP路由时,可以使用路由策略进行路由过滤和路由属性设置。
如上图,某公司海外市场部所在区域AS100部署OSPF网络,国内研发部所在区域AS200部署IS-IS网络,现要求AS100与AS200通过部署BGP实现互通。
这同时涉及到BGP引入IGP路由,IGP引入BGP路由。必须让AS100中的设备知道AS200的路由,同时AS200中的设备知道AS100的路由。配置方法是在RouterC上部署BGP引入本地AS中的IGP IS-IS路由,使RouterC的BGP路由表中存在AS200中的路由,并通过EBGP把引入的路由发布给RouterB,然后在RouterB上部署OSPF引入BGP路由,实现AS100内设备知道AS200的路由;同理,要在RouterB上部署BGP引入本地AS中的IGP OSPF路由,使RouterB的BGP路由表中存在AS100中的路由,并通过EBGP把引入的路由发布给RouterC,然后在RouterC上部署IS-IS引入BGP路由,实现AS200内设备知道AS100的路由,最终实现两个AS中的设备能够互通。