BGP-边界网关协议
AS定义:由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合。
AS划分的原因:
- 整个网络规模较大,伴随的是路由表中的路由数量进一步增加,路由表规模变大,路由收敛速度变慢,设备性能消耗加大。 – 范围太大
- AS之间可能是由不同的机构、公司,相互之间无法完全信任,使用IGP协议可能存在暴露AS内部的网络信息的风险。
不同的AS通过AS号进行区分,AS号存在16bit、32bit两种。
- 16位AS号,取值范围1-65534(0和65535保留),其中64512-65534为私有的AS号,可以自行使用,公有的AS号为1-64511
- 保留AS号
- RFC4893标准,23456 该AS号为保留AS号
- RFC5398标准
- 16位AS号:64496-64511 – 16个
- 32位AS号:65536-65551 – 16个
BGP基础
BGP-1 – RFC1105
BGP-2 – RFC1163
BGP-3 – RFC1267
BGP-4 – RFC1771
RFC (标准)
BGP协议介绍
1、RIP是基于UDP进行数据传输的,而UDP是一个不可靠的协议,他在传输过程中,可能会丢失某些数据。
2、缺省情况下,RIP协议的路由更新报文的发送间隔是30S,而如果两个AS内的路由表非常大,30S的时间可能还不够将所有的路由信息传递给对方AS,这样,整条链路完全就是为了RIP的通告报文服务,而不能转发数据流量。
解决方法:
- 将UDP协议更换为TCP协议。不用担心数据丢失,并且TCP会预先建立连接,也就让路由器有一个准备时间,而不是像RIP一样毫无准备的接收大量更新数据。
- 取消周期更新,改为触发更新。
- 在第一次路由数据同步完成后,如果有路由增加,就发送通告路由器增加的报文。如果路由删除,就发送一个通告路由删除的报文。
- 如果路由信息发生改变,就先发送一个通告路由删除的报文,再发送一个通告路由增加的报文。
运行BGP协议之间的设备传递路由信息,原因在于若传递拓扑信息,会导致路由器负载过高,并且会让对端AS看到本端的拓扑信息,引发安全问题。
BGP需要传递所有的通过BGP学习到的路由信息,并且运行了BGP协议的路由器,所维护的路由表包含了整个互联网的所有路由信息。
BGP特点
- BGP基于TCP(179端口),只要能够建立TCP连接,就可以建立BGP连接,使用单播更新来发送消息。
- 触发式更新,不再进行周期更新(增量更新机制)
- 只传递路由信息,而不会暴露AS内的拓扑信息
- 不传递拓扑的原因
- 拓扑信息资源占用量大
- 会暴露AS内部的拓扑连接情况
- 不传递拓扑的原因
- 无类别的路径矢量型协议
- 无类别 – 传递时携带真实子网掩码
- 矢量 – 方向性,谁传递的路由,谁为下一跳
- 距离矢量 – 将一个路由器看做一个单位计算距离
- 路径矢量 – 将一个AS看做一个整体,从而计算一跳。
- 具有丰富的路径属性来取代IGP中的度量值进行选路,可以由多个属性共同控制协议
- 可以在流量的进出口实行路由策略 – 可控性
- 默认不被用于负载均衡 – 会通过各种选路规则仅仅产生一条最佳路径
- BGP支持认证和聚合
IGP协议的主要任务是将AS内部的未知网段信息计算获取到,而BGP则主要是将IGP协议计算出来的路由信息进行搬运和传递,并不去计算路由。
BGP的特征
IGP协议追求的特点:
- 选路佳
- 收敛快
- 占用资源少
BGP协议追求的特点:
- 可控性
因为在重发布的过程中,由于会抹除原有度量值,会导致出现选路不佳的情况。而BGP为了弥补这个不足点,直接舍弃了开销值。取而代之的是设计了很多的路径属性。
- 可靠性
BGP因为只有触发更新,而不存在周期更新。所以,需要确保其可靠性,使用TCP为传输层协议。端口号为179。 – BGP会话的建立是手工指定的(单播形式)
IGP协议不选择使用TCP的原因:
1、TCP传输效率低
2、TCP传输占用资源大
3、TCP协议只能实现单播,所以,无法通过组播或者广播的形式发送数据,导致IGP协议无法自动发现邻居关系,只能手工指定。
AS-BY-AS
BGP将一个AS看做是一个整体。
BGP协议不支持负载均衡
EGP和IGP不同的追求
EGP:选路佳、收敛快、占用资源少
IGP:可控性、可靠性、AS-BY-AS
BGP的对等体关系
BGP因为传输层使用的是TCP协议,所以只要在TCP协议可以正常建立会话的基础上就可以完成BGP的建邻工作。
BGP支持非直连建邻(网络可达) – BGP的非直连建邻是建立在IGP(静态)之上的。
BGP存在两种对等体关系类型:EBGP、IBGP
- EBGP对等体关系
- 位于不同自治系统的BGP路由器之间的BGP对等体关系。
- EBGP对等体一般使用直连建立对等体关系。EBGP邻居之间的报文中TTL值被设置为1。
- 两台路由器之间要建立EBGP对等体关系,需要满足如下条件:
- 两个路由器属于不同AS
- 在配置时,peer命令所指定的对等体的IP地址必须路由可达。TCP连接必须正常建立。
- IBGP对等体关系
- 位于相同自治系统的BGP路由器之间的BGP对等体关系。
- IBGP对等体一般使用非直连建邻。IBGP邻居之间的报文中TTL值被设置为255。
- 在IBGP对等体中,常使用环回接口地址作为源目IP地址。
- 环回接口稳定
- 并且可以借助AS内部的IGP和冗余拓扑来保证可靠性。
BGP的数据包
BGP报文头部
Marker(标记):16Byte,该标记字段用于检测BGP对等体之间的同步丢失情况,并且在支持验证功能的情况下进行消息验证。如果消息类型为Open或Open消息中未包含验证消息,标志字段将被设置为全1,否则,标志字段值通过某些计算得到(作为验证进程的一部分)
Length(长度):2Byte无符号整数,指定了消息的全长,包括头部,BGP报文总长度在19~4096Byte之间。整个BGP报文的长度,Header+Message+Data。
Type(类型):1Byte,标识BGP的报文类型,有以下几种消息类型。
1-Open;2-Update;3-Notification;4-Keeplive;5-Route-refresh
BGP的各类报文
Route-refresh包 – 路由刷新包
作用:用来要求对等体重新发送指定地址族的路由信息。
一般为本端修改了相关路由策略之后让对方重新发送更新报文,本端执行新的路由策略重新计算BGP路由。
要求:双方均支持路由刷新功能。
Open包
是TCP连接建立之后发送的第一个报文,用于建立BGP对等体之间的连接关系。
Hold Time: 保活时间
BGP Identifier: BGP的标识符
- 与OSPF中的RID用法相同
- 全网唯一
- 获取方式:手工配置 > 最大环回接口 > 最大物理接口
BGP建邻需要协商的参数
-
AS号
- BGP的open报文会携带本地的AS号,通过比较两端的AS号可以判断对端是否和本端处于相同的AS。
- 不管这个AS号与本地是否相同,都不影响BGP对等体的建立
- 如果对方的AS号和本地指定对等体写的AS号不同,则会导致邻居关系无法建立。
peer 12.0.0.2 as-number 100
- BGP的open报文会携带本地的AS号,通过比较两端的AS号可以判断对端是否和本端处于相同的AS。
-
RID
- 通过对比open报文中的RID值,可以判断是否相同,若相同则会导致建邻失败。
-
认证
- BGP也可以进行认证,认证口令不同,则也会导致建邻失败。
- 该字段永远以MD5值的方式保存在TCP的选项字段。
-
保活时间
- 并不影响BGP对等体的建立
- BGP在建立对等体关系时,需要协商该参数。
- 如果在该时间内未收到对端发来的keepalive报文或者update报文,则认为BGP连接中断。默认180S。
- 报文更新时间:三分之一的保活时间。
- 若双方保活时间不一致,则按照小的时间执行。
- 该参数可以设置为0,若设置为0,则代表不发送keepalive报文。
-
路由刷新功能
Keepalive包
作用:用来进行周期保活
除了保活机制外,keepalive报文还在open报文协商参数时,临时充当确认报文 – 确认open报文中的参数是否认可。
Update包
作用:用于在对等体之间传递路由信息,可以用于发布、撤销路由。
需要携带的参数主要就是目的网络号、子网掩码信息和路径属性。
Unfeasible routes length(不可达路由长度):表示Withdrawn Routes字段的数据长度。如果Withdrawn Routes Length字段数值为0,则表示Withdrawn Routes字段没有任何数据,在Update消息中不会被显示。
Withdrawn Routes(撤销路由):该字段包括一系列的IP地址前缀信息,以<length,prefix>的格式来表示,比如<19,198.18.160.0>表示一个198.18.160.0 255.255.224.0的网络。
Path Attribute Length(路径属性长度):表示Path Attribute字段的数据长度。如果Path Attribute数值为0,则表示Path Attribute字段没有任何数据,在Update消息中不会被显示
Path Attributes(路径属性):为BGP提供选择最短路径,检查路由环路以及决定路由策略的信息
NLRI(网络层可达信息):它描述了一个路由和怎样到达它。在这个步骤中,一个NLRI是一个前缀。
Notification包
纯粹的告警机制。当BGP检测到错误状态时(对等体关系建立时、建立之后都可能发送该报文),就会向对等体发送该报文,告知对端错误原因。之后BGP连接会立即中断。
BGP的状态机
BGP的角色
Speaker
- 发送BGP报文的设备被称为BGP Speaker(发言者)
- 它接收或产生新的报文信息,并发布给其他BGP Speaker。Speaker角色是针对具体报文发送过程而言的,网络中每台BGP路由器均可称为自己发送BGP报文的Speaker。
Peer
- 相互交换报文的Speaker之间互相称为peer(对等体)
BGP的状态机
BGP的状态机仅描述的是对等体关系建立过程的状态变化。BGP可以将邻居建立过程和BGP路由收发过程分开。
IDLE - 空闲状态
所有设备启动BGP进程后,首先进入该状态。
进入该状态后,等待手工指定邻居。
当手工指定邻居之后,将会进入到一个检查环节。
- 检查环节:
需要检查手工指定的IP地址在本地全局路由表中是否可达,只有可达,才可以正常建立TCP的会话,如果不可达,则邻居关系建立失败,停留在IDLE状态。
若检查成功,则进入Connect状态。
Connect - 连接状态
建立TCP会话连接
在该状态下,会开启一个连接重传定时器。 --32S
如果成功建立TCP会话,会关闭连接重传定时器,并进入OpenSent状态。
如果建立失败,则进入Active状态。
如果重传定时器超时,BGP仍然没有收到对等体的响应,那么BGP会继续尝试与对等体建立TCP会话,并一直处于Connect状态。
Active - 尝试状态
该状态是因为第一次TCP会话建立失败进入的,在该状态会重新尝试建立TCP会话。
如果成功建立,则进入OpenSent状态,并会关闭连接重传定时器。
如果失败,则停留在Active状态。
与Connect状态共同使用同一个连接重传定时器。
OpenSent - 发出本地的Open报文状态
也将收到对端发送的open报文,并会查看其中的参数,如果参数没有问题,则本地将发送keepalive报文进行确认,之后进入openconfirm状态。
如果发现收到的open报文中的参数不认可,那么BGP会发送notification报文给对等体,并进入IDLE状态。
对等体关系的指定是双向的,所以当双方都使用peer命令指定了对等体后,均会主动与对等体建立TCP连接。但是这样就会建立两条TCP的双向连接,所以BGP会选择第一个TCP连接断开。
OpenConfirm - 等待确认状态
等待对端发来的keeplive报文。如果接收到对端发送的keeplive报文,则代表参数协商通过,会进入最终状态。
如果收到的是notification报文,则转至IDLE状态。
Established - 连接建立完成状态
对等体关系建立完成的标志
在该状态下,BGP可以和对等体交互Update报文、keepalive报文Route-refersh报文和notification报文
BGP的工作过程
1、基于IGP协议或静态路由实现邻居IP可达
2、启动BGP协议,并指定邻居关系
1、邻居之间单播传输报文,通过三次握手建立TCP会话通道
2、后续BGP所有的通讯都将基于TCP会话通道来传输。包括传输所需要的可靠性机制。
3、使用open报文和keepalive报文进行对等体关系的建立,open报文用来携带建立对等体关系时所需要使用的参数,keepalive报文用于参数的确认。最终完成对等体关系的建立,生成邻居表。
4、使用update报文来共享路由信息。信息中将携带目标网络号、掩码以及路径属性。之后,设备会将所有的自己发送的以及接受的路由信息记录在一张表中–BGP表。
5、将BGP表中的最优路由信息(通过路径属性选择)加载到全局路由表中。
6、此时路由收敛完成,将使用keepalive报文进行周期保活,默认保活时间为180S,周期发送时间为保活时间的1/3,即60S。
7、如果出现错误信息,则将使用notification报文进行告警
8、如果出现结构突变,则将使用update报文进行触发更新。
BGP的防环机制
EBGP的水平分割
AS_Path属性 – 记录AS路径的一个属性
当路由信息再一次传回本地AS时,路由器通过查看AS-Path属性,可以清楚的知晓该属性包含本地AS号,故拒绝学习该路由信息。
IBGP的水平分割
BGP规定,当路由器从一个IBGP对等体学习到某条BGP路由时,它将不能再把这条路由通告给任何IBGP对等体。
解决方案:
- 构建全连的IBGP对等体关系
弊端:
1、当AS内部设备数量巨大时,IBGP邻居关系会呈指数型增长,而非直连建邻之间传递的数据还是要依靠物理链路,故全连接建邻会导致占据大量的链路资源,并且路由器维护大量的TCP和BGP会话连接,需要消耗大量的设备资源。
2、网络的可扩展性差。
- 打破IBGP水平分割
- 联邦(IBGP -> EBGP)
- 路由反射器(人为强制让路由转发)
BGP的路由黑洞
由于BGP协议可以非直连建邻,所以导致BGP协议可能出现跨越未运行BGP协议的设备,导致BGP路由传递后,控制层面可达。但是数据层面,流量流经未运行BGP协议的设备时,无法通过,形成路由黑洞。
避免路由黑洞的方式 – BGP同步更新规则
当一台路由器从自己的IBGP对等体学习到一条BGP路由时,它将不能使用该条路由或把这条路由信息通告给自己的不能使用该条路由或把这条路由信息通告给自己的EBGP对等体,除非它又从IGP协议学习到这条路由,也就是要求IBGP路由与IGP路由同步。
在华为数通设备上,BGP同步更新规则缺省是被关闭的,并且华为也不允许开启BGP同步规则。
解决方案
- 让未运行BGP协议的设备运行BGP协议 – 建立全连接的IBGP对等体关系
- 物理或逻辑拓扑全联
- 在IGP协议中,重发布BGP协议的路由信息
- MPLS – 多标签标记交换(应用最广泛的方案)
BGP的基本配置
BGP建邻的基本配置
使用直连接口建立EBGP对等体关系
1、启动BGP协议
[r1]bgp 100 -----启动BGP进程,且标准本设备所在的AS号
2、设置Rid
[r1-bgp]router-id 1.1.1.1
3、配置BGP对等体,并指定对等体所在的AS号
[r1-bgp]peer 12.0.0.2 as-number 200
display bgp peer # 查看邻居表
邻居表参数
MsgRcvd - 收到的数据量
MsgSent - 发送的数据量
OutQ - 待发送的数据量
UP/DOWN - 处于当前状态的时间
State Pre - 处于的状态
FRcv - 接收到的路由条目数量
IBGP对等体的建立
由于直连接口建立对等体时,若链路终端,则会中断BGP会话。故在实际工程中,一个AS内部正常具有较为复杂的网络拓扑结构,设备到设备之间存在大量的备份和负载均衡
路径,因此建立IBGP邻居关系时,建议使用双方的环回接口来作为源/目IP地址。
配置
[r2]bgp 200
[r2-bgp]peer 3.3.3.3 as-number 200
[r3]bgp 200
[r3-bgp]peer 2.2.2.2 as-number 200
手工建立邻居关系时,所指定的建邻的IP地址必须和收到的数据包中的源IP地址相同才能正常建立邻居关系。否则,邻居关系建立失败。
[r2-bgp]peer 3.3.3.3 connect-interface LoopBack 0
将R2发送的数据包的源IP地址修改为loopback 0接口的IP地址
抓包后会发现一个问题,就是BGP此时仅建立了一次TCP连接,就完成了BGP会话的建立。这也就意味着,BGP会话的建立仅仅是依靠TCP会话,而并没有对这个TCP会话建立的方式有要求,该TCP会话是由谁发起的,谁是客户端,谁是服务端并不影响BGP对等体的建立。—在BGP协议中,TCP会话建立两次完全是多余的,而建立两次的原因也是因为双方路由器均会指定对等体(均将自己看做是客户端),从而发起建立连接请求。
而在当下场景中,R3作为TCP会话的服务端,已经认知到了自己本地已经有接口3.3.3.3,与自己本地配置的对等体建立了连接,所以本地也不会在发送所谓的TCP连接建立请求。
一般情况下,双方均要修改本地数据包的源IP地址。
使用环回接口IP地址建立EBGP对等体关系:
若EBGP对等体之间存在多条直连链路时,才可以使用环回建立EBGP对等体。 - 减少TCP连接和BGP会话,起到备份作用。
1、实现路由可达
ip route-static 5.5.5.5 255.255.255.255 45.0.0.5
ip route-static 4.4.4.4 255.255.255.255 45.0.0.4
2、对等体配置
[r4]bgp 200
[r4-bgp]peer 5.5.5.5 as-number 300
[r4-bgp]peer 5.5.5.5 connect-interface LoopBack 0
[r5]bgp 300
[r5-bgp]router-id 5.5.5.5
[r5-bgp]peer 4.4.4.4 as-number 200
[r5-bgp]peer 4.4.4.4 connect-interface LoopBack 0
因为EBGP之间的数据包的TTL值为1,故此时虽然可以建立TCP连接和BGP会话,但是路由器会认为该连接和会话存在异常,在BGP对等体建立完成后,发送notification报文断开连接
解决方法:修改TTL值
3、peer 5.5.5.5 ebgp-max-hop 2
不修改默认修改为最大值
4、peer 4.4.4.4 ebgp-max-hop 2
需要修改两边的TTL值,不然无法建立对等体关系,还存在状态机震荡。
BGP的路由发布
通过network命令发布路由
路由发布----对于BGP而言,只要是路由表中存在的路由信息,都可以通过network命令发布。
[r1-bgp]network 1.1.1.1 32 目标网络号 路由表中的掩码信息
注意:BGP使用network命令宣告时,该路由信息必须与全局路由表中存在的路由项一致。
display bgp routing-table - 查看BGP表
network - 目标网络号及掩码
nexthop - 下一跳,谁发送的路由,则下一跳写谁;如果是本地发布的路由,则下一跳写0.0.0.0
状态码:
*
代表可用
所有设备收到路由条目后,首先会根据下一跳属性中的参数来查询本地路由表,查看该地址的可达性。如果本地路由表中可达,则代表该路由信息可用;若本地不可达,则代表该路由信息不可用。
# 如果该路由条目不可用,则将不会参与到路由信息的优选过程中。
>
代表优选
当收到多条到达相同线网段的路由信息时,并且都可以用,则将依据属性在其中选择最优的路由信息进行加表及传递。
i
代表该路由信息是从IBGP邻居学习到的
s
代表抑制,被抑制的路由信息将不再加表和传递
对于R3而言,R2传递来的路由信息是不可用且不优的,原因在于下一跳属性未修改,无法递归。
解决思路:
peer 3.3.3.3 next-hop-local
将路由传递给自己的3.3.3.3邻居时,将路由中的下一跳属性改为本地。
配置总结:
1、完成所有路由器的IGP配置
2、使用直连接口建立EBGP对等体关系
3、使用环回接口建立IBGP对等体关系
4、是用connect-interface命令修改IBGP建邻源IP地址,
使用import命令引入路由
OGN - 起源码属性,标识一条路由信息的起源类型
i-IGP 代表这条路由起源于AS内部使用network命令通告出来的
不限于IGP、静态、直连
e-EGP 代表这条路由信息起源于EGP协议 - 现在几乎看不到
?-incomplete 除了以上两种方式,其他方式获取的路由信息都是该标识
BGP路由通告原则
-
当一条BGP路由器发现了多条可以到达同一地址的路由条目,该设备会通过一个路由选择过程在这些路由条目中选择一条最优的路由,将这条路由加入到全局路由表中,并且在向其他BGP对等体通告该路由条目时,也只会通告最优的路由。
- 通常情况下,路由器只会将最优的路由加载到路由表中,除了激活了负载均衡情况外。
-
当一台路由器从EBGP邻居学习到了BGP路由时,缺省情况下,会将该路由条目通告给所有的IBGP对等体以及EBGP对等体。
-
当一台路由器从IBGP邻居学习到了BGP路由时,缺省情况下,不会将这条路由信息通告给其他的IBGP对等体。
- 因为IBGP"水平分割原则"
-
当一台路由器从自己的IBGP学习到BGP路由时,如果同步规则被激活,只有从IGP协议也学习到该路由条目后,才会将BGP路由激活,并学习到本地,以及通告到EBGP对等体。如果同步规则被关闭,即使没有从IGP学习到该路由,也会将BGP路由通告给EBGP对等体。