BGP-4 提供了一套新的机制以支持无类域间路由。这些机制包括支持网络前缀的通告、取消 BGP 网络中 “ 类 ” 的概念。 BGP-4 也引入机制支持路由聚合,包括 AS 路径的集合。
特点
BGP属于外部或域间路由协议。BGP的主要目标是为处于不同AS中的路由器之间进行路由信息通信提供保障。通常被称为路径向量路由协议。
- BGP 是一个外部网关协议,允许一个AS与另一个AS进行通信。BGP允许一个AS向其他AS通告其内部的网络的可达性信息,或者是通过该AS可达的其他网络的路由信息。同时,AS也能够从另一个AS中了解这些信息。
- BGP支持基于策略的选路(policy-base routing)。
- BGP路由器可以由本地管理员为域内和域间的网络可达性配置不同的策略。
- BGP路由信息的传输采用了可靠地TCP协议。端口号179。
- BGP在发布到一个目的网络的可达性的同时,包含了在IP分组到达目的网络过程中所必须经过的AS的列表。
- 只需要在启动时交换一次完整信息。后续的路由更新报文只通告网络的变化信息。
- BGP支持及VLSM方式。通告的所有网络都以网络前缀加子网掩码的方式表示。
- BGP允许发送方把路由信息聚集在一起,用一个条目来表示多个相关的目的网络。
- BGP还允许接收方对报文进行鉴别和认证,以验证发送方的身份。
消息类型
BGP头部主要字段解释如下:
Marker:长度:16-Byte;用于标明 BGP 报文边界,所有 bit 均为“1”;
Length:长度:2-Byte;BGP 报文总长度(包括报文头在内),以 Byte 为单位。
Type:长度:1-Byte;BGP 报文的类型。
其取值从 1-5 来表示 5 种报文,分别表示 Open、Update、Notification、Keepalive、Route-refresh 报文;
open
1、Version:协议的版本号
2、My Autonomous System:发送者自己的AS号
3、Hold Time:死亡时间,在收到BGP对等体的OPEN报文后,对收到的BGP报文和发出BGP报文二者的Hold Time时间作比较,选择较小的作为协商结果,默认Hold Time时间为180s
4、BGP Identifier:发送者的router-id
5、Opt Parm Len:表示Optional Parameters(可选参数)的长度。如果此值为0,表示没有可选参数。
6、Optional Parameters:此值为BGP可选参数列表,每一个可选参数是一个TLV格式的单元
Parm. Type:占1个字节(无符号位),为可选参数类型。我们现在的实现中,只在type值为2时有意义,表示携带的参数为协商能力。
Parm. Length:占1个字节(无符号位),为Parameter Value的长度。
Parameter. Value:根据Parm.Type的不同值填写不同的参数内容,在Parm.Type为2表示协商能力时,Parameter.Value是表示所支持的各种协商能力的列表,列表中的每一个单元是如下的一个TLV三元组:
keepalive
保活,维持BGP邻居关系。周期发送,默认周期时间为60s,保持时间为180s。keepalive消息只包含19个8位的BGP 头,没有其他数据。
update
BGP使用Update消息来发送和撤销路由信息。
● 撤销路由的长度(Withdrawn Routes Length):Update报文中可以包含0条、1条或者多条准备撤销的BGP路由。该字段是一个无符号整数,它指示了Update报文中所包含的“撤销的路由条目”字段的长度(字节数)。
● 撤销的路由条目(Withdrawn Routes):这个字段用于存放需要被撤销的BGP路由前缀,如果有多条BGP路由需要使用这个Update报文来撤销,那么这个字段将包含一个BGP路由前缀的列表,每条BGP路由前缀包含两元,分别是前缀长度及路由前缀。
● 总路径属性长度(Total Path Attribute Length):这个字段指示了Update报文中路径属性的总长度。
● 路径属性(Path Attributes):当BGP路由器使用Update报文向邻居通告BGP路由时,该报文中就包含着路径属性字段。BGP定义了丰富的路径属性类型。本章将在“路径属性”一节中详细介绍常见的BGP路径属性。
● 网络层可达信息(Network Layer Reachability Information):这个字段用于存放需要被通告的BGP路由前缀,如果有多条BGP路由需要使用这个Update报文来通告,那么这个字段将包含一个BGP路由前缀的列表,每条BGP路由前缀包含两元,分别是前缀长度及路由前缀,当然,一个Update报文用于通告拥有相同路径属性的路由前缀。
notification
Error code:占1个字节(无符号位),定义错误的类型,非特定的错误类型用零表示。
Error subcode:占1个字节(无符号位),指定错误细节编号,非特定的错误细节编号用零表示。
Data:指定错误数据内容。
Route-refresh
用来通知对等体自己支持路由刷新能力;用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。
主要字段的解释如下:
AFI(Address Family Identifier):地址族标识符(2字节)。
Res.(Reserved field):保留区域(1字节),发送方应将其设置为0,接收方应当忽略该区域的信息。
SAFI(Subsequent Address Family Identifier):子地址族标识符(8字节)。
状态机
BGP状态机描述的是BGP邻居的建立过程,BGP状态机共有有六种状态,如图:
下面详细介绍BGP的六种状态:
- ldle状态
ldle(空闲)状态,BGP拒绝任何进入的连接请求,IdIe状态是BGP的初始状态。在ldle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件(如运行BGP协议)后,BGP才开始尝试和其他BGP对等体进行TCP连接,并转至Commect状态。任何状态中收到NOtification报文或TCP拆链通知等Error事件后,BGP都对转至ldle状态。 - Connect状态
Connect(连接)状态下,BGP等待TCP连接的建立完成后再决定后续操作。在Connect状态下,BGP启动连接重传定时器(通常计时器为30s),等待TCP完成连接。如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent(开放)状态;如果TCP连接失败,那么BGP转至Active(活跃)状态;如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其他BGP对等体进行TCP连接,停留在Connect状态。 - Active状态
Active(活跃)状态下,BGP将尝试进行TCP连接的建立,是BGP的中间状态。在Active状态下,BGP总是在试图建立TCP连接,如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态;如果TCP连接失败,那么BGP停留在Active状态;如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。 - OpenSent状态
在OpenSent(开放集)状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、Holdtime等进行检查。如果收到的Open安博文正确,那么BGP发送KeepAlive报文,并转至OpenConfirm(打开确认)状态;如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至IdIe状态。 - OpenConfirm状态
OpenConfirm(打开确认)状态下,BGP等待KeepAlive或Notification报文。如果收到KeepAlive报文,则转至Established(确认)状态;如果收到Notification报文,则转至ldle状态。 - Established状态
在Established(确认)状态下,BGP可以在对等体之间交换Update、KeepAlive、Route-refresh报文和Notification报文。如果收到正确的Update或KeepAlive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接;如果收到错误的Update或KeepAlive报文,那么BGP发送Notification报文通知对端,并转至ldle状态。
注意:Route-refresh报文不会改变BGP状态。如果收到Notification报文,那么BGP转至ldle状态。如果收到TCP拆链通知(FIN),那么BGP断开连接,转至ldle状态。
在BGP对等体建立的过程中,通常可见的三种状态是ldle、Active、Established。BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。
BGP路由通告原则
- 多条路径时,BGP Speaker只选最优的给自己使用(负载均衡和FRR除外)。
- BGP Speaker只把自己使用的路由(最优路由)通告给相邻体。
- BGP Speaker从EBGP获得的路由会向自己所有BGP相邻体通告(包括EBGP和IBGP)。
- BGP Speaker从IBGP获得的路由不向自己的IBGP相邻体通告(反射器除外)。
- BGP Speaker从IBGP获得的路由是否通告给自己的EBGP相邻体要根据IGP和BGP同步的情况来决定。
- 当收到对端的refresh报文并且本端邻居支持refresh能力,BGP Speaker将把自己所 有BGP路由通告给对等体。
- GR过程中,主备倒换方在GR结束时BGP Speaker会把自己所有BGP路由通告给对等体。GR即Graceful Restart (平滑重启,可以避免流量中断。)
引入路由
BGP协议本身不发现路由,因此需要将其他路由(如IGP路由等)引入到BGP路由表中,从而将这些路由在AS之内和AS之间传播。BGP协议支持通过以下两种方式引入路由:
Import方式:按协议类型,将RIP路由、OSPF路由、ISIS路由等协议的路由引入到BGP路由表中。为了保证引入的IGP路由的有效性,Import方式还可以引入静态路由和直连路由。
import-route protocol [ process-id ] [ med med | route-policy route-policy-name ]
Network方式:逐条将IP路由表中已经存在的路由引入到BGP路由表中,比Import方式更精确。
network ipv4-address [ mask | mask-length ] [ route-policy route-policy-name ] 或
network ipv6-address prefix-length [ route-policy route-policy-name ]
选路规则
当到达同一个目的网段存在多条路由时,BGP通过如下的次序进行路由优选:
前提:丢弃下一跳不可达的路由
- 优选Preferred-Value(优选协议首选值)属性值最大的路由,默认为0,华为特有的。
- 优选Local_Preference属性值最大的路由。本地优先级属性在整个AS内传递,但不会传递到AS之外,值越大越优先,一般用作AS 内路由器选择一个最优出口去往外部。缺省的本地优先级100 。
- 本地(local)始发的BGP路由优于从其他对等体学习到的路由,本地始发的路由优先级:优选手动聚合>自动聚合>network>import>从对等体学到的
- 优选AS_Path属性值最短的路由
- 优选Origin属性最优的路由。Origin属性值按优先级从高到低的排列是:IGP、EGP及Incomplete
- 优选MED属性值最小的路由
- 优选从EBGP对等体学来的路由(EBGP路由优先级高于IBGP)
- 选到Next_Hop的IGP度量值最小的路由
- 优选Cluster_List最短的路由
- 优选Router ID(Orginator_ID)最小的设备通告的路由
- 优选具有最小IP地址的对等体通告的路由
上述规则依序排列,BGP进行路由优选时,从第一条规则开始执行,如果根据第一条规则无法作出判断,例如路由的Preferred-Value属性值相同,则继续执行下一条规则,如果根据当前的规则,BGP能够决策出最优的路由,则不再继续往下执行。
记忆口诀:PL-lao-men,前2条取值越大越优,后几条取值越小越优,当前8条属性全部相同时,可以形成路由负载分担
注 意:
在公网中到达同一目的地的路由形成负载分担时,系统会首先判断最优路由的类型。若最优路由为IBGP路由则只是IBGP路由参与负载分担,若最优路由为EBGP路由则只是EBGP路由参与负载分担,即公网中到达同一目的地的IBGP和EBGP路由不能形成负载分担。
BGP属性
属性可以是公认的或可选的、强制的或自由决定的、传递的或非传递的。属性也可以是部分的。
Origin属性
Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:
IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。
Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。
AS_Path属性
AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。在接收路由时,设备如果发现AS_Path列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。
当BGP Speaker传播自身引入的路由时:
当BGP Speaker将这条路由通告到EBGP对等体时,便会在Update报文中创建一个携带本地AS号的AS_Path列表。
当BGP Speaker将这条路由通告给IBGP对等体时,便会在Update报文中创建一个空的AS_Path列表。
当BGP Speaker传播从其他BGP Speaker的Update报文中学习到的路由时:
当BGP Speaker将这条路由通告给EBGP对等体时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP设备根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
当BGP Speaker将这条路由通告给IBGP对等体时,不会改变这条路由相关的AS_Path属性。
Next_Hop属性
Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常,Next_Hop属性遵循下面的规则:
BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
Local_Pref属性
Local_Pref属性表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。Local_Pref属性仅在IBGP对等体之间有效,不通告给其他AS。Local_Pref属性可以手动配置,默认为100。
ATOMIC_Aggregate
有时BGP发布者会收到两条重叠的路由,其中一条路由包含的地址是另一条路由的子集。一般情况下BGP发布者会优选更精细的路由(前者),但是在对外发布时,如果它选择发布更粗略的那条路由(后者),这时需要附加上ATOMIC-AGGREGATE属性,以知会对等体。它实际上是一种警告,因为发布更粗略的路由意味着更精细的路由信息在发布过程中丢失了。在进行路由聚合时,对于聚合的路由信息会添加ATOMIC-AGGREGATE属性。
MED属性
MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,默认为0。
团体属性
团体属性(Community)用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。团体属性分为自定义团体属性和公认团体属性。自定义团体属性为4个字节AA:NN(前两个字节一般代表AS号。)
公认团体属性分为4类,
1,Internet : 缺省属性,所有属性都属于Internet,此属性的路由可以通告给所有BGP邻居。
2,No_Export : 收到此属性的路由后,不将该路由发布给其他 AS。
3,No_Advertise : 收到此属性的路由后,不将该路由通告给任何BGP邻居。
4,No_Export_Subconfed : 在联盟中使用,仅在成员 AS 内传递。
当路由器存在多个公认团体属性时,传递范围最小的生效。
扩展团体属性为八个字节(Type:Administrative:Assigned)。
Originator_ID属性和Cluster_List属性
Originator_ID属性和Cluster_List属性用于解决路由反射器场景中的环路问题。
ORIGINATOR_ID
当反射器RR被部署时,ORIGINATOR_ID是在AS内部防止路由环路。
在RR环境中,第一个RR创建ORIGINATOR_ID属性,并用发起该路由的路由器标识router id设置它。
所谓发起该路由的路由器,满足以下一种情况时,ORIGINATOR_ID则是该路由器的标识router id。
- 在本地AS始发路由的BGP宣告者,如:network方式注入;
- AS内通过ebgp学到路由的边界路由器。
当ibgp的宣告者接收到路由包含它自己的ORIGINATOR_ID时,则丢弃该路由。
如果ORIGINATOR_ID已经存在,BGP的宣告者就不会重新创建。
CLUSTER_LIST
CLUSTER_LIST是另外一种BGP属性,它 记录了路由穿越的簇。如果列表中发现了本地CLUSTER_ID,路由就会被丢弃。
与ORIGINATOR_ID作为AS内部防环机制不同,CLUSTER_LIST只用于RR的防环,因为客户机和非客户机不了解它属于哪个簇。
RR在反射路由时会创建或更新CLUSTER_LIST。比如:RR从客户机反射路由到非客户机,或从非客户机反射路由到客户机,或从客户机反射路由到另一个客户机时,它都会把本地的CLUSTER_ID添加到CLUSTER_LIST里。
有一些情况RR不会被创建CLUSTER_LIST:
RR发起路由是不会创建CLUSTER_LIST;
当RR向外部AS通告路由时,已有的CLUSTER_LIST会清除;
当RR从外AS学到路由通告给客户机和非客户机时,它不会创建CLUSTER_LIST。
Aggregator
1)当执行路由聚合时,当前 Router 可以为该聚合路由添加 Aggregator 属性,并在其中记录本地 AS Number 及 Router-ID;
2)继续传递:在路由传递过程中,需要保存 Aggregator 属性。
BGP数据库
1)IP路由表
全局路由信息库,包括所有最优的IP 路由信息。
2)BGP路由表
BGP路由信息看,包括本地BGP Speaker 通告的路由信息,将其中最优路由添加到IP路由表中。
3)邻居表
对等体邻居清单列表,包括对等体两端的邻居信息及邻居列表。
4)adi-RIB-IN
对等体宣告给本地speaker的未处理的路由信息库
5)adj-rib-out
本地speaker宣告给指定对等体的路由信息库。
路由反射器
鉴于IBGP水平分割规则,R3 不能向 R4 及 R5 通告从R2学来的路由,只有R2与R4和R5直接建立IBGP关系并通告。Router Reflector(RR,路由反射器)技术能够解决该问题,可以简化 IBGP Full Mesh 需求。
路由器角色
1)RR(Route Reflector):路由反射器;允许把从 IBGP 对等体学到的路由反射到其他 IBGP 对等体的 BGP 设备,类似 OSPF 网络中的 DR。
2)RR Client:路由反射器客户端;与 RR 形成反射邻居关系的 IBGP 设备。在 AS 内部客户机需要与 RR 直连。
3)Non-Client:非客户机;既非 RR 亦非 Client 的 IBGP 设备。在 AS 内部,非客户机与 RR 之间,以及所有的非客户机之间仍然必须建立全互联关系(不必直连)。
Originator(始发者):在 AS 内部始发路由的设备。
Cluster(集群):路由反射器及其客户机的集合。Cluster_ID,默认时为 RR 的 BGP Router ID。
当配置路由反射器时:
1)需要将一台 BGP Router 指定为 RR 的同时,还需要指定其关联 Client;
2)至于 Client 本身,无需做任何配置,它并不知晓网络中存在 RR 设备;
配置命令
# BGP配置路由反射器及其客户。
[Huawei-bgp] peer {group-name | ipv4-address } reflect-client
# 缺省情况下,每个路由反射器使用自己的Router ID作为Cluster ID;
[Huawei-bgp] reflector cluster-id {cluster-id}
常见组网
备份RR组网
RR1 和 RR2配置相同的 Cluster ID,并互为客户端。
同级多集群RR组网
各集群的 RR 互为 Non-Client 的 IBGP Full Mesh
分级多集群RR组网
2 级-RR 同时是 1 级-RR 的客户机
实践案例
路由反射器实践案例1
BGP联邦
- 在联邦内部保留联邦外部路由的NEXT_HOP属性
- 公布给联邦的路由的MED属性在整个联邦范围内予以保留
- 路由的LP属性在整个联邦范围内予以保留
- 在联邦范围内,将成员AS号压入AS_PATH,但不公布到联邦外,并且使用TYPE3、4的AS_PATH
- AS_PATH中的联邦成员AS号用于在联邦内部避免环路;联邦内成员AS号不参与AS_PATH长度计算
BGP安全性
MD5/Keychain
peer 12.1.1.2 password cipher Huawei 或
peer 12.1.1.2 keychain 1
配置BGP GTSM功能
peer 12.1.1.2 valid-ttl-hops 1
gtsm default-action { drop | pass}