1. BGP基础

为方便管理规模不断扩大的网络,网络被分成了不同的AS(Autonomous System,自治系统)。早期,EGP(Exterior Gateway Protocol,外部网关协议)被用于实现在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求,BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。

1.1     BGP概述

1.1.1   AS(Autonomous System,自治系统)

OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。

AS指的是在同一个组织管理下,使用统一选路策略的设备集合,不同AS通过AS号区分,AS号存在16bit、32bit两种表示方式。IANA负责AS号的分发,当不同AS之间需要进行通信时,在AS之间应使用何种路由协议进行路由的传递?

bgp引入ospf路由命令 bgp路由引入到ospf_TCP

 

提示:

  • IANA(Internet Assigned Numbers Authority,因特网地址分配组织):IAB(Internet Architecture Board,因特网体系委员会)的下设组织。IANA授权NIC( Network Information Center,网络信息中心)和其他组织负责IP地址和域名分配,同时,IANA负责维护TCP/IP协议族所采用的协议标识符数据库,包括自治系统号。
  • 在长度为16bit的AS号表示方式中:64512-65534为私有AS号,在长度为32bit的AS号表示方式中:4200000000-4294967294为私有AS号。

1.1.2   使用IGP传递路由

  1. AS之间需要直连链路,或通过VPN协议构造逻辑直连(例如GRE Tunnel)进行邻居建立。

VPN(virtual private network,虚拟专用网):使用虚拟专业网络技术可以从逻辑上建立一个直接连接的网络。

  1. AS之间可能是不同的机构、公司,相互之间无法完全信任,使用IGP可能存在暴露AS内部的网络信息的风险。
  2. 整个网络规模扩大,路由数量进一步增加,路由表规模变大,路由收敛变慢,设备性能消耗加大。

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_02

 

1.1.3   使用BGP传递路由

为此在AS之间专门使用BGP(Border Gateway Protocol,边界网关协议)协议进行路由传递,相较于传统的IGP协议:

  1. BGP基于TCP,只要能够建立TCP连接即可建立BGP。
  2. 只传递路由信息,不会暴露AS内的拓扑信息。
  3. 触发式更新,而不是进行周期性更新。

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_03

 

1.1.4   BGP的发展史

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_04

 

目前关于BGP-4最新的RFC是4271,相比较于RFC1771,对于一些细节进行了进一步说明,如事件、状态机以及BGP路由决策流程等。

1.1.5   BGP在企业中的应用

  1. 企业内部互通

bgp引入ospf路由命令 bgp路由引入到ospf_运维_05

 

  1. 企业与运营商互通

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_06

1.2     BGP的基本概念

1.2.1   BGP概述

BGP是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议。早期发布的三个版本分别是BGP-1(RFC1105)、BGP-2(RFC1163)和BGP-3(RFC1267),1994年开始使用BGP-4(RFC1771),2006年之后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络(如IPv6等)使用的版本是MP-BGP(RFC4760)。

BGP的特点:

  1. BGP使用TCP作为其传输层协议(端口号为179),使用触发式路由更新,而不是周期性路由更新。
  2. BGP能够承载大批量的路由信息,能够支撑大规模网络。
  3. BGP提供了丰富的路由策略,能够灵活的进行路由选路,并能指导对等体按策略发布路由。
  4. BGP能够支撑MPLS/VPN的应用,传递客户VPN路由。
  5. BGP提供了路由聚合和路由衰减功能用于防止路由振荡,通过这两项功能有效地提高了网络稳定性。

1.2.2   BGP特征          

BGP特征1:

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_07

 

  1. BGP使用TCP为传输层协议,TCP端口号179。路由器之间的BGP会话基于TCP连接而建立。
  2. 运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。
  3. 两个建立BGP会话的路由器互为对等体(Peer),BGP对等体之间交换BGP路由表。
  4. BGP路由器只发送增量的BGP路由更新,或进行触发式更新(不会周期性更新)。
  5. BGP能够承载大批量的路由前缀,可在大规模网络中应用。

BGP特征2:

bgp引入ospf路由命令 bgp路由引入到ospf_网络_08

  1. BGP通常被称为路径矢量路由协议(Path-Vector Routing Protocol)。
  2. 每条BGP路由都携带多种路径属性(Path attribute),BGP可以通过这些路径属性控制路径选择,而不像IS-IS、OSPF只能通过Cost控制路径选择,因此在路径选择上,BGP具有丰富的可操作性,可以在不同场景下选择最合适的路径控制方式。

1.2.3   BGP对等体关系

与OSPF、IS-IS等协议不同,BGP的会话是基于TCP建立的。建立BGP对等体关系的两台路由器并不要求必须直连,BGP存在两种对等体关系类型---EBGP及IBGP。

