一、BGP的基本概念
BGP(Border Gateway Protocol,边界网关协议)是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议(EGP)。通过TCP179端口建立连接。目前采用BGP4版本,IPv6协议中采用BGP4+。
BGP类型:
EBGP:运行在不同AS之间的BGP成为EBGP,为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。
1.自治系统(AS)
-
AS1使用RIP作为内部网关协议(IGP)。
-
AS2使用OSPF作为内部网关协议(IGP)。
AS是指在一个实体管辖下的拥有相同选路策略的IP网络。BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。
公有 AS 号:公有 AS 号用于在互联网上可被路由的自治系统,这些 AS 号是全球唯一的,范围从 1 到 64511。
私有 AS 号:私有 AS 号范围是从 64512 到 65535,实际一般做实验或者大内网中使用AS 65535。
2.网部网关协议
AS1和AS2之间通过BGP(属于EGP)交换跨自治系统的路由信息。
3.协议分层逻辑
-
内部网络:自治系统内部使用轻量级IGP(如RIP、OSPF)实现高效路由。
-
外部互联:不同自治系统之间使用EGP(如BGP)实现策略控制和大规模路由交换。
二、BGP报文
如上图所示,BGP存在5种类型的报文,分别为Open、Update、Notification、Keepalive、Route-refresh,不同类型的报文拥有相同的头部(header)。5种报文各自起到作用及发送时间见下表:
报文名称 | 作用 | 发送时间 |
Open | 协商BGP对等体参数,建立对等体关系 | BGP TCP连接建立成功之后 |
Update | 发送BGP路由更新 | BGP对等体关系建立之后有路由需要发送或路由变化时向对等体发送Update报文 |
Notification | 报文错误信息,中止对等体关系 | 当BGP在运行中发现错误时,发送Notification报文将错误通过给BGP对等体 |
Keepalive | 标志对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送Keepalive报文用于保持连接 |
Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
-
Open消息:是 TCP 连接建立后发送的第一个消息,用于建立 BGP 对等体之间的连接关系。对等体在接收到 Open 消息并协商成功后,将发送 Keepalive 消息确认并保持连接的有效性。确认后,对等体间可以进行 Update、Notification、Keepalive和 Route-Refresh 消息的交换。
应用:通过 TCP 建立 BGP 连接时,发送 OPEN 消息。 -
Update消息:用于在对等体之间交换路由信息。
-
Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
应用:连接建立后,如果有路由需要发送或路由变化时,发送UPDATE消息通告对端。 -
Keepalive消息:BGP 会周期性的向对等体发出 Keepalive消 息,用来保持连接的有效性。
- 应用:稳定后要定时发送 KEEPALIVE 消息以保持 BGP 连接的有效性。
-
Notification消息:当 BGP 检测到错误状态时,就向对等体发出 Notification 消息,之后 BGP 连接会立即中断。
- 应用:当本地 BGP 在运行中发现错误时,要发送 NOTIFICATION 消息通告 BGP 对等体。
-
Route-Refresh消息:通过 OPEN 消息告知 BGP peer 本地支持路由刷新能力(Route-Refresh capability)。
- 应用:ROUTE-REFRESH 消息用来通知对等体自己支持路由刷新。
三、BGP状态机
1.BGP六种状态
BGP的状态有idle、connect、active、opensent、openconfirm、established六种状态。
Peer状态名称 | 用途 |
ldle | 开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源 |
Connect | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态,反复尝试连接 |
Active | TCP连接没建立成功,反复尝试TCP连接 |
OpenSent | TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立 |
OpenConfirm | 参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
Established | 已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息 |
2.BGP状态变换
BGP的状态有idle、connect、active、opensent、openconfirm、established六种状态。
(1)Idle状态是BGP初始状态。
在Idle状态下,BGP拒绝对等体发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。
任何状态中收到Notification报文或TCP拆链通知等Error事件后,BGP都会转至Idle状态。
(2)Connect状态
在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
如果TCP连接失败,那么BGP转至Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
(3)Active状态
在Active状态下,BGP总是在试图建立TCP连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
如果TCP连接失败,那么BGP停留在Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
(4)Opensent状态、openconfirm状态
TCP三次握手建立成功后,发送open报文建立对等体关系,此时的状态为
opensent状态,当收到对端回应的open报文,并且参数检查无误,在发送keepalive报文后进入openconfirm状态。
(5)established状态
进入openconfirm状态后,收到对端的keepalive报文后进入established状态。
四、BGP对等体
1.BGP对等体的概念
BGP发言者:运行BGP路由协议的路由器称为BGP发言者(BGP路由器);
BGP对等体:两个建立BGP会话(BGP的会话是基于TCP建立的)的路由器互为BGP对等体,BGP对等体之间可以交换路由表;
2.BGP对等体分类
BGP对等体可以按照两个路由器是否AS相同,分为EBGP对等体和IBGP对等体。
(1)IBGP:位于相同的AS的BGP路由器互为IBGP对等体关系;
(2)EBGP:位于不同的AS的BGP路由器互为EBGP对等体关系;
能够建立对等体的条件:
两个路由器指定建立对等体的地址必需可达;
TCP连接能够建立;
3.BGP对等体的建立
(1)TCP连接建立
假设BGP路由器R1先启动,则R1先发起建立TCP连接,通过3次握手完成TCP的连接建立。
(2)BGP路由器发送OPEN报文协商参数
三次握手建立完成后,R1和R2之间相互发送OPEN报文,用于建立对等体的参数协商。
OPEN报文参数:
-
自身AS号;
-
hold time:用于协商后续keepalive报文发送时间;
-
BGP identifier:自身router id;
(3)BGP路由器发送keepalive报文完成对等体建立
参数协商正常后双方相互发送keepalive报文,收到对方的keepalive报文后对等体建立成功,同时后续定期发送keepalive报文用于保持连接。
(4)BGP路由器发送UPDATE报文通告路由
BGP对等体关系建立好了,就可以通过BGP update 报文通告路由到对等体。收到对方的keepalive报文后对等体建立成功,同时后续定期发送keepalive报文用于保持连接。
4.BGP对等体建立使用源地址
BGP默认使用出接口的IP地址建立对等体。
(1)在建立IBGP对等体关系时,建议使用loopback地址建立IBGP对等体。因为loopback地址稳定,可以借助内部IGP冗余保证可靠性。
例如上图:
R1和R2通过loopback地址建立IBGP对等体,如果R1和R2之间的物理链路断了,loopback地址的连通性也不会受影响,可以通过R3实现R1和R2的loopback地址的互通,那么R1和R2之间的对等体关系依然可以保持建立。如果通过接口建立的话,就会导致BGP对等体关系中断。
(2)在建立EBGP对等体关系时,建议使用直连地址建立EBGP对等体。如果使用loopback,需要注意EBGP多跳的问题。
五、BGP路由表
1.BGP对等体表
可以通过dis bgp peer 查看BGP对等体表;
(1)peer:对等体地址
(2)V:版本号
(3)AS:对等体AS号
(4)UP/DOWN:对等体存在up或者down的时间
(5)state:对等体状态
(6)prefRce:从该对等体收到的路由前缀数目
2.BGP路由表
可以通过display bgp routing-table 查看BGP路由表;
如果到达同一个目的地存在多条路由,则将路由都进行罗列,但每个目的地只会优选一条路由。
通过display bgp routing-table ipv4-address { mask | mask-length } 可以显示指定IP地址/掩码长度的路由信息,在其中有关于该BGP路由的详细信息,如:路由始发者、下一跳地址、路由的路径属性等
六、BGP选路原则
当到达同一目的地存在多条路由时, BGP 依次对比下列属性来选择路由:
1.优选协议首选值(PrefVal)最高的路由。协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。
2.优选本地优先级(Local_Pref)最高的路由。如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。
3.依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由。
4.优选AS路径(AS_Path)最短的路由。当AS_Path为空时,会优选AS_Path为空的路由。
5.依次优选Origin类型为IGP、EGP、Incomplete的路由。
6.对于来自同一AS的路由,优选MED值最低的路由。
7.依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。
8.优选到BGP下一跳IGP度量值(metric)最小的路由。
9.优选Cluster_List最短的路由。
10.优选Router ID最小的设备发布的路由。如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较Router ID),并优选Originator_ID最小的路由。
11.优选从具有最小IP Address的对等体学来的路由。
当到达同一目的地址存在多条等价路由时,可以通过 BGP 等价负载分担实现均衡流量的目的。形成 BGP 等价负载分担的条件是“BGP 选择路由的策略”的 1 至 8 条规则中需要比较的属性完全相同。
七、BGP路由生成
BGP路由是通过BGP命令通告而成的,而通告BGP路由的方法有两种:network和Import。
(1)network方式:
使用network命令可以将当前设备路由表中的路由(非BGP)发布到BGP路由表中并通告给邻居,和OSPF中使用network命令的方式大同小异,只不过在BGP宣告时,只需要宣告网段+掩码数即可,如:network 12.12.0.0 16。
(2)Import方式:
使用Import命令可以将该路由器学到的路由信息重分发到BGP路由表中,是BGP宣告路由的一种方式,可以引入BGP的路由包括:直连路由、静态路由及动态路由协议学到的路由。其命令格式与在RIP中重分发OSPF差不多。
八、BGP的配置
1.基本配置
需要在所有Router间运行BGP协议,RouterA、RouterB之间建立EBGP连接,RouterB、RouterC和RouterD之间建立IBGP全连接。
配置思路:
采用如下的思路配置BGP的基本功能:
(1)在RouterB、RouterC和RouterD间配置IBGP连接。
(2)在RouterA和RouterB之间配置EBGP连接。
配置步骤:
(1)配置各接口的IP地址
# 配置RouterA。
<Huawei> system-view
[Huawei] sysname RouterA
[RouterA] interface gigabitethernet 1/0/0
[RouterA-GigabitEthernet1/0/0] ip address 10.1.1.1 8
[RouterA-GigabitEthernet1/0/0] quit
其他路由器各接口的IP地址与此配置一致(略)。
(2)配置IBGP连接
# 配置RouterB。
[RouterB] bgp 65009 //配置as号
[RouterB-bgp] router-id 2.2.2.2
[RouterB-bgp] peer 172.16.1.2 as-number 65009 //配置对等体的IP地址及其所属的AS编号
[RouterB-bgp] peer 172.16.3.2 as-number 65009 //配置对等体的IP地址及其所属的AS编号
指定对等体的IP地址可以是以下三种:
直连对等体的接口IP地址。
直连对等体的子接口IP地址。
路由可达的对等体的Loopback接口地址。
# 配置RouterC。
[RouterC] bgp 65009
[RouterC-bgp] router-id 3.3.3.3
[RouterC-bgp] peer 172.16.3.1 as-number 65009
[RouterC-bgp] peer 172.16.2.2 as-number 65009
[RouterC-bgp] quit
# 配置RouterD。
[RouterD] bgp 65009
[RouterD-bgp] router-id 4.4.4.4
[RouterD-bgp] peer 172.16.1.1 as-number 65009
[RouterD-bgp] peer 172.16.2.1 as-number 65009
[RouterD-bgp] quit
(3)配置EBGP连接
# 配置RouterA。
[RouterA] bgp 65008
[RouterA-bgp] router-id 1.1.1.1
[RouterA-bgp] peer 192.168.1.1 as-number 65009
# 配置RouterB。
[RouterB-bgp] peer 192.168.1.2 as-number 65008
# 查看BGP对等体的连接状态。
[RouterB-bgp] display bgp peer
(4)配置RouterA发布路由10.1.0.0/8
# 配置RouterA发布路由。
[RouterA-bgp] ipv4-family unicast //使能BGP的IPv4单播地址族视图
[RouterA-bgp-af-ipv4] network 10.1.0.0 255.0.0.0
[RouterA-bgp-af-ipv4] quit
# 查看RouterA路由表信息。
[RouterA-bgp] display bgp routing-table
(5)配置BGP引入直连路由
# 配置RouterB。
[RouterB-bgp] ipv4-family unicast
[RouterB-bgp-af-ipv4] import-route direct //引入直连路由
# 查看RouterA的BGP路由表。
[RouterA-bgp] display bgp routing-table
2.路由反射器的配置
2.1路由反射技术概述
BGP在AS之间的路由防环,是要依赖AS_PATH属性,但是AS_PATH属性只有路由在EBGP邻居之间传递时才会发生改变,在AS内部,AS_PATH是不会改变的,那么在AS内部的路由防环,就无法依赖AS_PATH了,因此BGP定义IBGP的水平分割规则:一台BGP路由器从它的IBGP邻居学习到的BGP路由不能再传递给任何IBGP邻居。由于存在IBGP水平分割原则,使得AS内的BGP路由器之间不得不两两建立IBGP连接(IBGP全互联),以求获得完整的BGP路由更新,然而这是个扩展性非常低的做法,同时也给网络设备带来了负担,解决IBGP扩展性问题的两种有效的办法是路由反射器及联邦。
路由反射器相比于联邦,优势在于,联邦中所有路由器都需要支持并理解联邦机制,而路由反射器只需要RR理解反射器机制即可,另外,路由反射器的实现机制也相对简单一些,并且对大型冗余性、层次性强的网络架构采用路由反射器的解决方案也是一个不错的选择。当然如果希望用各种EBGP机制来管理大规模AS,那么联邦将是一个更优的解决方案。
在上图中,由于IBGP水平分割的限制,使得R4在收到IBGP邻居R3发来的路由更新后,不能在发送给另一个IBGP邻居R5。如此一来R5就无法正常学习路由,除非在R3-R5之间也建立一条IBGP连接。
采用路由反射技术即可解决这个问题,首先我们定义一个RR,同时定义这个RR的Client。那么这时候当RR收到她的Client发送过来的路由,就可以像一面镜子一样,将路由反射给其他IBGP路由器。此刻R4作为RR,与它的Client R3就构成了一个路由反射簇。
思考路由反射器时,将簇当作一个逻辑的整体去考虑即可, RR和client共同构成反射簇,但是只有RR知道(配置只是在RR上完成)。注意RR只通告或反射它所知道的最佳路径。
为了维护一致的BGP拓扑,RR在反射路由的时候不修改某些BGP路径属性,这些属性包括NH、AS_PATH、LOCAL_PREF和MED,并且增加了ORIGINATOR和CLUSTER_LIST用于防环。
2.2路由反射规则
-
如果路由学习自非client IBGP对等体,则反射给所有client
-
如果路由学习自一client,则反射给所有非client IBGP邻居和除了该client以外的所有client(我司设备可以关闭RR在Client之间的路由反射行为)
-
如果路由学习自EBGP邻居,则发送给所有client和非client IBGP邻居
注意红色关键字。注意反射和发送的区别。下面看几个例子:
2.3路由反射器的基本配置
互联IP的规划如图所示;所有路由器Loopback0口地址为x.x.x.x/32,x为设备编号。
AS123内跑一个OSPF,宣告直连接口,以及各自的Loopback0接口。
R1、R2、R3根据上图所示建立IBGP邻居关系。
在R1上引入11.11.11.0/24路由进BGP,初始情况下R2能够学习这条BGP路由,但是R3无法学习到。
将R2配置为RR,R1作为R2的Client,使得R3能够学习到11.11.11.0/24路由
# R1的配置-省略OSPF及接口的配置
[R1] bgp 123[R1-bgp] router-id 1.1.1.1[R1-bgp] peer 2.2.2.2 as-number 123[R1-bgp] peer 2.2.2.2 connect-interface loopback0[R1-bgp] network 11.11.11.0 24
# R2的配置-省略OSPF及接口的配置
[R2] bgp 123[R2-bgp] router-id 2.2.2.2[R2-bgp] peer 1.1.1.1 as-number 123[R2-bgp] peer 1.1.1.1 connect-interface loopback0[R2-bgp] peer 1.1.1.1 reflect-client[R2-bgp] peer 3.3.3.3 as-number 123[R2-bgp] peer 3.3.3.3 connect-interface loopback0
# R3的配置省略OSPF及接口的配置
[R3] bgp 123[R3-bgp] router-id 3.3.3.3[R3-bgp] peer 2.2.2.2 as-number 123[R3-bgp] peer 2.2.2.2 connect-interface loopback0
在R3上验证一下,查看路由11.11.11.0的详细信息:
另一个需要关注的配置是配置路由反射簇的Cluster_ID,这也是在RR上完成的配置。当RR反射一条路由时,如果该路由不存在Originator及Cluster_list属性,则插入这两个属性值,同时Cluster_list属性值中写入本路由反射簇的Cluster_ID,默认情况下,Cluster_ID为RR的RouterID,如果需要修改,可使用下面的命令。
如果RR在反射路由时,被反射路由中已经存在Cluster_List属性了,那么RR将自己的Cluster_ID插入到已有的CLuster_List中。
九、软考真题
2020年11月网络规划设计师:
下列哪种BGP属性不会随着BGP的Update报文通告被邻居()
A.PreVal
B.Next-hop
C.AS-Path
D.Origin
【解析】答案是A,PreVal是华为设备特有属性,仅本地有效。
2016年11月网络规划设计师:
当一条路由被发布到它所起源的AS时,会发生的情况是()
A.该AS在路径属性列表中看到自己的号码,从而拒绝接收这条路由
B.边界路由器把该路由传送到这个AS中的其他路由器
C.该路由将作为一条外部路由传送给同一AS中的其他路由器
D.边界路由器从AS路径列表中删除自己的AS号码并重新发布路由
【解析】答案是A,EBGP防止环路就是不接收带有本地AS号的路由。
2022年11月网络规划设计师:
以下关于IS-IS协议的描述中,错误的是()。
A.IS-IS使用SPF算法来计算路由
B.IS-IS是一种链路状态路由协议
C.IS-IS使用域(area)来建立分级的网络拓扑结构,骨干为area0
D.IS-IS通过传递LSP来传递链路信息,完成链路数据库的同步
【解析】答案是C,area分级网络是OSPF协议内容。
2021年11月网络工程师:
以下关于IS-IS路由协议的说法中,错误的是()
A.IS-IS是基于距离矢量的路由协议。
B.IS-IS属于内部网关路由协议
C.IS-IS路由协议将自治系统分为骨干区域和非骨干区域
D.IS-IS路由协议中Leve1-2路由器可以和不同区域的Leve1-2或者Leve1-1-2路由器形成邻居关系
【解析】答案是A。IS-IS是链路状态路由协议,采用SPF算法计算路由路径。