今天海翎光电的小编主要介绍一下BGP的相关基础知识,文章浅显易懂,适合对BGP完全没有了解的同学。
BGP介绍
边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的路径矢量路由协议。目前在IPV4环境下主要使用BGPV4,目前市场上也存在BGPV4+,BGPV4+在BGPV4的基础上支持多个地址族,如IPv6。
BGP协议本身不产生路由,而是转发本地路由表中来自其他协议生成的路由条目;AS之间正常存在大量的BGP邻居关系,且BGP协议不会计算最佳路径;因此在BGP协议中管理员需要进行策略来干涉选路
AS-自治系统
AS(自治系统),由单一的机构或组织所管理的一系列IP网络及设备所构成集合。
划分AS的原因:1.整个地球上的网络范围太大,单个网络收敛很慢且网络延迟大;2.每个网络可能是某个组织或公司组建的,他们并不想将自己辛苦组建的网络交给别人管理,所以需要自治管理
为了方便对自治系统进行管理,给每一个自治系统设计了一个号,即AS号。AS号由16位二进制构成,取值范围:0 - 65535,其中1 - 64511号为公有AS号, 64512 - 65534被设定为私有AS号。
因为传统的AS号存在不够用的情况,所以,目前大部分设备均支持拓展的AS号,由32位二进制构成。中国由于加入互联网较晚,所以中国的AS号大多都是扩展AS号。
BGP原理概述
想要AS之间互相通信,我们可以使用重发布,通过重发布将AS的路由信息导入到其他AS以达到AS间的互通,和重发布类似,BGP也是通过发送AS的路由信息以实现全网可达。那为什么AS间更多的是使用BGP而不是重发布呢?
BGP和重发布的区别
重发布要求AS间需要有ASBR,ASBR同时具有两个AS的路由信息,通过ASBR实现路由共享;而BGP是没有ASBR的,由于AS是自治系统,如果有ASBR,那这个ASBR归谁管理?如果只归一方管理,那他可以通过路由策略提高自己AS的流量的转发速度,所以BGP是AS间各出一个或多个运行BGP的路由器,让这些运行BGP的路由器建立邻居关系后交换路由信息。
重发布在导入路由时会洗掉开销值,会造成选路不佳的问题,而BGP具备强大的路由策略,BGP为路由信息设计了路径属性,通过属性进行选路,是的选路过程更加灵活,可控性更高。
BGP特性
BGP协议是无类别的路径矢量协议。无类别即BGP在传递路由时会携带子网掩码;路径矢量,不同与距离矢量,路径矢量是以一个AS为单位,而距离矢量是以一个路由为单位,距离矢量是一种路由算法,而BGP不需要计算路由,它只需将以计算好的路由传递给了邻居即可。
我们对IGP(内部网关协议)和EGP(外部网关协议)的要求不同,IGP需要在一个AS内计算路由,所以我们要求IGP选路佳、收敛快、占用资源少;而EGP不同,EGP协议只需传递AS以计算好的路由,所以我们对EGP的可控性、可靠性要求更高。
EGP的追求:可控性:AS之间需要传递大量的路由信息,所谓可控,就是可以更方便的干涉选路,更容易做策略,以弥补重发布的不足。为了保证路由传递的可控性,更方便干涉选路,BGP协议舍弃了开销值,取而代之的是他为路由信息设计了很多路径属性。可以通过属性进行选路,是的选路过程更加灵活,可控性更高。
EGP的追求:可靠性:BGP协议设备间需要交互大量的路由条目,但又不能选择周期更新来占用链路资源,故只能进行触发更新;又为了保证传输的可靠性,直接选择TCP协议作为传输层的协议来完成数据收发,使用的是TCP 179号端口。但使用TCP协议通讯也会造成一些问题,传输效率降低,只能单播通讯(TCP需要去建立会话),占用资源会加大 ,用TCP之后,便不能通过广播或者组播去自动发现邻居进行通信了。
由于BGP依靠TCP协议传输数据,BGP协议可以实现非直连建邻,非直连建邻的前提条件是邻居双方网络可达, BGP的非直连建邻是建立在IGP的基础上。
BGP的邻居更准确的说是BGP的对等体,我们可以根据邻居关系的建立情况,将BGP的邻居关系分为两种:
因为EBGP对等体之间一般采用直连建邻的方法,所以,我们将EBGP对等体之间的数据包中的TTL值设置为1;而IBGP对等体之间往往需要非直连建邻,所以,IBGP对等体之间的数据报中的TTL值我们设置为255;当然,如果EBGP对等体之间需要非直连建邻,则需要手工修改TTL值。
EGP的追求::AS-BY-AS:BGP将一个AS作为一个单位来看待,以一个AS为一跳,
BGP特点总结
无类别路径矢量 -----距离矢量的升级版—AS–BY–AS
使用单播更新来发送所有信息;基于TCP 179端口工作
增量更新,仅触发更新,无周期更新
具有丰富的属性来取代IGP中度量进行选路,有多个参数控制协议
可以在进项和出项对流量实施强大的策略,可控性非常强大
默认不被用于负载均衡-----通过各种选路规则仅仅产生一条最佳路径
BGP支持认证和聚合(将现有的IP地址合并成较大的、具有更多主机地址的路由域)
BGP的数据包
BGP协议中所有的数据包均需要在tcp会话建立后,基于TCP的会话来进行传输及可靠性的保障。
Open包
Open包主要用来建立邻居关系,正常进收发一次即可,Open包会携带一些建邻需要协商的参数,邻居互相认同对方的参数才可以建立邻居关系。以下为Open包会携带的一些参数:
AS号:在手工建立邻居关系需要时声明邻居的AS号。对端收到后会检查声明的AS号是否和本地的AS号一致,一致才可以建立邻居关系。
认证:BGP在建邻时如果做认证的话,需要比对双方认证口令,不一致则无法建立邻居关系。
Router-ID:主要区分和标定路由器。OPEN报文中携带RID的目的是为了确保双方的RID不一致。确保其唯一性,如果相同,则无法正常建立邻居关系。
这里的RID和OPSF的格式一致,也是由32位二进制构成,并且遵循IP地址的格式。也可以通过两种方法获取,一种是手工配置;另一种是自动获取(先在自己路由器的环回接口中选择最大的IP地址作为RID,如果没有环回接口,则在自己物理接口中选择IP地址最大的作为RID)。 注意:在接收邻居数据包时,其中的源IP地址和手工指定的邻居的IP地址一致才可以正常建立邻居关系。 |
holdtime:保活时间, 这个参数默认值为 180S,即180S内若收不到对方发送的keeplive或者UPdate包则将判定BGP链接中断。双方建邻时携带这个值,但是并不要求必须相同。但是,执行时必须相同,所以,将会选择二者中较小的作为执行时间
keeplive包
用来保活邻居关系,默认周期1min查询邻居关系是否存在;实际保活TCP会话。
Keeplive报文的发送周期为保活时间(hold time)的1/3,保活时间默认为180S,则周期发送时间默认为60S。
KeepLive包还有一个作用:在收到对方发送的OPEN报文后,临时充当确认包的作用。
TCP本身具有确认机制,可以确保传输的可靠性,这里的确认主要是确认OPEN报文中携带的参数,如果认同对方的参数,则将回复Keeplive包进行确认。 |
Update包
BGP中的更新包,用来携带路由条目,包括目标网段,子网掩码信息以及BGP的各种属性
在UPdate包中存在撤销路由字段,我们可以直接将不可达的路由信息放在该字段下进行通告,以达到传递失效信息的目的。而不需要像RIP那样采用带毒传输的方式。
Notification包
BGP设计的一个告警机制,出现错误数据时收发,当BGP检测到一个错误的时候,将会用这个包进行告警,告知对端错误点在哪
Route-refresh包
用于改变路由策略后请求对等体重新发送路由信息,前提是对等体双方均支持路由刷新
BGP的状态机
BGP的状态机仅描述BGP对等体建立过程中的状态变化。因为BGP可以做到建立邻居关系和发布路由分开完成。
idle状态:空闲状态,一旦指定邻居,就处于idle状态,然后BGP会首先检查指定的IP地址在本地路由表中是否可达,如果可达,则开始尝试建立TCP会话,进入下一个状态;如果不可达,则将停留在idle状态
connect状态:进行TCP会话连接的状态。如果TCP会话建立成功,则进入下一个状态;如果TCP会话建立失败,则进入Active状态,该状态会反复尝试TCP连接,如果尝试超时,则放弃重连,退回到idle状态。
注意:在建立TCP会话连接时,双方都会尝试建立连接,一方建立成功,则将创建一个双向的TCP会话通道;双方都建立成功,则将会出现两个双向通道。则需要关闭一个TCP通道。后面开始发送OPEN报文,其中会携带RID,双方将比较RID,仅保留RID大的一端发起的TCP连接,RID小的一端发起的TCP连接通道将被断开。 |
OpenSent:开始发送OPEN报文,报文中携带建立邻居关系所需的参数。当收到对端发送的OPEN报文后,并且报文里的参数没有问题,则将回复一个keeplive作为确认,进入下一个状态;
OPENConfirm:在该状态,本段在等待对端keeplive包,当对端收到本端的Open报文且确认参数无误,发送keeplive包进行确认进入下一个状态。
Established :建立完成状态 ,标志着对等体关系的建立。
BGP的工作过程
配置完成后,邻居间单播TCP三次握手,目标端口179,建立TCP的会话;之后所有的BGP协议数据包基于该会话进行传输
会话建立后,邻居间正常收发一次open报文,并互发keeplive包进行确认建立BGP的邻居关系,并生成邻居表
邻居关系建立后,默认每1min,使用keeplive周期保活邻居关系,周期保活TCP会话
邻居关系建立后,管理员选择性将本地路由表中通过任意来源获取的路由条目,向BGP协议中进行宣告;使用updata数据包进行邻居间路由共享;之后生成BGP表;
本地对BGP表中的路由进行选择,默认将最优路径加载于路由表中(最优-仅仅基于BGP的选路规则,不一定为最佳路径;BGP默认不支持负载均衡)
若出现错误信息,邻居间将使用Notification报文进行报错操作
收敛完成,仅keeplive周期保活即可,默认保活时间为180S,周期发送时间为60S。
若发生结构突变,则将直接发送UPdate报文进行触发更新。
BGP的路由黑洞
AS间通过EBGP对等体交换路由信息,然后通过单播将获取到的路由信息发送给IBGP对等体,使AS所有运行BGP的设备拥有了所有AS的路由信息,如下:R3从R1学到AS100的1.0.0.0/8的路由信息,然后通过单播传给R7,R7传给R2,所有AS内运行BGP的路由器都学到了1.0.0.0/8的路由信息
矢量协议的特点是谁发给我这条路由,我到这条路由就找谁,如果R7想ping1.0.0.0/8,那R7就会将ping包发送给R3,由R3转发。在R7发送ping包时,它首先查看路由表查找R3的位置,假设R7通过R4找R3,那R7就会将ping包发给R4,当这个ping包来到R4上,R4看二层是找自己的,解封装看三层,发现这个ping包的DIP为1.0.0.0/8网段的,但R4上没有运行BGP,没有收到关于1.0.0.0/8网段的路由信息,所以R4就会把这个ping包丢弃,虽然R7上有1.0.0.0/8的网段路由信息,但无法与R1通信,这就是BGP的路由黑洞。
BGP的路由黑洞:由于BGP协议可以非直连建邻,故可能出现BGP协议跨越未运行BGP协议的路由器,导致BGP路由传递后,显示控制层面可达,但是,数据层面,流量经过未运行BGP协议的路由器时,无法通过,形成路由黑洞。
解决路由黑洞
AS内的设备全部运行BGP:既然路由黑洞是未运行BGP协议的路由器导致的,那就让AS内所有的设备都运行BGP获取路由信息。但这个方法是不现实的,可以承载越多路由信息的路由器其价格也就越昂贵,每一台运行BGP的路由器需要承载所有AS的路由信息,可以承载世界上几万几十万的路由信息的路由器价格也是上百万的,所以,是不可能让AS内的设备拥有全部路由信息的。
AS内运行BGP的设备将从BGP重发布到AS内运行的IGP协议里:通过重发布将BGP所有路由导入到IGP协议里,同样需要AS内所有设备可以承载所有AS的路由信息,同第一条一样不现实。
物理、逻辑拓扑全连:直接让AS内运行BGP协议的所有设备互相连接,使IBGP间通信不需要经过未运行BGP协议的设备,但由一个AS地理范围可能很大,IBGP间距离较远,所以使用真实链路连接IBGP也不现实,所以我们可以用GRE/MGRE等技术,通过虚拟链路连接IBGP对等体
MPLS:当前工程中主要使用的解决BGP路由黑洞方案,MPLS后续会讲。
BGP为了防止BGP路由黑洞的产生,提出了BGP同步机制:即当一台路由器从自己IBGP对等体学习到一条BGP路由时,他不能将这条路由通告给自己的EBGP对等体,除非他又从IGP协议中(包含静态路由)学习到这条路由。也就是要求IBGP路由和IGP路由同步。 同步要求将BGP路由重发布到IGP协议中,但我们已经说过这种方法并不现实,所以华为设备默认关闭同步机制。 |
注意:在目前我们的学习情况下,我们在做BGP实验时都是用第一种方法解决路由黑洞 |
BGP的防环机制—水平分割
EBGP水平分割
下图中有三个AS,其中AS:1的一条路由信息传给了AS:2,AS:2将这条路由信息传给AS:3,如果AS:3又将这条路由信息传回给AS:1且AS:1将这条路由信息加表,就会导致路由环路。
BGP协议在路由条目中有一条专门记录所经过的AS编号的路径属性,在上图中AS:1发出的路由信息会携带编号1,AS:2将这条路由信息转发给R3时,添加编号2;AS:3将这条路由信息转发给AS:1时,也会添加编号3;最终AS:1收到这条路由信息的AS_PATH属性记录了1、2、3,R1发现该属性中有自己的编号则拒绝接受这条路由信息,避免环路产出。
IBGP水平分割
下图在AS:64513内,R2、R3、R4两两建邻,如果R2发布一条路由信息由R4到R3,再到R2,并且R3转发给R2的路由信息改变了R2的路由表,则会形成环路。
因为BGP的AS-BY-AS的特性,导致AS内部被认为是一个整体,在默认情况下,路由的属性是不会发生变化的,所以,无法通过属性来进行防环。
IBGP水平分割:当一个路由器从一个IBGP对等体出学习到某一条BGP路由时,他将不再把这条路由信息通告给其他的IBGP对等体。
IBGP水平分割可以有效的解决IBGP对等体之间路由回传造成的环路问题,但是,也会引发路由信息传递障碍问题。如下图中,如果R1学到其他AS的路由信息,它会将这些路由信息传递给R2,但由于IBGP水平分割,R2不能将这些路由信息传递给R3,R3就无法获取R1收集到的路由信息。
想要避免IBGP水平分割带来的问题,可以让所有AS内部运行BGP的路由器均建立IBGP对等体关系, 这种建立全连的IBGP对等体的方案并不是最佳解决方案,因为,当一个AS内运行BGP协议的路由器数量较多时,建立全连的邻居关系,将造成大量的资源浪费,并且降低网络的可扩展性。
BGP存在两个技术专门用于解决IBGP水平分割带来的问题:1.路由反射器,2.联邦。
BGP基本配置
EBGP对等体直连建邻
启动BGP进程,1 指的时该路由器所在的AS号;因为一个路由只能属于一个AS中,所以一个路由器只能启动一个BGP进程
1 [r1]bgp 1 2 [r1-bgp] |
配置RID,BGP要求邻居间的RID不能相同,可以手工配置,也可以自动获取
1 [r1-bgp]router-id 1.1.1.1 |
指定建邻的IP地址和邻居所在的AS的编号,指定邻居IP后,如果该邻居可达,则尝试建立TCP会话。
1 [r1-bgp]peer 12.0.0.2 as-number 2 -- #邻居关系指定是双向的 |
IBGP对等体环回建邻
由于,IBGP邻居处于同一个AS中,正常一个AS中存在大量的备份路径,若使用物理接口建立邻居关系,将浪费这些备份或者负载均衡的路径;故建议使用环回接口来进行IBGP对等体关系的建立。
1 [r2-bgp]peer 3.3.3.3 as-number 2 --- #指定建邻的IP地址和邻居所在的AS的编号 2 [r2-bgp]peer 3.3.3.3 connect-interface LoopBack 0 ---- #指定发送给邻居的数据包的源IP为该接口的IP |
由于邻居在收到数据包时,会检测该包的源IP和本地指定的邻居IP是否相同,不同则无法建邻。所以一旦使用环回地址作为建邻地址,同时需要修改源IP地址未本地环回地址。
EBGP对等体环回建邻
EBGP间使用环回建邻首先要有一条路由可以去往邻居的环回,一般我们使用静态路由
1 [r1]ip route-static 2.2.2.2 32 12.1.1.2 |
因为EBGP对等体之间一般采用直连建邻的方法,所以,EBGP对等体之间的数据包中的TTL值设置为1,这意味着R1只能与R2的g 0/0/0口通信而不能与R2的环回通信,所以使用EBGP对等体环回建邻时需要修改数据报的TTL值。
1 [r1-bgp]peer 2.2.2.2 ebgp-max-hop 2 --- #将发往该邻居的数据包的ttl值修改为2 2 [r1-bgp]peer 2.2.2.2 ebgp-max-hop ---- #后面不加数字,相当于将TTL值改为最大值,255。 |
总结:再建立对等体关系时,建议EBGP对等体间直连建邻;IBGP对等体间建议使用环回接口进行建邻。