EBGP(External BGP):位于不同自治系统的BGP路由器之间的BGP对等体关系。两台路由器之间要建立EBGP对等体关系,必须满足两个条件:

  1. 两个路由器所属AS不同(即AS号不同)。
  2. 在配置EBGP时,Peer命令所指定的对等体IP地址要求路由可达,并且TCP连接能够正确建立。

IBGP(Internal BGP):位于相同自治系统的BGP路由器之间的BGP邻接关系。

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_09

 

BGP对等体关系建立 1:

  1. 先启动BGP的一端先发起TCP连接,如左图所示,R1先启动BGP,R1使用随机端口号向R2的179端口发起TCP连接,完成TCP连接的建立。
  2. 三次握手建立完成之后,R1、R2之间相互发送Open报文,携带参数用于对等体建立,参数协商正常之后双方相互发送Keepalive报文,收到对端发送的Keepalive报文之后对等体建立成功,同时双方定期发送Keepalive报文用于保持连接。
  3. 其中Open报文中携带:
  1. My Autonomous System:自身AS号
  2. Hold Time:用于协商后续Keepalive报文发送时间
  3. BGP Identifier:自身Router ID

bgp引入ospf路由命令 bgp路由引入到ospf_运维_10

BGP建立对等体的对等体都会发起TCP三次握手,所以会建立两个TCP连接,但是实际BGP只会保留其中一个TCP连接,从Open报文中获取对端BGP Identifier之后BGP对等体会比较本端的Router ID和对端的Router ID大小,如果本端Router ID小于对端Router ID,则会关闭本地建立的TCP连接,使用由对端主动发起创建的TCP连接进行后续的BGP报文交互。

BGP对等体关系建立 2:

BGP对等体关系建立之后,BGP路由器发送BGP Update(更新)报文通告路由到对等体。

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_11

 

1.2.4   TCP连接源地址

  1. 缺省情况下,BGP使用报文出接口作为TCP连接的本地接口。
  2. 在部署IBGP对等体关系时,建议使用Loopback地址作为更新源地址。Loopback接口非常稳定,而且可以借助AS内的IGP和冗余拓扑来保证可靠性。
  3. 在部署EBGP对等体关系时,通常使用直连接口的IP地址作为源地址,如若使用Loopback接口建立EBGP对等体关系,则应注意EBGP多跳问题。

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_12

 

 一般而言在AS内部,网络具备一定的冗余性。在R1与R3之间,如果采用直连接口建IBGP邻居关系,那么一旦接口或者直连链路发生故障,BGP会话也就断了,但是事实上,由于冗余链路的存在,R1与R3之间的IP连通性其实并没有DOWN(仍然可以通过R4到达彼此)。

1.2.5   BGP报文类型

BGP存在5种类型的报文,不同类型的报文拥有相同的头部(header):

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_13

 

bgp引入ospf路由命令 bgp路由引入到ospf_运维_14

不同于常见的IGP协议,BGP使用TCP作为传输层协议,端口号179,这使得BGP支持在非直连的路由器之间建立对等体关系。

1.2.6   BGP报文格式

BGP五种报文都拥有相同的报文头,格式如下图所示:

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_15

 

  1. 主要字段解释:
  • Marker:16Byte,用于标明BGP报文边界,所有bit均为“1”。
  • Length:2Byte,BGP报文总长度(包括报文头在内),以Byte为单位。
  • Type:1Byte,BGP报文的类型。其取值从1到5,分别表示Open、Update、Notification、Keepalive和Route-refresh 报文。
  1. BGP报文格式 – Open

Open报文是TCP连接建立之后发送的第一个报文,用于建立BGP对等体之间的连接关系,报文格式如下图所示,主要字段解释如下:

  1. Version:BGP的版本号。对于BGP 4来说,其值为4。
  2. My AS(autonomous system):本地AS号。通过比较两端的AS号可以判断对端是否和本端处于相同AS。
  3. Hold Time:保持时间。在建立对等体关系时两端要协商Hold Time,并保持一致。如果在这个时间内未收到对端发来的Keepalive报文或Update报文,则认为BGP连接中断。
  4. BGP Identifier:BGP标识符,以IP地址的形式表示,用来识别BGP路由器。

bgp引入ospf路由命令 bgp路由引入到ospf_网络_16

 

  1. BGP报文格式 - Update

Update报文用于在对等体之间传递路由信息,可以用于发布、撤销路由,一个Update报文可以通告具有相同路径属性的多条路由,这些路由保存在NLRI(Network Layer Reachable Information,网络层可达信息)中。同时Update还可以携带多条不可达路由,用于告知对方撤销路由,这些保存在Withdrawn Routes字段中。

  1. 报文格式如下图所示,主要字段解释如下:
  • Withdrawn routes:不可达路由的列表。
  • Path attributes:与NLRI相关的所有路径属性列表,每个路径属性由一个TLV(Type-Length-Value)三元组构成。
  • NLRI:可达路由的前缀和前缀长度二元组。

