网络学习笔记(6)- BGP基础

BGP概述

边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的 高级路径矢量路由协议。

相较于传统的IGP协议:

  • BGP基于TCP,只要能够建立TCP连接即可建立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 版本号:如果两端版本号不一致,则协调至相同为止,版本号高的服从版本号低的。假设一端是 BGP3 ,另一端是BGP 4,则最后协商的结果为 BGP3。

BGP的特点

(1) 特征一

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

(2) 特征二

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

BGP对等体关系

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

BGP按照运行方式分为EBGP(External/Exterior BGP)IBGP(Internal/Interior BGP)

1、EBGP:
运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。

2、IBGP:
运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。为了解决IBGP对等体的连接数量太多的问题,BGP设计了路由反射器和BGP联盟(详情见后面)。
如果在AS内一台BGP设备收到EBGP邻居发送的路由后,需要通过另一台BGP设备将该路由传输给其他AS,此时推荐使用IBGP。
同步规则 BGP synchronization
当一台路由器从自己的 IBGP 对等体学习到一条BGP 路由时,它将不能使用该条路由或把这条路由通告给自己的 EBGP 对等体,除非它又从IGP 协议学习到这条路由,也就是要求 IBGP 路由与 IGP 路由同步。
同步规则主要用于规避 BGP 路由黑洞。

解决方法:
1、所有设备都运行 BGP
2、IGP与BGP 进行引入
3、采用 MPLS

华为默认BGP 同步是被关闭的

1657543796245.png

BGP对等体关系建立

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

1657543979236.png

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

1657544027300.png

TCP连接源地址

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

1657544169685.png

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

报文及状态机

BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送:
1、Open报文:
用于建立BGP对等体连接。

2、Update报文:
用于在对等体之间交换路由信息。需要在BGP中network才会有Update报文

3、Notification(通告)报文:
用于中断BGP连接。

4、Keepalive报文:
用于保持BGP连接。

5、Route-refresh(刷新)报文:
用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。
可以抓取到 route-refresh 报文
<>refresh bgp all import

1657544347500.png

1657544430868.png

报文头格式

BGP五种报文都拥有相同的报文头,格式如左侧所示,主要字段解释如下:

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

1657544577740.png

Open报文

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

  • Version:BGP的版本号。对于BGP 4来说,其值为4。
  • My AS(autonomous system):本地AS号。通过比较两端的AS号可以判断对端是否和本端处于相同AS。
  • Hold Time:保持时间。在建立对等体关系时两端要协商Hold Time,并保持一致。如果在这个时间内未收到对端发来的Keepalive报文或Update报文,则认为BGP连接中断。
  • BGP Identifier:BGP标识符,以IP地址的形式表示,用来识别BGP路由器。
  • Opt Parm Len:Optional parameters的长度。
  • Optional parameters:宣告自身对于一些可选功能的支持,比如认证、多协议支持。
  • 除了IPv4单播路由信息,BGP4+还支持多种网络层协议(如IPv6、组播),在协商时BGP对等体之间会通过Optional parameters字段协商对网络层协议的支持能力。

Router ID
BGP的Router ID是一个用于标识BGP设备的32位值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。
对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router ID,否则对等体之间不能建立BGP连接。
BGP的Router ID在BGP网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。
缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router ID。如果设备上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router ID

1657544643107.png

Update报文
  • Update报文用于在对等体之间传递路由信息,可以用于发布、撤销路由。
  • 一个Update报文可以通告具有相同路径属性的多条路由,这些路由保存在NLRI(Network Layer Reachable Information,网络层可达信息)中。同时Update还可以携带多条不可达路由,用于告知对方撤销路由,这些保存在Withdrawn Routes字段中。
  • 报文格式如左侧所示,主要字段解释如下:
    • Withdrawn routes:不可达路由的列表。
    • Path attributes:与NLRI相关的所有路径属性列表,每个路径属性由一个TLV(Type-Length-Value)三元组构成。
    • NLRI:可达路由的前缀和前缀长度二元组。
    • Unfeasible routes length:不可达路由字段的长度,以Byte为单位。如果为0则说明没有Withdrawn Routes 字段。
    • Withdrawn Routes Length:标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。
    • Total path attribute length:路径属性字段的长度,以Byte为单位。如果为0则说明没有Path Attributes 字段。

1657544850501.png

Notification报文

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

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

1657544921733.png

Keepalive报文

BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接。

Keepalive报文格式中只包含报文头,没有附加其他任何字段。

1657544966540.png

Route-refresh报文

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

  • AFI:Address Family Identifier,地址族标识,如IPv4。
  • Res.:保留,8个bit必须置0。
  • SAFI:Subsequent Address Family Identifier,子地址族标识。

1657545150989.png

BGP状态机

BGP的五种状态机

idle: 初始状态 
connect: BGP等待TCP连接的建立 
active: TCP连接失败,重新建立TCP连接 
open sent:TCP建立成功,发送open报文 
open confirm: 收到正确的OPEN报文 
established: BGP邻居建立成功 

