BGP是什么
BGP
Border Gateway Protocol(当前使用的版本是 BGP-4)
动态路由协议可以按照工作范围分为IGP以及EGP。IGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换;而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换,BGP则是EGP的一种。
BGP是一种增强的路径矢量路由协议,同时BGP是拥有丰富的策略控制技术的外部网关协议。多运行于AS与AS之间。
AS---自治系统---由单一的组织或机构所管理的一系列IP及其网络设备所构成的集合
AS的来源 1,AS之间可能是不同的机构或企业,相互之间不能完全信任,使用IGP会存在暴露网络信息的风险 2,范围太大,会导致路由信息收敛速度过慢,设备对相同目标认知不同
AS编号---IANA组织分配---16位二进制---0~65535,其中1和65535保留,真实的取值范围是1-65534,其中1-64511称为公有AS号,64512-65534称为私有AS号,目前已经有拓展版的AS号,由32位二进制构成
AS之间通过重发布完成路由交换---1,选路不佳 2,ASBR归属问题
BGP协议的特点:
1,BGP是基于TCP协议进行数据传输,必须先建立TCP连接,再建立BGP会话连接
2,仅具备触发更新,不再进行周期更新
3,BGP协议只传递路由信息,不会暴露AS内部的拓扑信息
4,BGP被称为无类别路径矢量协议
无类别—传递时携带路径矢量协议
矢量——矢量方向性:谁传递给我的路由信息,谁就是我的下一跳
BGP协议在获取路由信息时通过传递路由条目的方式
BGP被称为无类别路径矢量协议---传递路由条目时携带子网掩码
距离矢量---是以一个路由器为一跳来传递信息
距离矢量是算法的概念,IGP协议主要是计算AS内部的路由信息
路径矢量---是以一个AS为一跳传递信息
路径矢量不是算法,因为BGP只是将IGP计算好的路由信息传递给AS,路由的搬运工
BGP与引GP协议有本质上的区别,IGP协议主要的任务是将AS内部的未知网段信息计算获取到路由信息,而BGP则主要是将通过IGP协议计算出的路由信息进行搬运,并不会计算路由信息。
EGP协议的关注点
1,可控性---AS之间传递大量路由信息,这些信息所谓可控指方便干涉选路,做路由策略。
BGP协议为了保证可靠性,直接舍弃了开销值。取而代之的是GBP给每一条路由信息赋予了很多属性,之后可以通过属性来干涉选路
BGP协议具有触发更新,但是一定没有周期更新
2,可靠性---BGP协议为了保证传输的可靠性,直接使用TCP协议进行传输---179端口
两台运行BGP协议的设备,需要网络管理员手工配置邻居的P地址,从而实现数据通讯。
AS-BY-AS
- 在BGP的视角当中,会将一个AS看做为一个整体。
- 因为BGP是将一个AS看做一个整体,但是在该整体内部数据传输时,并非相同,故BGP默认不支持负载均衡功能
3,AS-BY-AS---BGP是将一个AS看做一个整体---BGP不支持负载均衡---因为不能判断出AS里面的路由信息---如果到达同一个目标的多条路径时,则BGP只会选择其中一条(通过属性判断)
OSPF使用夸层封装---设置了hello包,确认机制等保证可靠性,RIP---UDP---使用周期更新机制保证可靠性
BGP协议的传输可靠性均由TCP协议来保证,但是TCP协议只能实现单播通信,所以BGP协议无法自动发现邻居关系,只能手工指定。
在BGP中,因为使用BGP进行传输,所以可以实现非直连建邻,而非直连建邻需要建立在IGP可达的基础上
BGP的对等体关系
BGP因为传输层使用的是TCP协议,所以,只要在TCP协议可以正常建立会话的基础上就可以完成BGP会话的建立工作---BGP支持非直连建邻。-前提网络可达。-->BGP协议的搭建是建立在IGP协议之上。
- EBGP对等体关系---不同的AS之间的BGP路由器
- EBGP对等体一般使用直连方式建立邻居关系,故而,TTL数值被设定为1
- 两台路由器之间要建立EBGP对等体关系,需要满足如下条件
- 两台路由器所属的AS不同-->判别方式:本地设备通过网络管理员的配置知晓对端的AS,从而判断是否处于相同AS。
- 配置EBGP时,peer命令所指定的邻居IP地址必须为网络可达,保证TCP连接可以正常建立。
- EBGP对等体一般使用直连方式建立邻居关系,故而,TTL数值被设定为1
- IBGP对等体关系---同一个AS内部的BGP路由器
- IBGP对等体一股使用非直连建邻,故而TTL数值被设定为255
缺省情况下,BGP协议使用报文出接口作为TCP连接的本地接口IP。但是在某些情况下,我们可以指定BGP对等体之间的会话IP地址;例如,在BGP对等体关系中,常使用环回接口地址作为通讯的源地址。原因是因为loopback接口非常稳定,而且可以借助AS内的IGP协议实现冗余来保证可靠性。
总结:
- 无类别路径矢量协议
- BGP使用单播更新来发送数据,基于TCP实现通讯
- 增量更新
- 具有丰富的路径属性来取代IGP中的度量值参数,从而控制选路
- 可以在控制层流量的出入口通过路由策略实现可控性
- 默认不被用于负载均衡会通过各种选路规则选择出一条最优路径信息
- BGP支持认证以及路由聚合
BGP数据包
发现邻居---手工指定
open报文---建立对等体关系---通过发送open报文发送一些自己的相关参数。如果open报文里面的参数匹配那么就可以建立邻居,如果不匹配就不能建立邻居。
- RID---在BGP中,每一台设备也需要拥有身份标识,这个身份称为RID
(1)可以手工配置---需要保证唯一性,需要保证按照IP地址的格式配置
(2)也可以自动获取---和OSPF规则一样
- OPEN报文中将携带发出者的RID,对端收到后,将和自己的RID进行比对,如果相同,则证明RID冲突,对等体关系建立失败,如果不同,则可以正常建立对等体关系。
- 认证字段
- 如果认证方式或者认证数据不通,则导致建邻失败。
- 该字段参数永远以MD5形式,存储在TCP的选项字段中。
- Hold Time--保活时间
- BGP在建立对等体关系时两端需要协商该参数,并保持一致。但是该参数并不会影响BGP对等体关系的建立。
- 如果两端的保活时间不同,则按照较小的一端数值来执行。
- 如果在该时间内未收到对端发送来的报文信息,则认为BGP连接断开。该时间默认为180S,报文的周期发送时间为保活时间的1/3,即60S。
- 该参数可以设置为0,此时代表不发送keepalive:报文周期保活。
- 因为BGP会话是基于TCP会话建立,只要TCP判断连接断开,则BGP会话断开,故保活机制对于BGP而言并不那么重要,而设定保活机制原因仅仅是因为TCP判断会话断开所需要的时间过长,为了加快收敛速度,添加保活机制。
- 路由刷新功能
注意:在进行BGP配置时,指定的对等体IP地址必须和对端发送的源IP地址相同,否则无法建立对等体关系。
OPEN报文中的其他参数(但是不会影响对等体关系的建立)
Hold-time---保活时间---在发送open报文中将携带保活时间,默认180s,如果在保活时间内收到keep live报文或update报文将刷新保活时间,否则,时间归零后,则将判定对等体失效。---双方发送open报文时携带该参数,该参数不同不影响对等体关系建立,但是执行需要统一,否则将按照保活时间小的作为执行时间
注意:是否支持路由刷新功能也将在open包中携带并进行协商,如果双方都支持,则可以正常使用该功能,如果有一方不支持,则将不开启该功能
keep-live报文---主要进行保活对等体关系
1,可以周期性的保活对等体关系
2,在发送open报文建立对等体关系时充当确认报文来使用---这里的确认主要是确认open报文中的参数,如果对方发送的open报文中的参数符合建立要求,则将按照keep live报文进行确认,代表统一建立对等体,而数据包传递可靠性的确认是通过TCP来保证
注意:周期时间根据保活时间来决定的---1/3的保活时间。默认180s保活时间则将以60s为周期发送报文
update报文
真正携带路由信息的数据包,会携带路由信息的网段信息,以及掩码信息,以及路由条目附加的属性---内含撤销路由字段,如果由路由信息失效将携带在该字段在通知对端
Notification报文---BGP协议的预警机制
当BGP检测到一个错误的时候,将携带这个数据包进行告警,告知对端错误点在哪,这个预警机制将保障BGP的全过程(包括TCP建立会话的过程)。
route-refresh路由刷新报文 ---用于改变路由策略后请求对等体重新发送路由信息
注意---这个功能需要对等体双方均支持路由刷新才行
BGP状态机
注意:BGP的状态机仅仅描述的是对等体建立过程中的不同阶段,因为BGP可以做到建立对等体和发布路由分开完成
Idle---空闲状态---在BGP建立对等体之前的初始状态
等待网络管理员手工指定邻居信息,IP地址,AS号
当指定邻居后,将进入一个检查阶段,检查要求建立对等体的目标地址是否在本地路由表中(是否可达),可达则进入下一状态,不可达则建立失败,停留在Idle状态
Connect状态---连接状态---尝试进行TCP会话的建立。
(华为逻辑—一直停留在该状态发送SYN报文)
- 该状态会开启一个连接重传定时器---32s
- 当该计时器时间超时(在该时间段内没有收到任何一个回复报文),则本端重新发送一次TCP连接请求报文
- 如果此时本地判断TCP状态进入到establish状态,则认为TCP连接建立成功,进入opensent状态,,开始发送open报文
- 如果此时本地收到的是拒绝(非确认)报文或者本设备没有发出ACK报文,则认为TCP连接建立失败,进入到Active状态,反复尝试建立连接。
- 如果BGP在连接重传定时器时间内,没有收到对等体的响应,那么BGP会继续尝试与对等体建立TCP会话,并一直处于该状态。
注意:建立双方都将发起TCP会话连接,但是一方发起就可以建立双向会话通道,所以,双方都发起,最终会保留后发送建立的会话
Active--尝试状态(华为逻辑—一直停留在该状态发送SYN报文)
- 当第一次TCP会话建立失败,则进入该状态。
- 如果建立成功,则进入opensent状态;如果建立失败,则停留在active状态。
- 使用在connect状态开启的连接重传定时器来发送链接建立请求报文,当建立成功后,该计时器才会被关闭。
opensent状态
- 本地发送出open报文,同时也将收到对端发送的open报文,并予以回复。
- 如果收到的open报文中的参数本端认可,则回复keepalive报文;否则回复notification报文。
- 如果回复keepalive报文,则进入openconfirm状态;如果回复notification报文,则进入idle状态。
openconfirm状态
- 等待对等体对于本地发出的open报文参数的回复。
- 如果收到的是keepalive报文,则从为BGP会话建立成功,进入到establish状态。
- 如果收到的是notification报文,则认为BGP会话建立失败,断开TCP连接,回到idle状态。
Established状态---标志着BGP对等体建立
- 在该状态可以发送除了open报文以外的所有BGP数据报
BGP工作过程
(1)基于IGP、静态、直连路由协议实现IP可达---前置要求(不是BGP工作过程)
(2)手工指定对等体关系,实现单播通信。通过三次握手建立TCP会话通道,之后,BGP所有的报文都通过TCP会话通道传递
(3)通过open报文和keep live报文进行对等体关系的建立,在对等体关系建立完成之后,会把对等体关系收集记录在本地的一张表中---邻居表
open报文用来携带参数信息
keep live报文用来进行参数确认
最终生成BGP邻居表
(4)使用update更新报文携带路由信息传递给邻居,数据包中包含目标网络号,掩码以及属性,之后,BGP会将发送的以及收集到的路由信息都记录在本地的一张表中---BGP表(如果到达目标网段存在多条路由信息时,将都记录在本地的BGP表中,但是仅选择其中最优的(通过属性对比选择)的加载到路由表中(因为BGP不支持负载均衡))
(5)选择到达目标网段最优路径加载到本地的路由表
(6)收敛完成后,将使用keep live报文行周期保活(可选)---1/3hold time---默认60s---可以设置为0关闭周期保活性质。
(7)如果全过程中出现错误,使用notification报文进行告警
(8)如果发生结构突变,则将进行触发更新---直接发送update报文进行增量更新
BGP的路由黑洞
BGP同步更新规则-为了避免BGP路由黑洞问题
当一台路由器从自己的IBGP对等体学习到一条IBGP路由时,它将不能使用这条路由或者将这条路由通告给其他设备,除非他又从IGP协议中学习到这条路由信息---要求BGP路由与IGP路由同步
华为与思科默认禁止使用该规则,华为不允许打开该规则,思科允许打开该规则
解决方法:
1.让两台运行BGP设备在物理或逻辑上直连
2.所有设备运行BGP协议---暂时最常用
3.将BGP路由引入到IGP中。
4.MPLS--多协议标签交换-现网环境使用的解决方案
BGP的防环
EBGP水平分割机制(形象记忆名称,效果无异,从该AS区域传出的路由不能再传回该区域)
通过AS_Path属性进行防环,其本质运用的是AS-BY-AS原理,将一个AS区域看作一个整体,该属性会记录下该路由信息所经过的所有AS的AS号。当设备收到一条路由信息时,会查看该属性内容,如果其中存在有与本地AS号相同的信息,则不接受该路由信息。
AS_Path防环(新经过的添加在最前面,下图有误)
IBGP水平分割机制(官方名词)
R5设备可正常学习10.1.1.0/24
BGP规定:当路由器从一个IBGP对等体学习到某条BGP路由时,它将不能再把这条路由信息通告给任何IBGP对等体--IBGP水平分割机制。
解决思路:
1.将原本的IBGP对等体关系替换为EBGP对等体关系--在同一个AS下---联邦
2.手工设定让某台路由器将从IBGP学习到的路由信息传递给某个BGP对等体---路由反射器
3.构建全互联的IBGP对等体关系——暂时常用。
BGP的基础配置
使用直连接口IP地址来建立EBGP对等体关系
1、启动BGP协议
[r1]bgp 100 ----启动BGP协议,并且规定其AS号
2、配置设备的RID数值,一般选择设备的loopback接口的IP地址
[r1-bgp]router-id 1.1.1.1
3、配置BGP对等体信息,包含了对等体的IP地址以及对等体所在的AS号
[r1-bgp]peer 12.0.0.2 as-number 200
使用环回接口建立非直连的IBGP对等体关系
1、启动BGP协议
[r2]bgp 200
2、配置设备的RID数值
[r2-bgp]router-id 2.2.2.2
3、配置BGP对等体信息
[r2-bgp]peer 3.3.3.3 as-number 200
4、修改数据包中的源IP,对等体双方均需要进行修改
[r2-bgp]peer 3.3.3.3 connect-interface LoopBack 0
使用环回接口建立EBGP对等体关系
一般在EBGP对等体设备间,会使用多条链路进行连接,起到备份的作用,故可以使用环回接口来建立。
问题:此时TCP会话会正常建立,转而建立BGP会话。但是,对设备而言,此时的对端IP检查会发现是通过静态路由或IGP路由才可实现网络可达。那么也就意味着此时需要通过多跳才能到达目的地,而数据包中的TTL=1,发现错误,故两端均会发送notification报文进行告警,并断开BGP和TCP会话。
修改TTL数值:两边均需要修改
[r4-bgp]peer 5.5.5.5 ebgp-max-hop 2 ---修改TTL=2,如果不加参数,则修改为255
使用display bgp peer 命令查看BGP邻居表
Peer | V | AS | MsgRcvd | MsgSent | Out | Up/down | State | prefRcv |
对等体IP地址 | 版本号 | 对等体所在AS号 | 已经收到的数据包数量 | 发送的数据包量 | 出站队列 | BGP协议的启动时间 | 状态机 | 收到的路由信息数量 |
手工建立邻居关系时,所指定的建邻的IP地址必须和收到的数据包中的源IP地址相同才可以正常建立邻居关系。否则,邻居关系将建立失败。---->修改发送方数据包中的源IP地址。
BGP的路由发布
通过network命令发布路由信息
在BGP中,network命令只能用来发布路由信息。对于BGP而言,只要是路由表中存在的路由信息,都可以通过network命令发布,并且发布的路由必须时本地可用的路由信息。
[r1-bgp]network 1.1.1.1 32 ----发布1.1.1.1/32的路由信息
发布路由时,网络号和掩码信息必须与全局路由表中的信息一致。
[r1]display bgp routing-table ----查看BGP路由表
NextHop:谁发送的路由信息,下一跳就为谁。如果是本地始发,则该字段为0.0.0.0。
状态码----路由条目最前面的符号
*,代表可用;设备收到路由条目后,会根据下一跳属性参数来查询本地路由表,查看该地址是否可达,如果可达,则认为这条路由条目可以使用,如果不可达,则这条路由条目不能使用。
>,代表优选;当设备收集到多条到达相同网段的路由信息时,将依据路径属性进行路由优选,从而选择出最优的一条路由信息,该路由信息可以被路由器加载到全局路由表中,并且向下一跳BGP路由器进行传递。
i,代表这条路由信息时从IBGP对等体学习到的
如果一条BGP路由信息不可用,则这条路由信息不会参与到路由优选过程。BGP协议在传递BGP路由信息时,只会传递可用且优的路由条目,即*>的状态码。
该条路由信息传递到R3后,因为AS-BY-AS规则,认为此时是在一个整体中进行数据传递,那么路由信息的内容不会发生改变,所有路径属性相同。
这就会导致R3认为传递这条路由信息的人是R1,其下一跳属性为12.0.0.1。而R3设备验算失败,这条路由不可用,即没有*,也没有>
解决思路:
[r2-bgp]peer 3.3.3.3 next-hop-local ----R2在给3.3.3.3传递路由信息时,将下一跳属性修改为本地
BGP在全局路由表中的下一跳是跟着BGP路由表中的下一跳属性一致。
总结:
1. 完成所有路由器的IGP配置
2. 使用直连接口建立EBGP对等体关系
3. 使用环回接口建立IBGP对等体关系
4. 使用connect-interface命令修改IBGP的源IP地址
5. 使用next-hop-local命令修改路由传递的下一跳属性
6. (可选)如果存在使用环回接口建立EBGP对等体,需要使用ebgp-max-hop命令修改TTL数值
通过重发布的方式发布路由
[r2-bgp]import-route ospf 1 ---将通过OSPF进程1学习到的路由信息重发布到BGP中。
Ogn----起源码属性,标识这条路由信息的起源。
i
代表这条路由信息时起源于AS内部使用network命令通告的路由信息。
e
代表这条路由信息起源于EGP协议---现在几乎看不到。
?
除了以上两种方式获取到的路由信息。
在BGP协议中,不在乎这条路由信息到底属不属于本地的直连,只在乎这条路由信息在本地全局路由表中是否可用。只要可用就可以通过BGP进行通告