BGP
- 可靠性
- 稳定性
- 可扩展性
- 灵活性
概述
路由分以下2种
- IGP:内部网关协议
- 距离矢量协议:RIP
- 内部网关路由选择协议:IGRP
- 高级距离矢量协议:EIGRP
- 链路状态协议:OSPF
- 中间系统:IS-IS
- EGP:外部网关协议
- BGP
- EBGP
- IBGP
- BGP
IGP | IBGP |
---|---|
在每一台路由器上都改变前缀的下一跳,以指向一个直连的地址 | 不改变前缀的下一跳属性 |
自动地发现并形成邻居关系 | 需要手工配置 |
提供有关如何穿越一个给定的AS或达到一个给定地点的信息 | 提供有关一个地点上的可用信息,但并不指明如何到达它 |
IGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换,而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换,BGP则是EGP的一种
- BGP是Border Gateway Protocol的简称
- BGP是一种增强的路径矢量路由协议
- BGP是拥有丰富的策略控制技术的外部网关协议
- BGP多运行于AS于AS之间
使用TCP作为其传输层协议
- BGP使用TCP作为其传输层协议,提高了协议的可靠性,且不需要专门的机制来确保连接的可控性
- 监听端口179
- 进行AS之间的路由选择,对协议稳定性要求较高
- BGP对等体之间必须在逻辑上连通
- 支持CIDR
- 触发式路由增量更新
- 从设计上避免了环路发生
- 增强型路径矢量路由协议
- BGP通过携带AS路径信息来标记途径的AS
- 无环路
- AS之间:BGP通过携带AS路径信息来标记途径的AS,带有本地AS号的路由将被丢弃
- AS内部:BGP在AS内学到的路由不再通告给AS内部的BGP邻居
路由策略丰富,能够对路由实现灵活的过滤和选择,可防止路由震荡(路由衰减)。易于扩展
IBGP | EBGP |
---|---|
全连接 | 不需要全连接 |
通告Local Pref,不修改AS_PATH | 修改AS_PATH |
不需要直连的连通性 | 默认需要,但是一半不需要共享共同的IGP |
需要保持前缀同步 | 不需要同步 |
IBGP路由不会重分布到IGP | 没有限制 |
自治系统AS
- 由同一个技术管理机构管理,使用统一选路策略的一些路由器的集合
- 每个自治区都有唯一的自治系统的编号,由IANA分配
- 1-64511是注册的公网编号,64512-65535是私有编号
- IBGP:当BGP运行于同一AS内部时
- EBGP:当BGP运行于不同AS之间时
工作原理
- 通过TCP建立BGP连接,发送Open消息
- 连接建立后,如果有路由需要发送或路由变化时,发送Update消息通告对端
- 稳定后要定时发送Keepalive消息以保持BGP连接的有效性
- 当本地BGP在运行中发现错误时,要发送Notification消息通告BGP对等体
- Route-Refresh消息同来通知对等体自己支持路由刷新
报文类型
Open报文
- 协商BGP参数:试图建立BGP邻居关系的2个路由在建立TCP会话之后开始交换OPEN信息以确认能否形成邻居关系,时TCP建立后发送的第一个信息
- BGP版本
- AS号
1 | Header - Message - Data |
- Header:
Marker(16B)
Length(2B)
Type(1B)
- Open:
Version(1B)
My AS(2B)
Hold Time(2B)
BGP Identifier(4B)
Opt Param Len(1B)
Optional Parameters(variable)
建立邻居
邻居建立不起来可能有以下原因
- 邻居没用达到此路由器产生的BGP数据包源地址的路由条目
- 邻居的对等体配置了错误的IP地址
- 邻居没有通过neighbor语句配置此邻居
- AS号码不匹配
Update报文
- 交换路由信息:该报文则是邻居之间用于交换路由信息的报文,其中包括
- 撤销路由信息
- 可达路由信息
- 及其各种路由属性
1 | Header - Update - Data |
- Header:
Marker(16B)
Length(2B)
Type(1B)
- Open:
- 不可达
Withdrawn Routes Length(2B)
Withdrawn Routes(可变长度)
- 可达
Path Attribute Length(2B)
Path Attribute(可变长度)
Network Layer Reachability Information(可变长度)
- 不可达
更新路由,交换网络层可达性信息
- 一个UPDATE消息一次只能通告一个路由,但他可以携带多个路径属性。
- 一个UPDATE消息一次也可通告多条路由,但他的路径属性必须相同。
- 一个UPDATE消息可以同时列出多个被撤销的路由
Keepalive报文
- 保持邻居关系:该报文用于BGP邻居关系的维护,为周期性交换的报文,用于判断对等体之间的可达性
1 | Header - Data |
- Header:
Marker(16B)
Length(2B)
Type(1B)
维持邻居
Notification报文
- 差错通知:BGP的差错检测机制,一旦检测到任何形式的差错,BGP Speaker会发送一个Notification报文,随后与之相关的邻居关系将被关闭
1 | Header - Notification - Data |
- Header:
Marker(16B)
Length(2B)
Type(1B)
- Notification:
Error Code(1B)
Error SubCode(1B)
Data(可变长度)
报错
Error Code | 错误类型 |
---|---|
1 | 消息头错误 |
2 | OPEN信息错误 |
3 | UPDATE信息错误 |
4 | 保持时间超时 |
5 | 状态机错误 |
6 | 终止 |
错误子码
- 消息头错误代码
- 1:连接非同步
- 2:错误的消息长度
- 3:错误的消息类型
- OPEN信息错误代码
- 1:不支持的版本号
- 2:错误的对等体AS号
- 3:错误的BGIP ID
- 4:不支持的可选参数
- 5:认证失败/表示反对
- 6:不可接受的保持时间
- UPDATE消息错误字码
- 1:畸形的属性列表
- 2:无法识别的公认属性
- 3:缺少的公认属性
- 4:属性标识位错误
- 5:属性长度错误
- 6:无效的ORIGIN属性
- 7:AS路由环路/表示反对
- 8:无效的下一跳属性
- 9:可选属性错误
- 10:无效的网络字段
- 11:畸形的AS_PATH
Route-Refresh报文
- 用于在改变路由策略后请求对等体重新发送路由信息
1 | Header - Route-Refresh - Data |
- Header:
Marker(16B)
Length(2B)
Type(1B)
- Route-Refresh:
AFI(2B)
Res.(1B)
SAFI(1B)
状态级
对等体之间的交互原则
- IBGP路由:只发布给EBGP对等体
- 防止环路产生
- IBGP全互联:维护路由表,这样才能传递,但是需要维护更多会话
- 是否传递给EBGP需要依靠IGP和BGP同步的情况决定,防止路由黑洞
- BGP同步:会先检测IGP路由表,只有在IGP也知道这条IBGP路由时,它才会被加入到路由表,并发布给EBGP对等体
- EBGP路由:发布给所有EBGP和IBGP对等体
- 保证IBGP下一跳可达
- 只将最优路由发布给对等体
- 只发送更新的BGP路由
连接一建立,BGP Speaker将把自己产生的所有BGP路由通告给新对等体
多条路径时,BGP Speaker只选最优的给自己使用
BGP Speaker只把自己使用的最优路由通告给对等体
IBGP 对等体之间不一定是物理上直连的,但必须保证逻辑上全连接,就是 tcp 连接能够建立即可。
Peer
任意的两个路由为了交换 BGP 路由信息而形成 TCP 连接叫做 Peers 或者 Neighbors。
BGP对等体交换完BGP全部路由表以后,以后就只发增量更新。BGP在BGP表中有一个版本号,在所有的BGP peers中都相同,BGP路由表变化以后就会引起版本号的改变。
成为BGP路由
- network命令:network路由信息
- import命令:引入路由信息
BGP数据库
- IP路由表:全局路由信息库,包括所有IP路由信息
- BGP路由表:BGP路由信息库,包括本地BGP Speaker选择的路由信息
- 邻居表:对等体邻居清单列表
- Adj-RIP-In:对等体宣告给本地Speaker的未处理的路由信息库
- Adj-RIB-Out:本地Speaker宣告给指定对等体的路由信息库
- 输入策略引擎
- 路径选择
- 输出策略引擎
BGP属性
BGP路由属性是一套参数,它是对特定的路由进一步的描述,简单来说就是一组描述BGP前缀特效的参数
- 公认必遵(Well-known mandatory)
- 所有BGP路由器都可以识别,且必须存在于Update消息中
- 如果缺少这种属性,路由信息就会出错
- 公认任意(Well-known discretionary)
- 所有BGP路由器都可以识别,但不要求必须存在于Update消息中
- 就算缺少这类属性,路由信息也不会出错
- 可选过度(Optional transitive)
- 在AS之间具有可传递性的属性
- BGP路由器可以选择是否在Update消息中携带这种属性,接受的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性
- 可选非过度(Optional non-transitive)
- BGP路由器可以选择是否在Update消息中携带这种属性,如果接受的BGP路由器不支持此属性,则相应的这类属性会被忽略,且不会传递给其他对等体
- Origin
- Well-known mandatory
- 用来定义路径信息的来源
- IGP
- 通过路由始发AS的IGP得到的路由信息,
network
命令 - 标识符为
i
- 通过路由始发AS的IGP得到的路由信息,
- EGP
- 通过EGP得到的路由信息
- 标识符为
e
- Incomplete
- 通过其他方式学习到的路由信息,
import
命令 - 标识符为
?
- 通过其他方式学习到的路由信息,
- AS_PATH
- Well-known mandatory
- 按矢量顺序记录某条路由从本地到目的地地址所要经过的所有AS编号
- Next hop
- Well-known mandatory
- 记录了路由的下一跳信息
- ~ IBGP - IBGP
- ~ IBGP - EBGP
- ~ EBGP - IBGP
- MED(Multi_Exit_Disc)
- Optional non-transitive
- 相当于IGP的代价值,用于判断流量进入AS时的最佳路由,即用来影响邻居AS流量进入本AS的最佳路径
- Local-Preference
- Well-known discretionary
- 表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由
- Atomic-Aggregate
- Well-known discretionary
- Aggregator
- Optional transitive
- Community
- Optional transitive
- 用于标识具有相同特征的BGP路由
- 自定义团体属性
- 公共团体属性
- Internet
- No_Advertise: 路由器收到带有这一团体值的路由后,不应把该路由通告给任何BGP对等体
- No_Export: 路由器收到带有这一团体值的路由后,不应把该路由通告给一个联盟之外的对等体
- 本AS传递
- No_Export_Subconfed: 路由器收到带有这一团体值的路由后,可以把该路由通告给他的IBGP对等体,但不应该通告给任何EBGP对等体
- Originator-ID
- Optional non-transitive
- 由第一个RR创建,且不被后续RR修改
- Cluster-List
- Optional non-transitive
- MP_Reach_NLRI
- MP_Unreach_NLRI
- Extended_Communities
BGP选路规则
- 如果此路由的下一跳不可达,忽略
- 路径未同步,但同步功能被启用
- 被入境策略拒绝,并且配置了入境温和重置
- 路由被惩罚
- 优先选首选值(
PrefVal
)最高的路由- 比较路由传入的路由器的
PrefVal
- 在被传入路由器上修改
- 比较路由传入的路由器的
- 优先本地优先级(
Local_Pref
)最高的路由- 默认100,默认没有才会加上
- 仅在IBGP对等体之间传递
- 在传出路由器上设置
- 优先选本地生成的路由
- 优先聚合路由
- 优先network > import
- 优先选AS路径(
AS_PATH
)最短的路由 - 比较Origin属性,依次优先选Origin类型为IGP,EGP,Incomplete的路由
- 优先选MED值最低的路由
- 仅在相邻2个AS之间传递
- 这样可以影响其他AS选择,也就是我来帮你选
- 优先选EBGP邻居学来的路由
- 优先选BGP下一跳IGP Metric较小的路由
- 当以上全部相同,则为等价路由,可以负载分担
AS_PATH
必须相同,当负载分担时,以下3条原则无效- 优先选Cluster_List最短的路由
- 优先选Originator_ID或者Router_ID最小的路由器发布的路由
- 比较对等体的IP Address,优先选具有较小IP Address的对等体学来的路由
BGP收敛
- 所有路由都被接受
- 所有路由都被安装到路由选择表中
- 所有对等体的表版本的计数都必须等于BGP表的表版本的技术
- 所有对等体的BGP的输入队列和输出队列都必须为0
BGP 收敛完成的时候,以后再有路由更新的时候,BGP 只发送增量路由。BGP 路由携带了丰富的属性,这些属性可以对路由进行过滤、选择和控制,正是这一特性使得 BGP 是如此简明而又如此灵活和强大。
BGP扩展属性
BGP安全特性
- MD5认证
- GTSM
- TTL安全保护机制
- 限制从对等体接受的路由数量
- AS_PATH长度保护
路由衰减
用来解决路由不稳定的问题,路由不稳定主要表现形式时路由震荡(route flaps),即路由表中的某条路由反复消失和重现。发生路由震荡时,路由协议就会向邻居发布路由更新,收到更新报文的路由器需要重新计算路由并修改路由表。所以频繁的路由震荡会消耗大量的带宽资源和CPU资源。
在多数情况下,BGP协议都应用于复杂的网络环境中,路由变化十分频繁,为了防止持续的路由震荡带来的不利影响,BGP使用衰减来抑制不稳定的路由
BGP衰减使用惩罚值来衡量一条路由的稳定性,惩罚值越高则说明路由越不稳定。路由每发生一次震荡(激活->未激活),BGP便会给此路由增加一定惩罚值(1000),当惩罚值超过抑制阈值时,此路由被抑制,不加入到路由表中,也不再向其他BGP对等体发布更新报文
被抑制的路由每经过一段时间(900s),惩罚值便会减少一半,这个时间成为半衰期。当惩罚值降到再使用阈值时,此路由变为可用并被加入到路由表中,同时向其他BGP对等体发布更新报文
BGP扩展
因为BGP使用TCP,并不需要真实线缆连接来建立拓扑,所以可能会产生路由黑洞,也就是IBGP内部没有全互联造成的,需要使用反射器或联盟来防止路由黑洞。
全互联也就是只传第一次路由,这样就不会有环路产生
BGP反射器
防止环路
- EBGP:通过AS_PATH属性,丢弃从EBGP对等体接收到的在AS_PATH属性里包含自身AS号的任何更新信息
- IBGP:BGP路由器不会将任何从IBGP对等体接收到的更新信息传递给其他IBGP对等体
- 带来的问题:为保证更新信息可以到达所有IBGP对等体
- IBGP Speaker之间要保证会话的全互联
- 路由反射:降低对指定路由器IBGP路由通告机制的限制,允许将从IBGP对等体接收到的更新信息传给某些IBGP对等体
- 联盟:将大的AS分成若干小的AS,而小AS之间建立EBGP对等体关系
解决水平分割造成的问题,要保证没用回路
路由反射器
- 允许将IBGP邻居学习到的路由发送给特定IBGP邻居,打破了IBGP邻居关系全互联的需求,减少IBGP会话数量
- 包括路由反射器(RR)和客户机
- 路由反射器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之间的IBGP会话
- RR与RR之间需要建立IBGP全互联
- 非客户端和非客户端需要建立IBGP全互联
- RR与非客户端之间需要建立IBGP全互联
反射规则
在向IBGP邻居发布学习到的路由信息时,RR按照以下规则发布路由
- 从EBGP对等体学习到的路由,发布给所有的非客户机和客户机
- 从非客户机IBGP对等体学习到的路由,发布给此RR的所有客户机
- 从客户机学习到的路由,发布给非RR的所有非客户机和客户机(除了发送方)
防环机制
- Originator_ID属性
- 该属性为可选非过度
- 用于集群内的防环
- 由路由反射器(RR)产生,携带了本地AS内该路由发送者的RouterID
用于防止在反射器和客户机/非客户机之间产生环路
- 长4个字节,属性类型为9,是由路由反射器(RR)产生的,携带了本地AS内部路由发起者的RouterID。
- 当一条路由第一次被RR反射的时候,RR将Originator_ID属性加入到这条路由,表示这条路由的始发路由器。如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID。
- 当其他BGP Speaker接收到这条路由的时候,将比较收到的Originator_ID和本地RouterID做比较,若相同,BGP Speaker会忽略掉这条路由,不做处理
当一个AS内存在多台RR为CLient提供冗余时,RR间的路由更新很有可能会形成环路,为防止该现象,引入了Cluster的概念
- Cluster_List属性
- 该属性为可选非过度
- 用于集群间的防环
- 由路由反射器(RR)产生,记录反射路由经过的集群
- 属性类型是10,由一系列Cluster_ID组成,描述了一条路由所经过的反射器路径,和AS_PATH有相似之处
- 当RR接收到一条更新路由时,RR会坚持Cluster_List,如果Cluster_List中已经有本地Cluster_ID,丢弃该路由,如果没用本地Cluster_ID,将其加入Cluster_List,然后反射该更新路由
通过4字节的Cluster_ID来标识Cluster,通常会使用Lookback地址作为ClusterID,一个Cluster里可以包括一个或多个RR,一个Client可以同时属于多个Cluster。传递时把ClusterID放进Cluster_List
备份RR
- 相同集群的路由反射器要共享相同的Cluster_ID
- Cluster_List的应用保证了同一AS内的不同RR之间不出现路由循环
BGP联盟
将一个AS划分为若干个子AS,每个子AS内部建立IBGP全连接关系,子AS之间建立类似EBGP连接关系,称为联盟EBGP
联盟AS内仍然需要保证IGP的连通性,才能保证数据包的正确转发。
联盟打破了水平分割
联盟防环机制
AS_CONFED_SEQUENCE, AS_CONFED_SET使用子AS的号码防环
- AS_CONFED_SEQUENCE
- 有顺序,类似AS_PATH
- AS_CONFED_SET
- 无顺序
反射器 | 联盟 |
---|---|
不需要改变现有网络拓扑,兼容性好 | 需要改变逻辑拓扑 |
配置方便,客户机不知道自己时客户机 | 所有设备需要重新配置,且需要支持联盟功能 |
集群与集群之间仍需要全连接 | 联盟的子AS之间时特殊的EBGP连接,不需要全连接 |
在大型网络中应用广泛 | 应用较少 |
BGP路由聚合
- 只向对等体发送聚合后的路由,从而减少对等体的路由条目
- 明细路由如果发送路由震荡,不会对网络造成影响
- 路由聚合分为自动聚合和手动聚合
使用Aggregator(AS,RouterID)表示聚合发生在哪个AS的哪个路由上
自动聚合
- 对BGP引入的路由进行有类聚合
- 配置聚合后,明细路由在路由表中将被抑制
- 不能对network发布的路由进行聚合
- 只对BGP引入的路由进行聚合
手动聚合
- 对BGP本地路由进行聚合,可以控制聚合路由的属性,以及决定是否发布具体路由
BGP增强特性
BGP ORF
使能BGP基于前缀的ORF功能
- 基于本地的入口策略构建对端的出口策略,实现BGP按需发布路由
- 包括基于前缀的ORF和VPN ORF
Active Route Advertise
路由必须同时满足在BGP协议层面优选与路由管理层面活跃两个条件,才能向邻居发布
- 默认情况下路由只需在BGP中优选即可向邻居发布,配置了此特性之后,路由必须同时满足在BGP协议层面优选与在路由管理层面活跃两个条件,才能向邻居发布
按组打包
- 将所有拥有共同出口策略的BGP邻居当作是一个打包组
- 每条待发送路由只能被打包一次然后发给组内所有邻居
4字节AS号概念
4字节AS号特性是将AS号的编码范围由2字节扩大为4字节
- 协议扩展
- 定义了一种新的Open能力码用于进行BGP连接的能力协商
- 2种新的可选过度属性,AS4_PATH和AS4_Aggregator属性
- 定义AS_TRANS(保留值23456)用于衔接2字节AS和4字节AS
Internet设计理念
优化BGP能力
- 建立对等体会话
- IBGP & EBGP
- 安全机制
- IBGP是否要全互联
- 路由更新起源
- 引入或者network
- 优化路由策略
- 可配置输出或者输入策略
- ORF
- 路由过滤和属性控制
- 发送接受路由进行过滤
- 属性控制
- 路由聚合
- 所见路由表规模
提高BGP可用性
- 冗余
- 路径要冗余
- RR冗余
- 流量对称
- 科学的设计网络,具体策略的应用以保证来去流量路径一致
- 负载均衡
- 当有多条路径存在时,可考虑通过适当策略实现流量的分载负担,以充分利用宽带
控制AS内部路由
- 非BGP路由与BGP路由之间的交互
- 一般情况下,非BGP路由可以通过路由引入或者network分发到BGP路由表种,对于分发到BGP中的路由,以使适合路由加载到BGP路由表中
- 默认路由
- 对于默认路由的发放,可以通过策略默认路由根据某些具体条件来下方默认路由
- 策略路由
- 通过策略路由来优化流量路径
控制大型AS
- BGP按组打包
- 路由反射器
- 联盟
- 通过路由反射器和联盟,减少IBGP会话数量,优化BGP大型网络
设计稳定的Internet
- 减少不稳定路由的产生
- 使用稳定的IGP路由协议
- 提升路由器的性能
- 减少人为失误
- 扩展链路带宽
- 提供BGP稳定性
- 应用新的BGP策略,使用BGP软复位
- 对于不稳定的路由,对其进行合理的惩罚,以减少对BGP的冲击
BGP指令
1 | # 邻居表 |