1657545410604.png

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

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

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

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

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

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

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

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

5、在OpenConfirm状态下,BGP等待Keepalive或Notification报文。

  • 如果收到Keepalive报文,则转至Established状态,
  • 如果收到Notification报文,则转至Idle状态。

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

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

1657545493980.png

状态机详解

常见的三种状态 Idle, Active,Established

1657546359275.png

Idle状态

1657546156204.png

缺乏去往BGP对等体的路由是导致BGP路由器其状态机一直处于idle状态的常见原因。

Connect、Active

1657546192211.png

配置完BGP对等体并成功查找到去往对等体地址的路由之后,会发起TCP三次握手,TCP三次握手建立过程中处于Connect状态,如果TCP连接长期无法建立则进入Active状态。

Open Sent、Open Confirm

1657546252588.png

TCP三次握手建立完成之后,发送Open报文建立对等体关系,此时进入Open Sent状态,当收到对端回应的Open报文,并且参数检查无误,在发送keepalive报文之后进入Open Confirm状态。

Established

1657546289468.png

进入Open Confirm状态之后,BGP路由器如果收到了对端发送的Keeaplive报文,则进入Established状态,对等体关系建立过程就此完成。

BGP对等体表

<R1>display bgp peer
 BGP local router ID : 10.0.1.1
 Local AS number : 100
 Total number of peers : 1                Peers in established state : 1

  Peer              V         AS  MsgRcvd  MsgSent  OutQ      Up/Down            State           PrefRcv

10.0.12.2         4         100    25719    25714        0          0428h32m     Established           1

BGP对等体表的作用为列出本设备的BGP对等体,以及对等体的状态等信息。在设备上通过display bgp peer命令查看BGP对等体表,其中主要参数含义:

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

BGP路由表

1657546749395.png

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

  • Network:路由的目的网络地址以及网络掩码
  • NextHop:下一跳地址
    如果想要查看某条路由更加详细的信息,可以通过display bgp routing-table ipv4-address { mask | mask-length} 查看,该命令会将匹配的BGP路由信息详细展示。

BGP路由的生成

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

  • Network
  • import-route

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

1657546953667.png

Network注入路由

AS200内的BGP路由器已经通过IGP协议OSPF学习到了两条路由:10.1.0.0/24和10.2.0.0/24,在BGP进程内通过network命令注入这两条路由,这两条路由将会出现在本地的BGP路由表中。

1657547013420.png

AS200内的BGP路由器通过Update报文将路由传递给AS300内的BGP路由器。AS300内的BGP路由器收到路由后,将这两条路由加入到本地的BGP路由表中。

1657547089099.png

import-route方式注入路由

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

  • 直连路由
  • 静态路由
  • OSPF路由
  • IS-IS路由

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

1657547213875.png

BGP聚合路由

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

1657547288290.png

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

BGP通告原则

BGP通过networkimport-routeaggregate聚合方式生成BGP路由后,通过Update报文将BGP路由传递给对等体。

BGP通告遵循以下原则:

  • 只发布最优且有效路由。
  • 从EBGP对等体获取的路由,会发布给所有对等体。
  • IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
  • BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。

通告原则一

第一条原则:只发布最优且有效(即下一跳地址可达)路由。

通过display bgp routing-table命令可以查看BGP路由表。

Total Number of Routes: 2
      Network            NextHop       MED   LocPrf    PrefVal   Path/Ogn
 *>i  10.1.0.0/24         11.1.0.1          0          100        0              ?
 *i                             11.1.0.2          0          100  

在BGP路由表中同时存在以下两个标志的路由为最优、有效:

  • * : 代表有效
  • > : 代表最优

1657547652859.png

通告原则二

第二条原则:从EBGP对等体获取的路由,会发布给所有对等体。
R2从EBGP对等体获取的BGP路由,会发布给所有EBGP、IBGP对等体。

1657547804675.png

通告原则三

  • 第三条原则:从IBGP对等体获取的BGP路由,不会再发送给其他IBGP对等体。

  • 该条原则也被称为IBGP水平分割

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

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

路由环路形成。

1657547920283.png

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

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

1657548082579.png

通告原则四

第四条原则:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,该条规则也被称为BGP同步原则。
如下图所示:

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

1657548671148.png

R5访问10.0.4.4:

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

1657548705418.png

产生该问题根本原因为AS200域内未运行BGP的路由器并无从BGP学习到的路由条目,查找路由失败,导致R1丢弃报文。为此制定了BGP同步原则:当BGP的路由条目也存在于IGP路由表时才对外发送,以图中场景为例,当R3查看IGP路由表,OSPF路由表中并无路由10.0.4.0/24,因此并不会向R5发送该路由,自然也不会产生后续的访问失败问题。

解决该问题的方式有:

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

总结图

BGP基础.png

|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/320
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
网络学习笔记(6)- BGP基础
BGP概述 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的 高级路径矢量路由协议。 ……
<<上一篇
下一篇>>
文章目录
关闭
目 录