1. 功能描述 && 场景
1.1. 定义:
BGP(border gateway protocol)是一种不同自治系统的路由设备之间进行通信的外部网关协议(exterior gateway protocol, EPG);
1.2. 主要功能:
在不同自治系统(autonomous sustems, AS)之间交换网络可达信息,并通过协议自身机制来消除路由环路和容量超限;
1.3. 场景举例
众所周知,设备和设备间、地区与地区间的联系都需要路由设备进行管理(包括最短路径决策),以上所说的具有相同管理体制和通信风格的通信群体可划分为一个AS,假如一个国家就是一个AS,一个AS有多个邻接的AS还有很多路由器,那么国内的AS管理设备也都是同一个AS,可组成IBGP,而不同国家之间的AS管理设备就是不同的AS,可组成EBGP,对于国家间的边缘路由器,对外对内所能分享的信息和所管理的信息是不一样的,类似新闻媒体,对于外国传入的路由信息不可胡乱更改,想知道某些外国的信息也不一定就要和这个国家连接在一起,所以EBGP是非全连接的,而在同一个AS下,就要尽量全连接,这有助于最短路径决策(AS各设备对外是统一的),所以IBGP是全连接。
隐患:重复路由、环路、容量。
1.4. 设计目的:
为方便AS间管理;
1.5. 优点:
(1)实现系统间路由互通;
(2)确保AS管理的独立性;
(3)可扩展性;
2. 分类 && 拓扑
2.1. BGP分类
IBGP:相同AS之间的BGP。
EBGP:不同AS之间的BGP。
2.2. 简单配置:
2.3. BGP拓扑
3. 状态 && 报文
3.1. 状态
状态一:Idle
处于Idle状态的BGP进程不接受任何邻居发送过来的邻居建立的请求,除非触发了BGP start事件,这事件一般是由用户配置BGP触发的,一旦触发了BGP start事件,设备就会初始化一个connect-retry timer,并且向指定邻居发起建立TCP 连接的请求,然后就进入了connect状态。
状态二:connect
处于connect状态的设备会试图完成与邻居的TCP连接,如果连接一旦建立,设备就会清除connect-retry timer,发送open message,然后进入open-sent状态。如果连接建立失败,设备就会重置connect-retry timer,然后等待邻居发送过来的连接建立请求,这时就进入Active状态。如果connect-retry timer超时,设备就会重置它,并试图与邻居建立TCP连接,BGP仍然保持在connect状态。如果在connect状态中设备遇到错误,就会回到Idle状态。
状态三:ative
处于Active状态的设备仍然试图完成与邻居的TCP连接,如果连接一旦建立,设备就会清除connect-retry timer,发送open message,然后进入open-sent状态。如果connect-retry timer超时,设备就会重置它,并试图与邻居建立TCP连接,BGP会回到connect状态。如果邻居试图建立TCP连接的请求报文中的源地址与本地邻居表中的地址不符,设备就会陷入active状态。如果在active状态中设备遇到错误,就会回到Idle状态。
状态四:Open-sent
在open-sent状态中,设备会等待邻居发送过来的open message,一旦接受到邻居发送过来的open message,设备就会检查open message中的所有字段,如果发现错误,设备就会发送Notification message通告这个错误,并且中断TCP连接,回到Idle状态。如果所有的字段都匹配,设备就会发送第一个Keepalive message,初始化Holdtimer和Keepalive timer,进入open-confirm状态。如果在open-sent状态中设备遇到错误,或是Holdtimer超时,设备就会发送Notification message通告错误,并回到Idle状态。
状态五:Open-confirm
设备在open-confirm状态会等待邻居发送过来的Keepalive message,一旦收到,就会进入Established状态。如果在open-confirm状态中设备遇到错误,或是Holdtimer超时,设备就会发送Notification message通告错误,并回到Idle状态。
状态六:Established
BGP邻居建立成功
3.2. 报文
3.2.1. TCP
涉及三次握手报文、复位报文(RST)、四次挥手报文、数据报文(PSH)。所涉及的TCP报文中,目的端口号为179,是BGP专用。
3.2.2. BGP
BGP报文由BGP报文头和具体报文内容两部分组成。
BGP报文头包括三的部分,总长19字节。各个部分的格式和功能如下:
Marker:占16字节,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。
Length:占2个字节(无符号位),BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。
Type:占1个字节(无符号位),BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的):
TYPE值 | 报文类型 |
---|---|
1 | OPEN |
2 | UPDATE |
3 | NOTIFICATION |
4 | KEEPALIVE |
5 | REFRESH(RFC2918) |
BGP的运行是通过消息驱动的,共有5种消息类型,这些消息有相同的报文头。这些消息通过TCP协议进行传播(端口号是179)。消息最长为4096字节,最短为19字节(只包含报文头)。
3.2.2.1. OPEN(建联)
version:表示协议的版本号,现在BGP的版本号为4。
My autonomous System:发送者自己的AS域号
Hold Time:发送者自己设定的hold time值(单位:秒),用于协商BGP对等体间保持建立连接关系,发送KEEPALIVE或UPDATE等报文的时间间隔。BGP的状态机必须在收到对等体的OPEN报文后,对发出的OPEN报文和收到的OPEN报文两者的hold time时间作比较,选择较小的时间作为协商结果。Hold Time的值可为零(不发KEEPALIVE报文)或大于等于3,我们系统的默认为180。
BGP Identifier:发送者的router id。
Opt Parm Len:表示Optional Parameters(可选参数)的长度。如果此值为0,表示没有可选参数。
Optional Paramters:此值为BGP可选参数列表,每一个可选参数是一个TLV格式的单元(RFC3392)。
3.2.2.2. UPDATE(更新)
Unfeasible Routes Length:标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。
Withdrawn Routes:包含要撤销的路由列表,列表中的每个单元包含1字节的Length域和可变长度的Prefix域。
Total Path Attribute Length:标明Path Attributes部分的长度。其值为零时,表示没有路由及其路由属性要通告。
注意:当且仅当path属性中只含有NLRI时报文为合法,否则属性表中缺失AS_PATH、ORIGIN、NEXT_HOP任意wellknown属性都是不合法报文。
3.2.2.3. NOTIFICATION(终止)
Error code:占1个字节(无符号位),定义错误的类型,非特定的错误类型用零表示。
Error subcode:占1个字节(无符号位),指定错误细节编号,非特定的错误细节编号用零表示。
Data:指定错误数据内容。
相关错误码如下:
NO | 类型 | 错误码 | 中文 |
1 | 报文头 | 0 | |
2 | 1/1 | 连接不同步 | |
3 | 1/2 | 错误消息长度 | |
4 | 1/3 | 错误消息类型 | |
5 | OPEN报文 | 2/1 | 不支持版本号 |
6 | 2/2 | 错误对端AS号 | |
7 | 2/3 | 错误BGP标识符 | |
8 | 2/4 | 不支持的选项参数 | |
9 | 2/5 | 认证失败 | |
10 | 2/6 | 不支持的HOLDTIMER | |
11 | 2/7 | 不支持能力类型 | |
12 | UPDATE报文 | 3/1 | 畸形属性表 |
13 | 3/2 | 未识别的公认属性 | |
14 | 3/3 | 缺少公认属性 | |
15 | 3/4 | 属性标识错误 | |
16 | 3/5 | 属性长度错误 | |
17 | 3/6 | 无效origin | |
18 | 3/7 | AS路由环路 | |
19 | 3/8 | 无效的nexthop | |
20 | 3/9 | 可选参数错误 | |
21 | 3/10 | 无效网络字段 | |
22 | 3/11 | 畸形AS_PATH | |
23 | 超时 | 4/0 | hold timer超时 |
24 | 状态机 | 5/0 | FSM错误 |
25 | 系统终止 | 6/1 | 路由超限 |
26 | 6/2 | 人为shutdown | |
27 | 6/3 | undo peer的时候 | |
28 | 6/4 | 人为reset | |
29 | 6/5 | 连接拒绝 | |
30 | 6/6 | 其他的配置改变 | |
31 | 6/7 | 连接冲突解决 | |
32 | 6/8 | 资源不足 | |
33 | 6/9 | BFD down导致BGP session down | |
34 | 6/0 | 其他所有情况 |
3.2.2.4. KEEPALIVE
只含有BGP报文的报文头,且 type == 4。
3.2.2.5. REFRESH(不常用)
Field字段 | Length长度 | Description描述 |
---|---|---|
AFI | 2字节(无符号位) | 表示地址族id,与UPDATE报文中的定义相同。 |
Res | 1字节(无符号位) | 所有为应全为零,在接收报文时,此位被忽略。 |
SAFI | 1字节(无符号位) | 与UPDATE报文中的定义相同 |
3.2.3. 其他报文
BGP本身并不会产生路由,路由的起始是依赖于其他路由协议的,例如:network方式,涉及ospf等协议,此外,还有重分发和路由汇聚方式。
4. 路由属性
4.1. 报文携带路由属性
属性类型 | 属性值 | 注意事项 |
1:Origin | IGP | 这是wellknown属性,正常情况不可或缺 |
EGP | ||
Incomplete | ||
2:As_Path | AS_SET | |
AS_SEQUENCE | ||
AS_CONFED_SET | ||
AS_CONFED_SEQUENCE | ||
3:Next_Hop | 下一跳的IP地址 | |
4:Multi_Exit_Disc | MED用于判断流量进入AS时的最佳路由 | |
5:Local_Pref | Local_Pref用于判断流量离开AS时的最佳路由 | |
6:Atomic_Aggregate | BGP Speaker选择聚合后的路由,而非具体的路由 | |
7:Aggregator | 发起聚合的路由器ID和AS号 | |
8:Community | 团体属性 | |
9:Originator_ID | 反射路由发起者的Router ID | |
10:Cluster_List | 反射路由经过的反射器列表 | |
14:MP_REACH_NLRI | 多协议可达NLRI | 可在无三大wellknown属性条件下合法 |
15:MP_UNREACH_NLRI | 多协议不可达NLRI | 不可在无三大wellknown属性条件下合法 |
16:Extended Communtities | 扩展团体属性 |
4.1.1. origin code
定义路径信息的来源,取值如下:
0 == IGP:网络层可达信息来源于AS内部,从IGP路由表通过network命令学习到的路由携带此属性;
1 == EGP:网络层可达信息通过;
2 == INCOMPLETE:通过别的方式学习网络层可达信息,使用重分发学习的路由携带此属性;
这个属性可以通过配置设备来完成改变。
4.1.2. next hop
(1)在IBGP中:nh不会更新(无对应算法)
(2)在EBGP中:IGP每过一个路由就会更新。
(3)从本地到EBGP对等体,下一跳变为自己。
(4)从EBGP对等体到本地再到IBGP对等体,下一条不变。
4.1.3. AS_PATH
描述了一条前缀先后经过的AS路径,不过是反序的,即最后路过的AS排列再这个属性的首位,其目的是为了防止环路。
(1)设备可默认或通过配置造成通路附加(在AS_PATH顶部增加本设备AS或配置的AS)。
(2)AS_PATH格式:
AS-SET:无序性
AS-SEQUENCE:保序性
(3)EBGP对等体间AS_PATH携带自身AS,IBGP间无。
4.1.4. local_preference
本地优先级,仅使用于IBGP对等体之间的UPDATE消息中,EBGP之间并不会携带此属性,默认值为100,可以配置默认值,仅本AS内部传输,即本地的路由前缀匹配的本地优先级会通告给本AS所有路由器。
4.1.5. MED
multi-exit-disc属性应用于不同AS间,用以区分到达相同邻居AS的多个出口点(两相邻AS),在EBGP和IBGP的UPDATE中均携带。
(1)MED携带于EBGP对等体之间
(2)MED越小越优先
(3)通过network或重发布方式获取的路由,如果直连,那么MED=0,如果来自IGP,那么MED来源于IGP;
(4)通过路由聚合获取的路由,本地MED无,邻居收到设置为0;
4.1.6. community
这个属性是一种路由标记,主要用于标识具有相同特征的BGP路由。Community属性有4个字节,前两个字节代表AS号码,后两个字节是管理上定义的标识符,格式为AA:NN。
4.2. 非报文携带属性
4.2.1. weight
这是个本地概念,在当前设备配置,在当前设备发挥作用,用意为:本设备的某neighbor权重为多少,weight越大越优。(取值0-65565,重分发默认32768,network来源或从邻居学习的默认0)
5. 路由优先级
在下一跳可达、关闭同步、未使用路由策略条件下:
序号 | 条目 | 规则 | 局限 | IBGP | EBGP |
1 | weight | 越大越优 | 本地 | √ | √ |
2 | local_pre | 越大越优 | 本AS | √ | × |
3 | 路由来源 | network > 重发布 > 路由聚合 | 无 | √ | √ |
4 | AS_PATH | 越少越优 | 无 | √ | √ |
5 | origin | 越小越优 | 无 | √ | √ |
6 | MED | 越小越优 | 本对AS | √ | √ |
7 | BGP | EBGP > 联邦EBGP && EBGP > IBGP | 无 | √ | √ |
8 | IGP度量 | 越小越优 | 无 | √ | √ |
9 | 等价负载均衡 | 负载均衡 | 无 | √ | √ |
10 | 纯EBGP路由 | 越老越优 | 无 | × | √ |
11 | router-id | 越小越优 | 无 | √ | √ |
12 | originator-id | 越小越优 | 关联RR中router-id相等 | √ | × |
13 | cluster-list | 越短越优 | 关联RR中originator-id相等 | √ | × |
14 | 邻居地址 | 越小越优 | 无 | √ | √ |
6. 路由策略
与之前的场景举例一样,国与国之间虽然网络可以互通,但是这并不代表别国的任何路由本国都可以获取并应用,事实上,BGP设备实质上也是防火墙设备,有过滤功能,是一个策略工具。
其所涉及工作组件如下:
6.1. 访问控制表:
6.2. 地址前缀列表:
6.3. 自治系统路径表(BGP):
AS路径过滤列表使用正则方式定义过滤规则。AS-Path是BGP属性,AS路径过滤规则仅应用于BGP网络。
6.4. 团体属性表(BGP):
团体是一组有相同特征的路由集合,团体属性是BGP的属性,可以降低BGP路由管理维护的难度。和ACL类似,团体属性列表可以定义多个表项,按照序号顺序进行匹配。只要有一个表项匹配了路由,则通过团体属性列表,不再进行后续匹配。
6.5. 扩展团体属性表(BGP):
扩展团体是一组有相同特征的路由集合,扩展团体属性是BGP的属性,可以降低BGP路由管理维护的难度。和ACL类似,扩展团体属性列表可以定义多个表项,按照序号顺序进行匹配。只要有一个表项匹配了路由,则通过扩展团体属性列表,不再进行后续匹配。
7. 路由反射
对于BGP环路问题,有两种解决办法:
(1)对于EBGP:AS_PATH。
(2)对于IBGP:不把从IBGP接收的更新传递给其他IBGP。
对于IBGP要全互联问题:
(1)并不会用排列组合的方式进行IBGP对等体间完全互联
(2)用反射,物理上非全互联,效果上达到全互联
7.1. 路由反射相关概念
7.1.1. 路由反射器:
在本设备上配置本设备的相对客户机,那么本设备就是路由反射器RR,两者都不是的为非客户机。
7.1.2. cluster:
路由反射器和其客户机设备之间通过IBGP连接组成一个集群。
7.1.3. cluster-id:
用来标识cluster。
7.1.4. originator-id:
RR产生的携带本AS内部发起者的router-id。
7.1.5. cluster-list:
由一系列的Cluster_ID组成,描述了一条路由所经过的反射器路径,这和描述路由经过的AS路径的AS-Path属性相似。
7.2. 路由反射过程
7.2.1. 连接限制:
客户机和RR必形成IBGP,客户机之间不需要建立BGP连接,非客户机与RR或RR的客户机间必然建立连接。
7.2.2. 反射限制:
从非客户机IBGP对等体学到的路由将发布给该RR的所有客户机;
从客户机学到的路由将发布给该RR的所有客户机和非客户机;
从EBGP学到的路由将发布给所有客户机和非客户机
7.2.3. 反射保护
客户机和非客户机之间环路:Originator_ID属性保证路由在反射器和客户机/非客户机之间的不出现循环
1)当一条路由第一次被RR反射的时候,RR将Originator_ID属性加入到这条路由,标识这条路由的始发路由器。
2)如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID
3)当其他BGP Speaker接收到这条路由的时候,将比较收到的Originator_ID和本地的Router ID,如果两个ID相同,BGP Speaker会忽略掉这条路由,不做处理
AS内部环路:Cluster_List 属性用于防止AS内部的环路
1)当RR在他的客户机之间或客户机与非客户机之间反射路由时,RR会把本地Cluster_ID添加到Cluster_List的前面。
2)如果Cluster_List为空,RR就创建一个
3)当RR接收到一条更新路由时,RR会检查Cluster_List。如果Cluster_List中已经有本地Cluster_ID,丢弃该路由;
4)如果没有本地Cluster_ID,将其加入Cluster_List,然后反射该更新路由
8. 路由聚合
当BGP网络规模大到一定程度,势必形成一种BGP路由表骇人的局面,如果设备都要存储和全套,那必不现实,减小路由表的规模将是个好点子,思路为只传递大概,并不传递明细。
8.1. 路由聚合方式:
network:
自带掩码,可按照掩码聚合。(传输源聚合)
aggregate-address:
有丰富聚合选项。(传输源或传输路径中聚合)
8.2. aggregate-address:
summary-only
该命令加入后,aggregate-address 宣告的路由中,明细路由将不会宣告。
supress-map
该命令用来抑制aggregate-address 宣告的路由中不包含某条明细路由。
attribute-map
该命令可以改变聚合路由的属性
AS-Set
不写该命令时,聚合路由的as-path是基于生成聚合路由的as-path,而不是明细路由的as-path,加入该命令后,聚合路由将继承明细路由的所有属性,包括as-path。
Advertise Map
设置汇聚路由的组成不包含特定明细路由,这样聚合路由就不会继承特定明细路由的属性。当在对BGP路由进行聚合的时候,用AS-SET属性对被聚合的路由将携带明细路由的AS号,利用advertise-map(外加route-map)来控制汇聚路由究竟对哪些明细路由进行汇聚,最后将汇聚后的BGP路由放入BGP表。