BGP协议初探
简介
边界网关协议BGP(Border Gateway Protocol)可以实现自治系统AS(Autonomous System)之间的路由传递,可以在节点上实现最佳路由选路。BGP协议使用TCP协议进行传输,监听179端口。同一个自治系统(AS)中的两个或多个对等实体之间运行的BGP 被称为 IBGP,归属不同的AS的对等实体之间运行的BGP称为EBGP。
一些概念
-
AS是指在一个实体管辖下的拥有相同选路策略的IP网络。BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。AS号分为2字节AS号和4字节AS号,其中2字节AS号的范围为1至65535,4字节AS号的范围为1至4294967295。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。
-
BGP分类:BGP按照运行方式分为EBGP(External/Exterior BGP)和IBGP(Internal/Interior BGP)
-
EBGP:运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
-
IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。
BGP消息类型
-
Open:Open消息是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系
-
Keeplive:用来保持连接的有效性
-
Update:用于在对等体之间交换路由信息。它既可以发布可达路由信息,也可以撤销不可达路由信息
-
Notification:当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断
-
Route-refresh:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文
BGP邻居建立过程
-
Idle
BGP协议初始时是处于Idle状态。在这个状态时,系统不分配任何资源,也拒绝所有进入的BGP连接。只有收到Start Event时,才分配BGP资源,启动ConnectRetry计时器,启动对其它BGP对等体的传输层连接,同时也侦听是否有来自其它对等体的连接请求。
-
Connect
这个状态下,BGP等待TCP完成连接。若连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,然后状态改变为OpenSent状态;否则,本地重置ConnectRetry计时器,侦听是否有对等体启动连接,并移至Active状态。
-
Active
这个状态下,BGP初始化TCP连接来获得一个对等体。如果连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,并转至OpenSent状态。
-
OpenSent
这个状态下,BGP等待对等体的OPEN报文。收到报文后对报文进行检查,如果发现错误,本地发送NOTIFICATION报文给对等体,并改变状态为IDLE。如果报文正确,BGP发送KEEPALIVE报文,并转至OpenConfirm状态。
-
OpenConfirm
这个状态下,BGP等待KEEPALIVE或NOTIFICATION报文。如果收到KEEPALIVE报文,则进入Established状态,如果收到NOTIFICATION报文,则变为Idle状态。
-
Established
这个状态下, BGP可以和其他对等体交换UPDATE,NOTIFICATION,KEEPALIVE报文。如果收到了正确的UPDATE或KEEPALIVE报文,就认为对端处于正常运行状态,本地重置Hold Timer。如果收到NOTIFICATION报文,本地转到Idle状态。如果收到错误的UPDATE报文,本地发送NOTIFICATION报文通知对端,并改变本地状态为Idle。如果收到了TCP拆链通知,本地关闭BGP连接,并回到Idle状态。
BGP属性
-
公认必须遵循(Well-known mandatory):所有BGP设备都可以识别此类属性,且必须存在于Update报文中。如果缺少这类属性,路由信息就会出错。
-
公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中,即就算缺少这类属性,路由信息也不会出错。
-
可选过渡(Optional transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。
-
可选非过渡(Optional non-transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。
-
ORIGIN可以是以下三种值:
-
IGP:表示网络层可达信息来源于AS内部
-
EGP :表示网络层可达信息通过AS外部学习
-
INCOMPLETE:表示网络层可达信息来源无法确定
-
在路由选择的时候,ORIGIN中,IGP优于EGP,EGP优于INCOMPLETE。
-
AS-PATH采用AS_SEQUENCE方式表示——该路由经过的AS的有序集
-
当BGP发布者发布路由给IBGP对等体时,BGP不修改路由的AS_PATH属性。当BGP发布者发布路由给EBGP对等体时,本地系统应该把自己的AS号作为序列的最后一个元素加在序列的最后面。
-
AS_PATH可以用来作为路由选路的一种度量。经过更少AS路径的路由更优先。
-
同时AS_PATH也作为一种手段来避免环路。如果BGP路由信息发布者从EBGP对等体收到一条路由,它的AS_PATH包含发布者自己的AS号,就说明这条路由曾经从本AS发出过,将其丢弃,同时不再进行转发。基于上述机制,AS_PATH属性可以避免AS之间的路由环路的出现,AS内部的路由环路的避免则采用其他手段来实现
-
NEXT_HOP中IP地址的填写遵循如下规则:
-
如果是由EBGP peer通告的BGP update报文,那么next_hop就是AS外这个EBGP peer的IP地址。(实际上,是与本AS直连的接口IP地址)
-
假如BGP update报文是由IBGP peer通告的,那么next_hop就是这个IBGP peer发出更新报文的接口IP地址
-
如果update 报文最开始是由EBGP peer通告,但是是从本AS内的边界路由器(也就是IBGP peer),那么next_hop是EBGP peer的通告出更新的接口IP地址,而不是本AS的这个IBGP peer。
-
LOCAL_PREF属性仅在IBGP对等体之间交换,不通告给其他AS。当BGP的路由器通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择LOCAL_PREF属性值较高的路由。
-
MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的最佳路由
-
当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。
-
MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。
-
团体属性用来简化路由策略的应用和降低维护管理的难度,没有物理上的边界,与其所在的AS无关。
-
INTERNET:缺省情况下,所有的路由都属于INTERNET团体。具有此属性的路由可以被通告给所有的BGP对等体。
-
NO_EXPORT:具有此属性的路由在收到后,不能被发布到本地AS之外。如果使用了联盟,则不能被发布到联盟之外,但可以发布给联盟中的其他子AS。
-
NO_ADVERTISE:具有此属性的路由被接收后,不能被通告给任何其他的BGP对等体。
-
NO_EXPORT_SUBCONFED:具有此属性的路由被接收后,不能被发布到本地AS之外,也不能发布到联盟中的其他子AS。
-
ORIGINATOR_ID:为了防止引入路由反射器之后出现环路,增加ORIGINATOR_ID这个属性来标识,反射器在发布路由时加入ORIGINATOR_ID,当反射器收到的路由信息中的ORIGINATOR_ID就是自己的ROUTER_ID时,就可以发现路由环路的出现,将该路由丢弃,不再转发。
-
CLUSTER_ID属性也是用来防止环路,在路由经过路由反射器时路由反射器会将自己的CLUSTER_ID添加到路由携带的CLUSTER_LIST中,当路由反射器发现接收的路由的CLUSTER_LIST中包含有自己的CLUSTER_ID,则将该路由丢弃,不再转发。
BGP使用原则
-
多条路径时,BGP Speaker只选最优的给自己使用
-
BGP Speaker只把自己的路由通告给邻居
-
从EBGP获得的路由会向它所有BGP 邻居通告(EBGP/IBGP);BGP Speaker从IBGP获得的路由不会通告给它的IBGP邻居(BGP 的水平分割)IGP是基于端口的水平分割;而IBGP是基于邻居的水平分割。水平分割的作用是避免产生路由环路。
-
BGP Speaker从IBGP获得的路由是否通告给它的EBGP邻居要服从IGP和BGP是否同步来决定
-
邻居关系一建立,BGP Speaker就把自己所有的BGP最优路由通告给新的邻居
BGP路由选路
最优路由有三种情况:
-
对同一个目的地集合有路由的最高优先级
-
是到目的地的唯一路由
-
两条或两条以上具有相同优先级,必须用更细的法则算出一条最优来。此过程称之为Tie-Break
一般来说,BGP计算路由优先级采用如下规则:
-
选择具有最高LOCAL_PREF值的路由
-
如果LOCAL_PREF相同,选择从本地IGP(含直连路由)引入的路由
-
如果LOCAL_PREF相同,且没有本地引入路由,则选择AS_PATH最短的路由
-
如果AS_PATH路径长度相同,判断ORIGIN值,IGP优于EGP,EGP优于Incomplete
-
如果ORIGIN相同,优选MED值较小的
-
如果MED也相同,依次选择从EBGP、Confederation、IBGP发布的路由
-
如果发布源也相同,优选下一跳IP在本地路由表中Cost值最小的路由
-
如果下一跳Cost也相同,优选CLUSTER_LIST长度最短的路由
-
如果CLUSTER_LIST长度也相同,优选ORIGINATOR_ID最小的路由
-
如果ORIGINATOR_ID长度也相同,优选ROUTER_ID最小的路由
Tie-break采用如下过程:
-
优选MED值较小的.
-
优选下一跳IP在本地路由表中Cost值最小的路由
-
优选EBGP邻居发布的路由
-
选择BGP标识符最小的邻居发布的路由
路由反射器
路由反射器几种角色信息
-
路由反射器RR(Route Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
-
客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
-
非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
-
始发者(Originator):在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。
-
集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。
基本原理
-
同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立IBGP连接,不需要与其他客户机建立IBGP连接,从而减少了IBGP连接数量。
-
集群内的客户不应再与群外的BGP邻居形成IBGP连接。一个AS内所有的路由反射器和非客户邻居形成全网状邻居关系。反射器反射路由时,不会修改NEXT_HOP、AS_PATH、MED以及LOCAL_PREF等BGP属性
-
RR突破了“从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。”的限制,并采用独有的Cluster_List属性和Originator_ID属性防止路由环路。RR向IBGP邻居发布路由规则如下:
-
从非客户机学到的路由,发布给所有客户机。
-
从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
-
从EBGP对等体学到的路由,发布给所有的非客户机和客户机
路由聚合
在大规模的网络中,BGP路由表变得十分庞大,存储路由表占有大量的路由器内存资源,传输和处理路由信息所必需的带宽和路由器传送与处理路由信息需要大量的资源。使用路由聚合(Routes Aggregation)可以大大减小路由表的规模;另外通过对路由的条目的聚合,隐藏一些具体的路由从而减少路由震荡对网络带来的影响。BGP路由聚合结合灵活的路由策略,从而使BGP更有效的传递和控制路由。
BGP在IPv4网络中支持自动聚合和手动聚合两种方式,而IPv6网络中仅支持手动聚合方式:
-
自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,BGP将按照自然网段聚合路由(例如非自然网段A类地址10.1.1.1/24和10.2.1.1/24将聚合为自然网段A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。
-
手动聚合:对BGP本地路由表中存在的路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。
为了避免路由聚合可能引起的路由环路,BGP设计了AS_Set属性。AS_Set属性是一种无序的AS_Path属性,标明聚合路由所经过的AS号。当聚合路由重新进入AS_Set属性中列出的任何一个AS时,BGP将会检测到自己的AS号在聚合路由的AS_Set属性中,于是会丢弃该聚合路由,从而避免了路由环路的形成
其他
路由处理过程
-
从对等体处收到的路由->输入策略引擎->路由判定过程(BGP 表)->路由器所用的路由(IP 路由表)->输出策略引擎->通告给对等体的路由
BGP路由过滤手段
-
ACL/IP Prefix:ACL、IP前缀列表主要是对BGP路由的前缀做过滤,可以实现对不同前缀地址做不同的过滤
-
AS路径过滤
-
RoutePolicy
-
BGP路由常用来被过滤的条件主要是路由前缀、AS-PATH属性、Community属性,当然还有一些其他匹配条件(MED、next-hop、route-type、route-source、interface、tag)也可以被用来做过滤
路由过滤实施点
-
接收路由Import Policy
-
本地发布路由
-
发送路由Export Policy