bgp引入ospf路由命令 bgp路由引入到ospf_服务器_17

  • Unfeasible routes length:不可达路由字段的长度,以Byte为单位。如果为0则说明没有Withdrawn Routes 字段。
  • Withdrawn Routes Length:标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。
  • Total path attribute length:路径属性字段的长度,以Byte为单位。如果为0则说明没有Path Attributes 字段。

3.     BGP报文格式 - Notification

当BGP检测到错误状态时(对等体关系建立时、建立之后都可能发生),就会向对等体发送Notification,告知对端错误原因。之后BGP连接将会立即中断。

  1. Error Code、Error subcode:差错码、差错子码,用于告知对端具体的错误类型。
  2. Data:用于辅助描述详细的错误内容,长度并不固定。

bgp引入ospf路由命令 bgp路由引入到ospf_网络_18

4.     BGP报文格式 -Keepalive

BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接,Keepalive报文格式中只包含报文头,没有附加其他任何字段。

bgp引入ospf路由命令 bgp路由引入到ospf_服务器_19

5.     BGP报文格式 - Route-refresh

Route-refresh报文用来要求对等体重新发送指定地址族的路由信息,一般为本端修改了相关路由策略之后让对方重新发送Update报文,本端执行新的路由策略重新计算BGP路由。

  1. 相关字段内容如下:
  • AFI:Address Family Identifier,地址族标识,如IPv4。
  • Res.:保留,8个bit必须置0。
  • SAFI:Subsequent Address Family Identifier,子地址族标识。

bgp引入ospf路由命令 bgp路由引入到ospf_运维_20

 

在Open报文协商时会协商是否支持Route-refresh,如果对等体支持Route-refresh能力,则可以通过refresh bgp命令手工对BGP连接进行软复位,BGP软复位可以在不中断BGP连接的情况下重新刷新BGP路由表,并应用新的策略。

对于不支持Route-Refresh能力的BGP对等体,可以配置keep-all-routes命令,保留该对等体的所有原始路由,这样不需要复位BGP连接即可完成路由表的刷新。

缺省情况下未开启keep-all-routes。

1.2.7   BGP状态机

BGP状态机汇总表:

bgp引入ospf路由命令 bgp路由引入到ospf_网络_21

BGP状态机迁移:

bgp引入ospf路由命令 bgp路由引入到ospf_运维_22

 

Idle状态是BGP初始状态。在Idle状态下,BGP拒绝对等体发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。

  1. Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。
  2. 任何状态中收到Notification报文或TCP拆链通知等Error事件后,BGP都会转至Idle状态。

在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。

  1. 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
  2. 如果TCP连接失败,那么BGP转至Active状态。
  3. 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。

在Active状态下,BGP总是在试图建立TCP连接。

  1. 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
  2. 如果TCP连接失败,那么BGP停留在Active状态。
  3. 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。

在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。

  1. 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。
  2. 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。

在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。

在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。

  1. 如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。
  2. 如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。
  3. Route-refresh报文不会改变BGP状态。
  4. 如果收到Notification报文,那么BGP转至Idle状态。
  5. 如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。

BGP状态机详解

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_23

 

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_24

1.2.8   BGP对等体表

在设备上通过display bgp peer命令查看BGP对等体表:

bgp引入ospf路由命令 bgp路由引入到ospf_bgp引入ospf路由命令_25

 

  1. 其中主要参数含义:
  • Peer:对等体地址
  • V:version,版本号
  • AS:对等体AS号
  • Up/Down:该对等体已经存在up或者down的时间
  • State:对等体状态,这里显示的为BGP状态机的状态
  • PrefRcv:prefix received,从该对等体收到的路由前缀数目
  • MsgRcvd 、MsgSent:从对等体收到的报文个数,向对等体发送的报文个数。
  • OutQ:out queue,对外发送报文队列中排队的个数,一般为0。

BGP对等体表的作用为列出本设备的BGP对等体,以及对等体的状态等信息。

1.2.9   BGP路由表

在设备上通过display bgp routing-table查看BGP路由表:

bgp引入ospf路由命令 bgp路由引入到ospf_网络_26

 

  • Network:路由的目的网络地址以及网络掩码
  • NextHop:下一跳地址

如果想要查看某条路由更加详细的信息,可以通过display bgp routing-table ipv4-address { mask | mask-length} 查看,该命令会将匹配的BGP路由信息详细展示:

bgp引入ospf路由命令 bgp路由引入到ospf_网络_27

 

通过display bgp routing-table ipv4-address { mask | mask-length } 可以显示指定IP地址/掩码长度的路由信息,在其中有关于该BGP路由的详细信息,如:路由始发者、下一跳地址、路由的路径属性等。

1.2.10 BGP路由表生成

不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。

BGP注入路由的方式有两种:

  1. Network
  2. import-route

与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由。

bgp引入ospf路由命令 bgp路由引入到ospf_运维_28

Network注入路由

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_29

/* Network方式注入的路由必须是已经存在于IP路由表中的路由条目,否则不会被成功注入到BGP路由表中*/

AS200内的BGP路由器通过Update报文将路由传递给AS300内的BGP路由器。

AS300内的BGP路由器收到路由后,将这两条路由加入到本地的BGP路由表中。

import-route方式注入路由

Network方式注入路由虽然是精确注入,但是只能一条条配置逐条注入IP路由表中的路由,如果注入的路由条目很多配置命令将会非常复杂,为此可以使用import-route方式,将:

  1. 直连路由
  2. 静态路由
  3. OSPF路由
  4. IS-IS路由

等协议的路由注入到BGP路由表中。

bgp引入ospf路由命令 bgp路由引入到ospf_运维_30

1.2.11 BGP路由聚合

与众多IGP协议相同,BGP同样支持路由的手工聚合,在BGP配置视图中使用aggregate命令可以执行BGP路由手工聚合,在BGP已经学习到相应的明细路由情况下,设备会向BGP注入指定的聚合路由。

bgp引入ospf路由命令 bgp路由引入到ospf_TCP_31

执行聚合之后,在本地的BGP路由表中除了原本的明细路由条目之外,还会多出一条聚合的路由条目。如果在执行聚合时指定了detail-suppressed,则BGP只会向对等体通告聚合后的路由,而不通告聚合前的明细路由,如上图:在聚合时配置了抑制明细路由的参数,R3上查看路由表,将只能看到BGP路由:10.1.0.0/22,无法看到聚合前的明细路由。

1.2.12 通告原则

BGP通过network、import-route、aggregate聚合方式生成BGP路由后,通过Update报文将BGP路由传递给对等体。

BGP通告遵循以下原则:

1.     只发布最优路由。

通过display bgp routing-table命令可以查看BGP路由表,在BGP路由表中同时存在以下两个标志的路由为最优、有效:

  1. * : 代表有效
  2. > : 代表最优

bgp引入ospf路由命令 bgp路由引入到ospf_网络_32

2.     从EBGP对等体获取的路由,会发布给所有对等体。

3.     IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。

如下图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:

  1. R2将一条路由传递给了IBGP对等体R3
  2. R3收到路由之后传递给IBGP对等体R1
  3. R1继续传递给IBGP对等体R2

路由环路形成。

bgp引入ospf路由命令 bgp路由引入到ospf_运维_33

 

第三条原则可能会带来新的问题,如左侧所示,当BGP路由器R2将路由传递给BGP路由器R1时,由于第三条原则限制,R1无法将BGP路由传递给R3,R3将无法学习到路由。

为解决该问题可以采用AS内IBGP全互联的方式,即:R2、R3之间建立非直连的IBGP对等体关系,以此让BGP路由器R2将路由传递给BGP路由器 R3。

bgp引入ospf路由命令 bgp路由引入到ospf_服务器_34

 

4.     当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题,如图所示:

  1. BGP路由器R4上存在一条路由10.0.4.0/24,R4将其传递给了R2。
  2. R2将路由传递给非直连IBGP对等体R3。
  3. R3将路由传递给R5。
  4. 之后R5向10.0.4.4发起访问。

bgp引入ospf路由命令 bgp路由引入到ospf_网络_35

 

bgp引入ospf路由命令 bgp路由引入到ospf_网络_36

 

R5访问10.0.4.4:

  1. R5查找路由表,将报文发送给R3。
  2. R3收到报文后查找路由表,匹配到一条BGP路由,其下一跳为R2,但是R2为非直连下一跳,需要进行路由迭代,通过IGP学习到的路由迭代出下一跳为R1。R3将报文发送给R1。
  3. R1收到报文后查找路由表,因为R1并非BGP路由器,未与R2建立IBGP对等体关系,因此R1上并无BGP路由10.0.4.0/24,路由查找失败,R1将报文丢弃。

产生该问题根本原因为AS200域内未运行BGP的路由器并无从BGP学习到的路由条目,查找路由失败,导致R1丢弃报文。为此制定了BGP同步原则:

当BGP的路由条目也存在于IGP路由表时才对外发送,以图中场景为例,当R3查看IGP路由表,OSPF路由表中并无路由10.0.4.0/24,因此并不会向R5发送该路由,自然也不会产生后续的访问失败问题。

解决该问题的方式有:

  1. 将BGP路由重分发到IGP中,基本不会使用该方式。
  2. 建立全互联的IBGP对等体关系,让全网所有路由器都拥有BGP路由。