1.BGP基本概述

BGP(Border Gateway Protocol)边界网关协议。是一种在自治系统AS(Autonomous System)之间传递并选择最佳路由的高级距离矢量路由协议。早期发布的三个版本分别是BGP-1、BGP-2和BGP-3,1994年开始使用BGP-4,2006年之后单播IPv4网络使用的版本是BGP-4,BGP当前版本是BGP-4。 BGP理论 - 图1

1.1 BGP的基本作用

image.png

  • BGP的前身EGP设计得非常简单,只能在AS之间简单地传递路由信息,不会对路由进行任何优选,也没有考虑如何在AS之间避免路由环路等问题,因而EGP最终被BGP取代。
  • 相比于EGP,BGP更具有路由协议的特征,如下:
    • 邻居的发现与邻居关系的建立;
    • 路由的获取,优选和通告;
    • 提供路由环路避免机制,并能够高效传递路由,维护大量的路由信息;
    • 在不完全信任的AS之间提供丰富的路由控制能力。
  • 使用BGP作为传递路由的协议,则用户的路由域被作为一个整体和其他路由域进行路由交换,这个域即AS。AS的概念是若干台路由器以及这些路由器组成的网络集合,这些路由器均属于同一个管理机构,并执行统一的路由策略。
  • 运行BGP协议需要一个统一的自治系统号来标识路由域,即AS编号。每个自治系统都有唯一的一个编号,这个编号由IANA分配。2009年1月之前,只能使用最多2个字节长度的AS号码,即1-65535。其中1-64511为公有AS,64512-65534为私有AS。在2009年1月之后,IANA决定使用4字节长度AS,范围是65536-4294967295。

1.2 BGP协议特点

image.png

  • 因为是在AS之间传递路由,为保证数据的可靠性,BGP使用TCP作为其承载协议建立连接。因此与IGP逐跳路由器建立邻居不同,BGP可以跨越多跳路由器建立邻居关系。
  • AS之间的路由器是不完全相互信任的,为实现路由按需求进行控制和优选,BGP设计了诸多属性。
  1. BGP能够进行路由优选,避免路由环路,能更高效率地传递路由和维护大量地路由信息。
  2. BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性。
  3. BGP采用认证和GTSM的方式,保证了网络的安全性。
  4. BGP提供了丰富的路由策略,能够灵活的进行路由选路,并且能指导邻居按策略发布路由。
  5. BGP提供了路由聚合和路由衰减功能,用于防止路由震荡,有效提高了网络的稳定性。
  6. BGP易于拓展,能够适应网络新的发展。主要是通过TLV进行拓展。
  7. BGP使用TCP作为其传输层协议(端口号为179),并支持BGP与BFD联动,BGP Tracking和BGP GR,提高了网络的可靠性。

1.3 BGP与IGP协议对比

  • IGP协议具有的特点:

    • AS之内使用的协议,着眼点在于发现和计算路由
    • 路由收敛相对较迅速,一般工作在直连邻居间
    • 单一的度量计算方法
    • 路由选择实施复杂
    • 适用于中小型企业网络
  • BGP协议具有的特点:

    • BGP是一种外部网关协议(EGP),与OSPF、RIP等内部网关协议(IGP)不同,其着眼于不在与发现和计算路由,而在于控制路由的传递和选择最佳路由。
    • BGP可以工作在非直连邻居之间,使用TCP作为其传输层协议(端口号179),提高了协议的可靠性。
    • BGP支持无类别域间路由CIDR
    • 路由更新时,BGP只发送更新的路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息
    • BGP路由通过携带路径信息彻底解决路由环路的问题
    • BGP提供了丰富的路由策略,能够对路由实现灵活的过滤和选择
    • 适用于大型、超大型的运营商网络

1.4 自治系统AS

  1. AS号由IANA分配
  2. 范围
    1. 注册AS号:1-64511
    2. 私有AS号:64512-65535
  3. 字节数
    1. 2字节AS号
    2. 4字节AS号
    3. 支持4字节AS号的设备是能够与支持2字节AS号的设备进行兼容的

2.BGP报文类型

image.png

2.1 报文结构类型

由于BGP是承载在TCP之上的协议,在建立一个BGP对等体之前必须建立标准的TCP三次握手,并且在目标端打开一个端口为179的连接,TCP能够提供可靠的传输方式,可以进行重传,确认及排序的功能,BGP不需要开发确认报文,因为所有的确认都由TCP层来提供,从而可以减少BGP的报文数量,BGP所有报文均采用单播的方式来发送,因此不能够是自动发现邻居,需要手工指定邻居。

BGP具有五种报文类型:

  • Open
  • Keeplive
  • Update
  • Notification
  • Route-Refresh
  1. Open——协商BGP参数,包括BGP版本号和AS号等信息,是TCP建立后发送的第一个消息。
  2. Update报文——交换路由信息(更新路由或撤销路由)
  3. Keeplive报文——保持邻居关系,用来刷新TCP邻接,不让TCP连接断开,否则邻居关系也会断开
  4. Notification报文——差错通知
  5. Route-Refresh报文——用于在改变路由策略后请求对等体重新发送路由信息

d25c58433b864382a1ab95b854ae957a.jpg

  • BGP报文应用:
    • BGP使用TCP建立连接,本地监听端口为179。和TCP连接建立相同,BGP连接的建立也要经过一系列的对话和握手。TCP通过握手协商通告其端口等参数,BGP的握手协商的参数有:BGP版本、BGP连接保持时间、本地的路由器标识(Router ID)、授权信息等。这些信息都在Open消息中携带。
    • BGP连接建立后,如果有路由需要发送则发送Update消息通告对端。Update消息发布路由时,还要携带此路由的路由属性,用以帮助对端BGP协议选择最优路由。在本地BGP路由变化时,要通过Update消息来通告BGP对等体。
    • 经过一段时间的路由信息交换后,本地BGP和对端BGP都无新路由通告,趋于稳定状态。此时要定时发送Keepalive消息以保持BGP连接的有效性。对于本地BGP,如果在保持时间内,未收到任何对端发来的BGP消息,就认为此BGP连接已经中断,将断开此BGP连接,并删除所有从该对等体学来的BGP路由。
    • 当本地BGP在运行中发现错误时(如对端BGP版本本地不支持、本地BGP收到了结构非法的Update消息等),要发送Notification消息通告BGP对等体。本地BGP退出BGP连接时,也需发送Notification报文。

2.2 BGP报文头部

2.png

  • Marker(标记):16Byte,该标记字段用于检测BGP对等体之间的同步丢失情况,并且在支持验证功能的情况下进行消息验证。如果消息类型为Open或Open消息中未包含验证消息,标志字段将被设置为全1,否则,标志字段值通过某些计算得到(作为验证进程的一部分)
  • Length(长度):2Byte无符号整数,指定了消息的全长,包括头部,BGP报文总长度在19~4096Byte之间。整个BGP报文的长度,Header+Message+Data。
  • Type(类型):1Byte,标识BGP的报文类型,有以下几种消息类型。
    • 1-Open;2-Update;3-Notification;4-Keeplive;5-Route-refresh

2.3 Open报文

3.png
Open消息:是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息并协商成功后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-refresh消息的交换。

Version(版本):1Byte,标识BGP的对等体在使用的版本,缺省版本都为BGP-4,如果邻居运行的是较早的版本,那么它将会拒绝Version4的消息,于是路由器的版本将改为Version3并且再发送一个Open消息,直到两边的邻居协商一致。
My Autonomous System(本地自治系统):2Byte,BGP路由器的AS号,它用来决定该BGP会话是EBGP还是IBGP,范围从1~65535(目前也有4Byte的AS号,范围从1~4294967295)。
Hold Time(保持时间):2Byte,对等体之间相互协商的最大保持时间,一般为Keepalive时间的3倍,缺省情况下保持时间为180s。保持时间是一个计数器,从0一直增加到该值,等待接收Keeplive(每隔60s发送一次)或者Update报文,收到后将保持时间清零,如果保持时间内没有收到则认为邻居失效。如果BGP对等体之间协商的保持时间不一致,将会采取较短的时间作为保持时间。最小可以为0,这种情况下BGP连接被认为永远是UP,对等体之间不会发送Keeplive报文来检测邻居是否失效。
BGP Identifier(BGP标识):4Byte,BGP路由器的Router ID,以IP地址的形式表示,用来识别BGP路由器。在VRP5.30系统中,如果没有通过命令router id进行配置,则按照如下规则进行选择:优选Loopback接口地址中最大的地址作为Router ID,如果没有Loopback接口配置了IP地址,则从配置了IP地址的物理接口中选择一个最大的IP地址作为Router ID。
Opt Parm Len(Optional Parameters Length):1Byte,可选参数的长度。如果为0则表示该消息中没有可选参数
Optional Parameters**:可变长的字段,用于BGP邻居会话协商过程中所使用的可选参数列表。每一个参数为一个(参数类型,参数长度,参数值)三元组,这个字段用于公布一些可选功能的支持,如多协议拓展功能,路由刷新能力,四字节AS号等功能。
4.png

2.4 Update报文

5.png

  • 前面两部分表示路由撤销信息,后面三部分表示路由可达信息;
    • 路由可达信息携带各种属性;
    • 但是路由撤销信息就不需要携带各种属性了,因为这时候是撤销了。

Update消息被用作在BGP对等体之间传递路由信息。多条可达路由信息可以被通告到相应的对等体上,或者多条不可达路由信息被撤销。Update消息由以下五部分组成:

  • Withdrawn Routes Length(撤销路由长度):(2字节无符号整数)不可达路由长度,表示Withdrawn Routes字段的数据长度。如果Withdrawn Routes Length字段数值为0,则表示Withdrawn Routes字段没有任何数据,在Update消息中不会被显示。
  • Withdrawn Routes(撤销路由):(可变长)撤销路由。该字段包括一系列的IP地址前缀信息,以的格式来表示,比如<19,198.18.160.0>表示一个198.18.160.0 255.255.224.0的网络。6.png
  • Path Attribute Length(路径属性长度):(2字节无符号整数)路由属性长度,表示Path Attribute字段的数据长度。如果Path Attribute数值为0,则表示Path Attribute字段没有任何数据,在Update消息中不会被显示
  • Path Attributes(路径属性):(可变长字段)路径属性。每个路径属性都是由可变长的三元组所组成:,为BGP提供选择最短路径,检查路由环路以及决定路由策略的信息,属性类型是一个2Byte的长度,包括1Byte的属性标记,1Byte的属性类型代码字段。

7.png
从该地段的格式前两个标记字段来看,可以将属性分为四种,即公认必遵,公认任意,可选过渡,可选非过渡

  • 属性的第0位表示属性是公认的还是可选的(0:公认,1:可选)。
  • 属性的第1位表示属性是过渡还是非过渡(0:非过渡,1:过渡),公认属性总是可过渡的,所以第一位总是置为1。
  • 属性的第2位表示可选过渡属性中的信息是完全的还是部分的(0:完全,1:部分)。
  • 属性的第3位表示属性的长度(0:一个字节,1:两个字节)。
  • 第4到7位未被使用,总是为0。
  • 第8到第15位是属性类型的代码 | 属性编号 | 属性名称 | 类型/类型代码 | | —- | —- | —- | | 1 | Origin属性 | 公认必遵/类型代码1 | | 2 | AS_path属性 | 公认必遵/类型代码2 | | 3 | Next_Hop属性 | 公认必遵/类型代码3 | | 4 | MED属性 | 可选非过渡属性/类型代码4 | | 5 | Local_pref属性 | 公认任意属性/类型代码5 | | 6 | Atomic-aggregate属性 | 公认任意属性/类型代码6 | | 7 | Aggregator属性 | 可选过渡属性/类型代码7 | | 8 | Community属性 | 可选过渡属性/类型代码8 | | 9 | Originator-ID属性 | 可选非过渡属性/类型代码9 | | 10 | Cluster_list属性 | 可选非过渡属性/类型代码10 | | 11 | DPA | BGP的目的点属性 | | 12 | 通告者 | BGP/IDRP路由服务器属性 | | 13 | RCID_PATH/Cluster_ID | BGP/IDRP路由服务器属性 | | 14 | MP_REACH_NLRI | 可选非过渡属性/类型代码14 | | 15 | MP_UNREACH_NLRI | 可选非过渡属性/类型代码15 | | 16 | 拓展团体属性 | 可选非过渡属性/类型代码16 |

  • Network Layer Reachability Information:(变长)网络可达信息。包括一系列的IP地址前缀。格式与撤销路由字段一样。(路由信息)

8.png
最小的Update消息的长度为23个字节(19个字节的报文头+2字节的撤销路由长度+2字节的路径属性长度)。这样的Update消息被称之为End-of-RIB,用于BGP GR。
一条Update消息可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update消息里的路由属性适用于该Update消息中的NLRI字段里的所有目的地(用IP前缀表示)。
一条Update消息可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚的定义了BGP Speaker之间先前通告过的路由。
一条Update消息可以只用于撤销路由。这样就不需要包括路径属性或者网络可达信息。相反,也可以只用于通告可达路由,就不需要携带Withdrawn Routes了。

2.5 KeepAlive报文

9.png
Keepalive报文主要用于对等体路由器间的运行状态以及链路的可用性确认。Keepalive报文的组成只包括一个BGP数据报头。Keepalive消息在对等体之间的交换频率以保证对方保持定时器不超时为限。
当一台路由器与其邻居建立BGP连接之后,将以Keepalive-Interval设定的时间间隔周期性地向对等体发送Keepalive报文,表明该连接是否还可保持。
缺省情况下,发送Keepalive的时间间隔为60秒,Hold Time是180秒。每次从邻居处接收到Keepalive报文将重置Hold Time定时器,在发送消息的时间间隔内,如果BGP发送过Update消息,就会抑制Keepalive消息的发送。如果Hold Time定时器超时,就认为对等体Down掉。
10.png

2.6 Notification报文

11.png
Notification报文主要在发生错误或对等体连接被关闭的情况下使用,该消息携带各种错误码(如定时器超时等),以及错误子码和错误信息。

Errorcode:错误子码。1Byte长度,提供了与错误种类有关的具体信息。
消息头错误子码:

  1. 连接非同步
  2. 错误的消息长度
  3. 错误的消息类型

Open消息错误子码:

  1. 不支持的版本号
  2. 错误的对等体AS号
  3. 错误的BGP ID
  4. 不支持的可选参数
  5. RFC1771里被定义为认证失败,RFC4271里则对此表示反对。
  6. 不可接受的保持时间(Hold Time)

Update消息错误子码:

  1. 畸形的属性列表
  2. 无法识别的公认属性
  3. 缺少的公认属性
  4. 属性标志位错误
  5. 属性长度错误
  6. 无效的Origin属性
  7. RFC1771里被定义为AS路由环路,RFC4271里对此表示反对。
  8. 无效的下一跳属性
  9. 可选属性错误
  10. 无效的网络字段
  11. 畸形的AS_Path

保持时间超时:0
状态机错误:0
终止:0

Data:依赖于不同的错误码和错误子码,用于标识错误原因。是一个可变长的字段,被Notification用作诊断错误的原因。注:Data字段的长度可以由以下公式来决定:消息长度=21+Data长度(Notification消息最小长度为21个字节,其中一家包括消息头。)

2.7 Route-refresh

12.png
主要字段的解释如下:
AFI(Address Family Identifier):地址族标识符(2字节)。比如IPv4,IPv6,VPNv4,VPNv6等。
Res(Reserved Field):保留区域(1字节),发送方应将其设置为0,接收方应当忽略该区域的信息。
SAFI(Subsequent Address Family Identifier):子地址族标识符(8字节)。比如,单播,组播。

  • 在所有BGP路由器使能Route-refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。
    • 使用refresh bgp peer_address import即可以触发该报文的发送,对等体收到该报文后,就会发送Update报文,发送完整路由消息。
    • 如果使用命令refresh bgp peer_address export,则会在该路由器上直接发送Update完整路由信息,此时就不需要route refresh报文了。

13.png

2.BGP邻居建立

2.1 BGP邻居发现

image.png

  • BGP协议被设计运行在AS之间传递路由,AS之间是广域网链路,数据包在广域网上传递是可能出现不可预测的链路拥塞或丢失等情况,因此BGP使用TCP作为其承载协议来保证可靠性。
  • BGP使用TCP封装建立邻居关系,端口号为179,TCP采用单播建立连接,因此BGP协议并不像RIP和OSPF一样使用组播发现邻居。单播建立连接也使BGP只能手动指定邻居。

2.2 BGP状态机

14.png

  • BGP有限状态机共有六种状态,分别是Idle、Connect、Active、OpenSent、OpenConfirm和Established
    • Idle状态是BGP初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求,只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
      • Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的
      • 任何状态中收到Notification报文或TCP拆除链路通知等Error事件后,BGP都会转至Idle状态。
    • 在Connect状态下,BGP启动连接重传定时器(Connect Retry,缺省为32秒),等待TCP完成连接。
      • 此阶段主动发起TCP连接,
      • 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态,
      • 如果TCP连接失败,那么BGP转至Active状态,
      • 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
      • 如果发生其它事件(由系统或者操作人员启动的),则退回到Idle状态。
    • 在Active状态下,BGP总是在试图建立TCP连接。
      • 此阶段等待对方发起TCP连接,
      • 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态
      • 如果TCP连接失败,那么BGP停留在Active状态
      • 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态
    • 在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
      • 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。
      • 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
    • 在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状态

2.2 BGP邻居类型

2.2.1 EBGP邻居

image.png

  • EBGP只用于不同AS之间传递路由。
  • 在AS 100内实现将学到的AS 200和AS 300路由进行交换,可以在拓扑中的RTB与RTC路由器上将BGP的路由引入IGP协议,再将IGP协议的路由在RTB与RTC路由器上引入回BGP协议,实现AS 200与AS 300路由的交换。
  • 上述方法存在以下几个缺点:
    • 公网上BGP承载的路由数目非常大,引入IGP协议后,IGP协议无法承载大量的BGP路由;
    • BGP路由引入IGP协议时,需要做严格的控制,配置复杂,不易维护;
    • BGP携带的属性在引入IGP协议时,由于IGP协议不能识别,可能会丢失。
  • 因此我们需要设计BGP在AS内部完成路由的传递。

2.2.2 IBGP邻居

image.png

  • 如上图,因为BGP使用TCP作为其承载协议,所以可以跨设备建立邻居关系。如图所示,RTB与RTC之间建立IBGP邻居关系,并各自将从其他AS学到的路由传递给对端,实现BGP路由在AS内的传递。

2.3 BGP邻居关系配置

image.png
配置步骤:

  • 配置Router ID(标识路由器);
  • 配置EBGP邻居关系(AS之间传递路由);
  • 配置IBGP邻居关系(AS内部传递路由)。

配置解释:

  • 如果没有配置Router ID,BGP路由器会按一定规律自动选举Router ID,选举规律如下:
    • 路由器在它的所有Loopback接口上选择数值最高的IP地址;
    • 如果没有Loopback接口,路由器会在它的所有物理接口上选择数值最高的IP地址。
    • 配置命令:router id x.x.x.x
  • BGP邻居关系的类型主要靠配置的AS号区别,peer关键字后面是对端邻居的接口IP地址,as-number后面是邻居路由器所在的AS号,AS号相同则为IBGP邻居关系,AS号不同,则为EBGP邻居关系。
  • peer关键字后面是对端邻居的更新源IP地址,标识自己向对端邻居发起TCP连接的目的地址。该地址可以是对端邻居直连接口的IP地址,也可以是非直连Loopback接口的IP地址(但必须保证该IP地址路由可达)。建立IBGP邻居关系时,一般使用Loopback接口的IP地址,因为Loopback接口开启后一直处于UP状态,只要保证路由可达,邻居关系一直处于稳定状态,而建立EBGP邻居关系后,一般使用直连接口的IP地址,因为EBGP是跨AS建立邻居关系,邻居关系建立之前非直连接口之间的路由不可达。

image.png

  • 建立EBGP邻居关系时,一般使用直连接口的IP地址,建立IBGP邻居关系时,一般使用Loopback接口的IP地址

2.4 BGP邻居关系建立

image.png

  • BGP通过报文的交互完成邻居建立、路由更新等操作。
  • 共有Open、Update、Notification、Keepalive和Route-refresh等5种报文类型。

    • Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP邻居之间的连接关系。BGP邻居在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。确认后,BGP邻居间可以进行Update、Notification、Keepalive和Router-refresh报文的交换。
    • Update报文:用于在BGP邻居之间交换路由信息。Update报文可以发布多条属性相同的可达信息,也可以撤销多条不可达路由信息。
      • 一条Update报文可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update报文里的路由属性适用于该Update报文中的NLRI字段里的所有目的地(用IP前缀表示)。
      • 一条Update报文可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚地定义了BGP路由器之间先前通告的路由。
      • 一条Update报文可以只用于撤销路由,这样就不需要包括路径属性或者NLRI。相反,也可以只用于通告可达路由,就不需要携带撤销路由信息了。
    • Notification报文:当BGP路由器检测到错误状态时,就向邻居发出Notification报文,之后BGP连接会立即中断。
    • Keepalive报文:BGP路由器会周期性的向邻居发出Keepalive报文,用来保持连接的有效性。
    • Route-refresh报文:Router-refresh用于在改变路由策略后请求对等体重新发送路由信息。
  • BGP的路由器报文交互过程:Idle状态是BGP初始状态。在Idle状态下,BGP路由器拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP路由器才开始尝试与其邻居进行TCP连接,并转至Connect状态。

  • 在Connect状态下,BGP路由器启动连接重传定时器,等待TCP完成连接。
  • 如果TCP连接成功,那么BGP路由器向邻居发送Open报文,并转至OpenSent状态。
  • 如果TCP连接失败,那么BGP路由器转至Active状态。
  • 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器继续尝试与其邻居进行TCP连接,停留在Connect状态。
  • 在Active状态下,BGP路由器总是在试图建立TCP连接。
  • 如果TCP连接成功,那么BGP路由器向邻居发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
  • 在OpenSent状态下,BGP路由器等待邻居的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
  • 如果收到的Open报文正确,那么BGP路由器发送Keepalive报文,并转至OpenConfirm状态。
  • 如果发现收到的Open报文有错误,那么BGP路由器发送Notification报文给邻居,并转至Idle状态。
  • 在OpenConfirm状态下,BGP路由器等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
  • 在Established状态下,BGP路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文

3.BGP路由生成方式

3.1 Network(宣告)

image.png

  • 生成BGP路由的方式有两种:第一种是使用配置命令Network,第二种是使用配置命令import。
  • 如图所示,RTA上存在100.0.0.0/24与100.0.1.0/24的两个用户网段,RTB上通过静态路由指定去往100.0.0.0/24网段的路由,通过OSPF学到去往100.0.1.0/24的路由。RTB与RTC建立EBGP的邻居关系,RTB通过Network命令宣告100.0.0.0/24,100.0.1.0/24与10.1.12.0/24的路由,使对端EBGP邻居RTC学习到RTB路由表中的路由。

image.png

3.2 Import(引入)

image.png

  • RTA上存在100.0.0.0/24与100.0.1.0/24的两个用户网段,RTB上通过静态路由指定去往100.0.0.0/24网段的路由,通过OSPF学到去往100.0.1.0/24的路由。RTB与RTC建立EBGP的邻居关系,RTB通过import命令宣告100.0.0.0/24,100.0.1.0/24与10.1.12.0/24的路由,使对端EBGP邻居学习到本AS内的路由。
  • 为了防止其他路由被引入到BGP中,需要配置IP-prefix进行精确匹配,调用route-policy在BGP引入路由时进行控制。

image.png

4.BGP通告原则与路由处理

4.1 BGP的Update报文

  • BGP通过Network和Import两种方式生成BGP路由,BGP路由封装在Update报文中通告给邻居。BGP在邻居关系建立后才开始通告路由信息。
  • Update消息主要用来公布可用路由和撤销路由,Update中包含以下信息:
    • 网络层可达信息(NLRI):用来公布IP前缀和前缀长度。
    • 路径信息:为BGP提供环路检测,控制路由优选。
    • 撤销路由:用来描述无法到达且从业务中撤销的路由前缀和前缀长度。
  • 在通告BGP路由时,由于各种因素的影响,为了避免路由通告过程中出现问题,BGP路由通告需要遵循一定的规则。

4.2 BGP数据库

image.png
image.png

  • BGP路由信息处理:
    • 当从对等体接收到更新数据包时,路由器会把这些更新数据包存储到路由选择信息库(routing Information Base,RIB)中,并指明是来自哪个对等体的(adj-RIB-In)。这些更新数据包被输入策略引擎过滤后,路由器将会执行路径选择算法,来为每一条前缀确认最佳路径。
    • 得出的最佳路径被存储到本地BGP RIB(Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB),以用作安装考虑。
    • 除了从对等体接收来的最佳路径外,Loc-RIB也会包含当前路由器注入的(被称为本地发起的路由),并被选择为最佳路径的BGP前缀。Loc-RIB中的内容在被通告给其他对等体之前,必须通过输出策略引擎。只有那些成功通过输出策略引擎的路由,才会被安装到输出RIB(Adj-RIB-Out)中。

1-2:当从对等体接收到更新数据包时,路由器会把这些更新数据包存储到路由选择信息库(Routing Information Base, RIB)中,并指明是来自哪个对等体的(Adj-RIB-In)。这些更新数据包被输入策略引擎过滤后,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径。
3:得出的最佳路径被存储到本地BGP RIB (Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB),以用作安装考虑
4:如果启用了多路径特性,最佳路径和所有等值路径都将被提交给IP-RIB考虑。(选择best最优的放入路由表)
5:除了从对等体接收来的最佳路径外,Loc-RIB也会包含当前路由器注入的(被称为本地发起的路由),并被选择为最佳路径的BGP前缀。Loc-RIB中的内容在被通告给其他对等体之前,必须通过输出策略引擎。只有那些成功通过输出策略引擎的路由,才会被安装到输出RIB (Adj-RIB-Out)中。

4.2 BGP通告原则

  • BGP设备将最优路由加入BGP路由表,形成BGP路由
    • 从IBGP对等体获得的路由,只发布给EBGP对等体
    • 从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体
    • 只将BGP的最优路由发布给对等体
    • 只发送更新的BGP路由
    • IBGP与IGP的同步
  1. 从EBGP对等体获得的路由
    1. 会发布给EBGP对等体
    2. 会发布给IBGP对等体
  2. 从IBGP对等体获得的路由
    1. 不会发布给IBGP对等体
    2. 是否发布给EBGP对等体,要看是否开启BGP同步
      1. BGP与IGP同步的概念:BGP Spaker不将从IBGP对等体获得的路由信息通告给它的EBGP对等体,除非该路由信息也能通过IGP获得。(在IBGP路由加入路由表并发布给EBGP对等体之前,会先检查IGP路由表,只有在IGP也知道这条路由时,它才会被加入到路由表,并发布给EBGP对等体)(这是为了防止路由黑洞,但是在华为设备上,默认是关闭的,而且是不能打开的,主要是担心IGP无法传递BGP数量庞大的路由信息,这时可以考虑IBGP全连接,RR和联盟)
  3. 只将BGP的最优路由发布给对等体
    1. 有效+最优,即*+>
    2. 如果路由是无效的,那么也就谈不上最优了
    3. 路由是否有效,有两个条件:下一跳是否可达,BGP与IGP同步是否开启
  4. 只发送更新的路由

4.2.1 仅将自己最优的路由发布给邻居

image.png

  • 存在多条有效路由时,BGP路由器只将自己最优的路由发布给邻居。
    • RTD可以从BGP邻居RTB与RTC学习到100.0.0.0/24的路由,同时RTD将自己的直连路由200.0.0.0/24发布到BGP中。在RTD上使用命令display bgp routing-table查看如图所示。
    • 在RTE上使用命令display bgp routing-table查看如图所示。可以发现,RTD将自己标为有效且最优的路由发布给了BGP邻居RTE。
  • BGP路由表中的状态含义:
    • Status codes: * - valid, > - best, d - damped, h - history, i - internal, s -suppressed, S - Stale
    • Origin : i - IGP, e - EGP, ? – incomplete
    • Network:显示BGP路由表中的网络地址
    • NextHop:报文发送的下一跳地址
    • MED:路由度量值
    • LocPrf:本地优先级
    • PrefVal:协议首选值
    • Path/Ogn:显示AS路径号及Origin属性
    • Community:团体属性信息


4.2.2 从EBGP学到的最优发给所有BGP邻居

image.png

  • BGP路由器通过EBGP获得的最优路由会发布给所有的BGP邻居(包括EBGP邻居和IBGP邻居)。
    • 如图所示,RTA上有一个100.0.0.0/24的用户网段,并通过EBGP将该网段发布给BGP邻居RTB。RTB收到EBGP邻居发送来的100.0.0.0/24的路由后,将会通告给自己的IBGP邻居RTC与EBGP邻居RTD。

4.2.3 从IBGP学到的最优路由不会发布给其他的IBGP邻居

image.png

  • BGP路由器通过IBGP获得的最优路由不会发布给其他的IBGP邻居。
    • 如图所示,RTA上存在一个100.0.0.0/24的用户网段,RTA、RTB与RTC之间互为IBGP邻居,RTA通过IBGP将100.0.0.0/24的路由发布给RTB与RTC,但是RTB并不会将收到的IBGP路由发布给自己的IBGP邻居RTC。
    • 这样设计的目的是防止AS内部形成路由环路。根据规定,BGP路由在同一个AS内进行传递时,AS_Path属性不会发生改变。如图所示,RTA将100.0.0.0/24的路由发布给RTB时,AS_Path属性不变,为空。如果RTB能将IBGP路由100.0.0.0/24发布给RTC,AS_Path依旧为空。则RTC也有可能将100.0.0.0/24的路由发布给RTA,因为AS_Path为空,RTA并不会拒收该IBGP路由,路由环路产生。因此,上述通告原则是为了防止在AS内部形成路由环路。

4.2.4 IBGP与IGP同步

image.png

  • RTA上存在一个100.0.0.0/24的用户网段,通过EBGP发布给RTB。RTB与RTD建立了IBGP邻居关系,RTD通过IBGP学习到该BGP路由,并将该路由发布给EBGP邻居RTE。
  • 当RTE访问100.0.0.0/24的路由时,查找路由表,发现到达100.0.0.0/24路由的下一跳是RTD,RTE查找出接口后,将数据包发送给RTD,RTD收到数据包后,查找路由表,发现到达100.0.0.0/24路由的下一跳是RTB,出接口是RTD上与RTC相连的接口,于是将数据包发送给RTC,RTC查找路由表,发现没有到达100.0.0.0/24的路由,于是将数据丢弃,形成“路由黑洞”。
  • BGP的通告原则:一条从IBGP邻居学来的路由在发布给一个BGP邻居之前,通过IGP必须知道该路由,即BGP与IGP同步。
    • 如图所示,RTD在收到RTB发来的IBGP路由之后,如果要发布给BGP邻居RTE,则在发布之前先检查IGP协议(即OSPF协议)能否学到该条路由。如果能,则将IBGP路由发布给RTE。
    • 在华为路由器上,默认是将BGP与IGP的同步检查关闭的,原因是为了实现IBGP路由的正常通告。但关闭了BGP与IGP的同步检查后会出现“路由黑洞”的问题。因此,有两种解决方案解决上述问题。
    • 将BGP路由引入到IGP,从而保证IGP与BGP的同步。但是,因为Internet上的BGP路由数量十分庞大,一旦引入到IGP,会给IGP路由器带来巨大的处理和存储负担,如果路由器负担过重,则可能瘫痪。
    • IBGP路由器必须是全互联,确保所有的路由器都能学习到通告的路由。这样可以解决关闭同步后导致的“路由黑洞”问题。

4.3 BGP路由信息处理

image.png

  • IP路由表(IP_RIB):全局路由信息库,包括所有的IP路由信息。
  • BGP路由表(Local_RIB):BGP路由信息库,包括本地BGP路由器选择的路由信息,邻居表,邻居清单列表。
  • 收到BGP邻居发来的Update报文,路由器会执行算法进行路径选择,确定每一条前缀的最佳路径,并将计算出的最佳路径存储到本地BGP路由表(Local_RIB)中。
  • 如果启用了多路径特性,最佳路径和所有等值路径都被提交给IP_RIB,考虑是否安装。除了从BGP邻居接收的最佳路径外,Local_RIB也包含当前路由器注入的路由(被称为本地发起的路由)。
  • 在Local_RIB中,只有被选为最优的前缀才会被封装到Update报文中通告给自己的BGP邻居。

5.BGP常用属性介绍

image.png

  • 以上两个问题的解决方案:
    • 在AS之间交换路由可达信息时,设计BGP能够提供丰富的属性,实现对路由的灵活控制和优选。
      • 修改路由表,调整AS之间的链路Metric;2.不修改路由表,使用策略修改路由下一跳。但是这些方法在某些情况下具有局限性,不能满足网络的丰富需求。
    • 路由在AS之间传递时记录传播路径,防止环路的产生。

5.1 BGP的丰富属性

image.png

  • 公认属性:所有BGP路由器都必须识别并支持的属性。
    • 公认必遵:BGP的Update消息中必须包含的属性。
    • 公认任意:不必存在于BGP的Update消息中,可以根据需求自己选择的属性。
  • 可选属性:不要求所有的BGP路由器都能够识别的属性。
    • 可选过渡:BGP不能识别该属性,但可以接收该属性并将其发布给它的邻居的属性。
    • 可选非过渡:BGP可以忽略包含该属性的消息并且不向它的邻居发布。

1.公认属性
(1)公认必遵属性:Origin、AS_Path、Next_Hop

  • 所有BGP路由器都可以识别,且必须存在于Update消息中
  • 如果缺少这种属性,路由信息就会出错,邻居关系将重置


    (2)公认任意属性:Local_Pref

  • 所有BGP路由器都可以识别,但不要求必须存在于Update消息中

  • 缺少这种属性,路由信息也不会出错


    2.可选属性
    (1)可选过渡属性:Community、Aggregator

  • 在BGP对等体之间具有可传递的特性

  • BGP路由器可以不支持此属性,但它仍然会接收这类属性,并传递给其他对等体

(2)可选非过渡属性:MED、Originator_ID、Cluster_List

  • 如果BGP路由器不支持此属性,则相应的这类属性会被忽略,且不会传递给其他对等体(指的是,路由也不会再往外传送了)

    5.2 Prefer_Value

  • Preference_Value对选路的影响

image.png

  • Preference_Value是BGP的私有属性(华为私有属性),Preference_Value相当于BGP选路规则中Weight值,仅在本地路由器生效。Preference_Value值越大,越优先。

  • 如图所示,AS 200内有一个200.0.0.0/24的用户网段,AS 100内的管理员希望通过高带宽链路访问AS 200内的200.0.0.0/24网段,并希望在RTA上的策略只能影响自己的选路,不能影响其他设备,如何实现?

  • 解决方法:
    • 在RTA上配置IP-Prefix匹配200.0.0.0/24的路由,再设置Route-policy调用该IP-Prefix,并设置Preference_Value为100,将策略应用在对RTC发布路由的Import方向。
  • 验证:RTC上使用Tracert命令,查看访问200.0.0.0/24网段经过的路由器。

5.3 Local_Preference

image.png

  • 如图所示,AS 200内有一个200.0.0.0/24的用户网段,通过BGP发布给AS 100。AS 100内的管理员如何设置才可以实现通过高带宽链路访问200.0.0.0/24的网络?
  • 解决办法:
    • 在RTC上设置IP-Prefix匹配200.0.0.0/24的路由,使用route-policy调用该IP-Prefix,并设置Local_Preference为200,将策略应用在对RTA发布路由的Export方向。
  • Local_Pref属性仅在IBGP邻居之间有效,不通告给其他AS。它表明路由器的BGP优先级,值越大越优。
  • Local_Pref属性用于判断流量离开AS时的最佳路由。当BGP路由器通过不同的IBGP邻居获得目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由,其默认值为100
  1. 公认任意属性,表明BGP路由器的优先级,该属性指在IBGP对等体之间有效,不通告给其他AS,本地优先级属性可以手动配置,数值范围是0~2-1,数值越大,该路由越好。如果没有设置本地优先级属性,BGP选路时将该路由的本地优先级按缺省值100来处理。
  2. 用于判断流量离开AS时的最佳路由
  3. 经典例子

5.png

5.2 Origin

image.png

  • 如图所示,AS 200内运行OSPF协议,200.0.0.0/24网段宣告到OSPF中。RTB通过Network方式将200.0.0.0/24的路由变为BGP路由通告给RTA,RTC通过Import方式将200.0.0.0/24的路由变为BGP路由通告给RTA。
  • BGP在AS之间传递信息,承载大量的路由。如果到达同一目的IP有多条路径,且BGP学到这些路由通过不同的方式,则Origin属性是决定最优路径的一个因素,用于标明路由的起源。
  • Origin的三种属性:
    • i表明BGP路由通过Network命令注入;
    • e表明BGP路由是从EGP学来的,EGP协议在现网中很难见到,但可以通过路由策略将路由的Origin属性修改为e;
    • ?即Incomplete表明BGP路由通过其他方式学到路由信息,如使用import命令引入的路由。
    • 3种Origin属性的优先级为:i>e>Incomplete(?)

1.公认必遵属性,定义路由信息的来源
2.主要有:

  • IGP
    • 通过路由始发AS的IGP得到的路由信息(通过network命令注入的路由)
    • 标识符为“i”
    • 比如通过network命令注入到BGP路由表的路由(该路由必须存在才可以宣告)
  • EGP
    • 通过EGP得到的路由信息
    • 标识符为“e”
    • 此EGP非彼EGP,已经被淘汰
  • Incomplete
    • 通过其他方式学习到的路由信息
    • 标识符为“?”
    • 比如通过BGP的import-route命令引入的路由

💬 聚合路由的起源属性可以是IGP,也可能是Incomplete,这依赖于聚合路由的成员路由的起源属性,如果成员路由的origin属性都是IGP,则聚合路由的起源属性为IGP。如果成员路由的origin属性是Incomplete,则聚合路由的起源属性为Incomplete。而如果有些成员路由是IGP,而有些成员路由的属性是Incomplete,则生成的聚合路由的起源属性是Incomplete。
image.png

5.3 AS_Path

image.png

  • BGP针对以上2个问题,设计了AS_Path属性,该属性记录了路由经过的所有AS的编号:
    • 图中RTA从RTB收到100.0.0.0/24的路由时,AS_Path为(2,4),RTA从RTC收到100.0.0.0/24的路由时,AS_Path为(3,5,4)。规定AS_Path越短(记录的AS编号越少),路径越优,因此RTA会优选从RTB收到的100.0.0.0/24的路由。
    • 以RTE为例,通过BGP发布100.0.0.0/24的路由,路由可能通过RTE->RTB->RTC->RTD->RTE形成环路。为了防止环路的产生,RTE在收到RTD发来的路由时会检查AS_Path(该路由携带的)属性,如果发现该路由的AS_Path中包含自己的AS号,则丢弃该路由。
  • AS_Path的4种类型:
    • AS_Sequence
    • AS_Set
    • AS_Confed_Sequence
    • AS_Confed_Set

1.公认必遵属性,记录路由经过的AS号,BGP对等体传递的每条路由都会携带这份AS号列表。

  • 路由在AS内传递时,不对路由的AS_Path属性内容做任何改动
  • 路由在离开AS时,当前的AS号会自动添加到AS_Path序列的前面
  • 当任何BGP设备收到路由时,都要检查AS_Path属性的内容,如果在AS_Path中含有接收路由器所在AS号,则BGP路由器会丢弃掉该路由,以避免环路。AS_Path除了能够防环外,还可以根据AS_Path的长度决定选择最优路由。

2.分类

  • AS_SET:由一系列AS号无序地组成,包含在UPDATE消息里。当网络发生聚合时,可通过适当策略使AS_PATH使用类型AS_SET来避免路径信息丢失。
  • AS_SEQUENCE:由一系列AS号顺序地组成,包含在UPDATE消息里。一般情况下,AS_PATH类型为AS_SEQUENCE
  • AS_CONFED_SEQUENCE:在本地联盟内由一系列成员AS号按顺序地组成,包含在UPDATE消息中,用法和AS_SEQUENCE相同,只能在本地联盟内传递。
  • AS_CONFED_SET: 在本地联盟内由一系列成员AS无序地组成,包含在UPDATE消息中,用法和AS_SET相同,只能在本地联盟内传递。

1.png

  1. 在AS_PATH中有可能仅含有一种segment类型,也可能同时含有多种segment类型,若多种类型同时出现在AS_PATH中,则顺序一定是AS_CONDED_SEQUENCE>AS_CONFED_SET>AS_SEQUENCE>AS_SET
  2. AS_PATH和AS_CONFED_SET一定是聚合路由的AS_PATH才会包含的segment类型。
  3. 无论是何种类型的segment,若其中含有的AS号等于接收设备所在的AS号,则该路由都会因为环路问题被丢弃。
  4. AS_PATH的长度是由AS_SEQUENCE这种segment的AS号的数量来决定的,其AS号越多,则代表长度越长。而AS_CONFED_XX和AS_SET的长度都不计入AS_PATH长度计算。在BGP选路规则中,如果其它属性都一致。则AS_PATH的长度越短的路由越好。
  5. BGP防环是靠EBGP间的AS_PATH属性来保证的,但如果使用命令peer x.x.x.x allow-loop,可使接收BGP设备接收含有自己AS号码的路由,这破坏了BGP的防环规则。这条命令的使用场景主要在MPLS VPN环境中。

3.举例

  • AS_SET、AS_SEQUENCE

2.png

  • 有大括号的就是AS_SET,没有大括号的就是AS_SEQUENCE

2.png

  • AS_CONFED_SEQUENCE、AS_CONFED_SET

3.png

  • AS_CONFED_SEQUENCE就是小括号,有个特点,是在AS_SEQUENCE(这里是100)的左边,如果想要出现AS_CONFED_SET,那么就需要做手动聚合,这里,会在小括号里的右边出现大括号。

5.4 Next_Hop

image.png

  • BGP路由器将本端始发路由发布给IBGP邻居时,会把该路由信息的Next_Hop设为本端建立邻居关系所使用的接口IP
    • 如图所示,RTA将100.0.0.0/24的网段发布给RTB时,如果RTA与RTB使用直连接口建立IBGP邻居,则Next_Hop为RTA上与RTB直连的接口IP,如果RTA与RTB使用Loopback接口建立IBGP邻居,则Next_Hop为RTA的Loopback接口IP。
  • BGP路由器在向EBGP邻居发布路由时,会把路由信息的Next_Hop设置为本端与对端建立BGP邻居关系的接口IP
    • 如图所示,RTB将100.0.0.0/24的网段发布给RTC时,Next_Hop为RTB上与RTC直连的接口IP。
  • BGP路由器在向IBGP邻居通告从EBGP学来的路由时,不改变该路由下一跳属性。
    • 特例:如图所示,RTA从RTB学到RTC发布的200.0.0.0/24的网段时,Next_Hop为RTD的出接口IP,因为RTB与RTD在同一网段,RTC通告给RTB的Next_Hop为RTD的出接口IP。
  • 对于上述三种情况的解释:
    • EBGP邻居之间一般采用直连接口建立邻居关系,EBGP邻居在相互通告路由时会修改Next_Hop为自己的出接口IP
    • IBGP邻居通常采用Loopback接口建立邻居,当路由是本路由器起源的,在发送给邻居之后Next_Hop改为自己的更新源地址,这样即使网络中出现链路故障,只要Next_Hop可达,同样可以访问目的网段,提高网络可靠性。
    • 相对于IGP,如RIP在发布路由时,每经过一个路由器都会修改下一跳,发布路由的路由器都宣称自己能够到达目的网络,并采用逐跳传递的方式将数据包发送给目标网络,但网络中的路由器并不知道谁是真正的始发路由器,因此会造成环路。BGP在EBGP之间传递时才修改Next_Hop,IBGP发送从EBGP学来的路由给IBGP邻居时并不修改下一跳,在一定程度上起到了防环作用。

1.公认必遵属性,记录了路由的下一跳信息
2.经典例子
4.png

  • BGP在向EBGP邻居通告路由时,或者将本地发布的BGP路由通告给IGBP邻居时,下一跳属性是本地BGP与对端连接的端口地址。如胶片所示,RTC在向RTA通告路由18.0.0.0/8时,下一跳属性为10.0.0.2,RTB在向RTA通告路由19.0.0.0/8时,下一跳属性为21.0.0.1。
  • 对于多路访问的网络(广播网或NBMA网络),下一跳情况有所不同:如胶片所示,RTC在向RTA通告路由20.0.0.0/8时,发现本地端口10.0.0.2同此路由的下一跳10.0.0.3(指在RTC路由表中此路由的下一跳)为同一子网,将使用10.0.0.3作为向EBGP通告路由的下一跳,而不是10.0.0.2。
  • BGP在向IBGP通告从其他EBGP得到的路由时,不改变路由的下一跳属性,而直接传递给IBGP邻居。如胶片所示,RTA通过IBGP向RTB发送18.0.0.0/8和20.0.0.0/8的路由下一跳不变。

🌈下一跳可达为BGP选路规则中第0条规则,如果BGP路由的下一跳IP地址不可达,那么该BGP路由不会参与选路

5.6 MED

image.png

  • 如图所示,AS 300内的管理员希望在AS 300内操作影响AS 200通过高带宽链路访问100.0.0.0/24,如何实现?
  • 解决方法:
    • 在RTE上设置IP-Prefix匹配100.0.0.0/24的路由,再设置Route-Policy调用该IP-Prefix,并设置MED为100,将策略应用在对RTC发布给路由的Export方向。
    • MED(Multi-Exit-Discriminator)属性仅在相邻两个AS之间传递,收到此属性的AS不会再将其通告给任何其他第三方AS。如图所示,AS100内并不会收到AS 300内设置的MED值,但是AS 200内会收到AS 300内设置的MED值,因此AS 200内可以选择高带宽的路由。
    • MED属性相当于IGP使用的度量值(Metric),它用于判断流量进入AS时的最佳路由。当一个运行BGP的路由器通过不同的EBGP邻居获得目的地址相同但下一跳不同的多条路由时,在其他条件相同的情况下,将优先选择MED值较小者作为最佳路由,其默认值为0。
  1. 可选非过渡属性,相当于IGP的cost值,用来影响邻居AS流量进入本AS的最佳路径。
  2. 默认情况下,接收者只会比较来自同一AS的路由信息的MED值,这意味着,AS_Path的最左边的值相同时才会进行比较。
  3. 经典例子

6.png

  • 路由器默认指对相同AS传递过来的路由进行MED的比较,不会比较不同AS传递的路由,可以使用命令compare-different-as-med来使其比较不同AS传递的路由。

5.7 Community

image.png

  • 如图所示,AS 10内有10.1.10.0/24的用户网段,AS 11内有10.1.11.0/24的用户网段。为了区分用户网段,AS 10内的10.1.10.0/24设置了10:12的Community,AS 11的10.1.11.0/24设置了11:12的Community,通过BGP发送给AS 12后,AS 12希望汇总后屏蔽掉明细路由再发送给AS 13,并且希望AS 13收到路由后不再传递给其他AS,如何实现?
  • 解决方法:

    • 在RTC上设置Community-filter,匹配Community为10:12和11:12的路由,再设置route-policy匹配Community-filter,将两条路由聚合成10.1.10.0/23的路由并调用route-policy。
    • 在RTC上设置route-policy,设置团体属性为no-export,在RTC通告给RTD的Export方向调用该Route-policy。
  • Community属性分为两类:一类是公认团体属性,另一类是拓展的团体属性。

  • 公认团体属性分为4类:
    • Internet:缺省属性,所有路由都属于Internet,此属性的路由可以通告给所有BGP邻居。
    • No_Export(0xFFFFFF01):收到此属性的路由后,不将该路由发布到其他AS。如图,RTB上希望10.1.11.0/24的路由发布给AS 12之后,不再发布给其他AS,则可将10.1.11.0/24的Community属性设置为No_Export;
    • No_Advertise(0xFFFFFF02):收到此属性的路由后,不将该路由通告给任何其他的BGP邻居。如图,RTB上希望只将10.1.11.0/24的路由发布给RTC,并且不再通告给任何其他的BGP邻居,则可将10.1.11.0/24的Community属性设置为No_Advertise;
    • No_Export_Subconfed(0xFFFFFF03):具有此属性的路由在收到后,不能被发送到本地AS之外,也不能发布到联盟中的其他子AS。
  • 拓展的团体属性用一组4字节为单位的列表来表示,路由器中拓展的团体属性格式为aa:nn或团体号:
  • aa:nn中,aa通常为AS编号,nn是管理员定义的团体属性标识;
  • 团体号范围为0-4294967295,在RFC1997中,0-65535与4294901760-4294967295为预留值。

💙 默认情况下,BGP团队属性是不会传给邻居的,需要对指定的邻居配置advertise-community命令。

6.BGP选路原则

  • 首先,路由的下一跳必须可达,然后BGP按照下面顺序选路: | <1>prefer-value (越大越好) | P | | :—- | :—-: | | <2>local-pref (越大越好) | L | | <3>本地始发 | L | | <4>as-path (越短越好) | A | | <5>origin(i>e>?) | O | | <6>med (越小越好) | M | | <7>ebgp>ibgp | N | | <8>igp cost for next-hop (越小越好) | I | | <9>是否支持负载均衡(maximum load-balance) | | | <10>cluster-list (越短越好) | | | <11>originator-id (越小越好) | | | <12>router-id(越小越好) | | | <13>next-hop ip address#neighbor‘s ip address (越小越好) | |
  1. 如果此路由的下一跳不可达,忽略此路由。
    1. 下一跳地址必须可达,否则此路由不优。
  2. Preference_Value值数值高的优先
    1. 协议首选值(Pref_Val)是华为设备的特有属性,该属性仅在本地有效,相当于思科的Weight权重。
  3. Local_Preference值最高的路由优先
    1. 如果路由没有本地优先级,BGP选路时将路由按缺省的本地优先级100来处理。通过执行default local-preference命令可以修改BGP路由的缺省本地优先级。
  4. 聚合路由优先于非聚合路由
    1. 聚合路由优先级高于非聚合路由。
  5. 本地手动聚合路由的优先级高于本地自动聚合的路由
    1. 通过aggregate命令生成的手动聚合路由的优先级高于summary automatic命令生成的自动聚合路由。
  6. 本地通过network命令引入的路由的优先级高于本地通过import-route命令引入的路由
  7. AS路径的长度最短的路径优先
    1. AS_Path的长度不包括AS_Confed_Sequence和AS_Confed_Set。
    2. AS_Set的长度为1,无论AS_Set中包括多少AS号。
    3. 执行bestroute as-path-ignore命令后,BGP选路时,忽略AS_Path的比较。
  8. 比较Origin属性,IGP优于EGP,EGP优于Incomplete
  9. 选择MED较小的路由
    1. BGP只比较来自同一个AS(不包括联盟的子AS)的路由的MED值。即,只有两条路由的AS_Sequence包括AS_Confed_Sequence属性的第一个AS号相同时,BGP才会比较两者的MED值。
    2. 如果路由没有MED属性,BGP选路时将该路由的MED值按缺省值0来处理,执行bestroute med-none-as-maximum命令后,BGP选路时将该路由的MED值按最大值4294967295来处理。
    3. 执行compare-different-as-med命令后,BGP将强制比较来自不同自治系统中的邻居的MED值。除非能够确认不同的自治系统采用了相同的IGP和路由选择方式,否则不要使用compare-different-as-med命令(可能产生环路)。
    4. 执行bestroute med-confederation命令后,只有当AS_Path中不包含外部AS号(不属于联盟的子AS),且AS_Confed_Sequence的第一个AS号相同时,才能比较MED值的大小。
    5. 执行determinstic-med命令后,将消除路由接收顺序对选路结果的影响。
  10. EBGP路由优于IBGP路由
  11. BGP优先选择到BGP下一跳的IGP度量最低的路径
  • 当以上全部相同,则为等价路由,可以负载分担
    • AS_Path必须一致
    • 当负载分担时,以下3条原则无效
  1. 比较Cluster_List长度,短者优先
  2. 比较Originator_ID(日自拍没有Originator_ID,则用Router ID比较),选择数值较小的路径
  3. 比较对等体的IP地址,选择IP地址数值最小的路径

7.路由反射器

7.png

  • 为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接(Full-mesh)关系。假设在一个AS内部有n台路由器,那么应该建立的IBGP连接数就为n(n-1)/2。当IBGP对等体数目很多时,对网络资源和CPU资源的消耗都很大。利用路由反射可以解决这一问题。
  • 在一个AS内,其中一台路由器作为路由反射器RR(Route Reflector),其它路由器作为客户机(Client)。客户机与路由反射器之间建立IBGP连接。路由反射器和它的客户机组成一个集群(Cluster)。路由反射器在客户机之间反射路由信息,客户机之间不需要建立BGP连接。

**

7.1 基本概念

8.png

  • 路由反射器RR(Route Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备。
  • 客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
  • 非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
  • 始发者(Originator):在AS内部始发路由的设备。
  • Originator_ID属性:用于防止集群内产生路由环路。
  • 集群(Cluster):路由反射器及其客户机的集合。
  • Cluster_List属性:用于防止集群间产生路由环路。

7.2 反射规则

9.png

  • 在向IBGP邻居发布学习到的路由信息时,RR按照以下规则发布路由

    • 从EBGP对等体学到的路由,发布给所有的非客户机和客户机。
    • 从非客户机IBGP对等体学来的路由,发布给此RR的所有客户机(当然也包括EBGP邻居)
    • 从客户机学到的路由,发布给此R的所有非客户机和客户机(发起此路由的客户机除外)
  • RR的配置方便,只需要对作为反射器的路由器进行配置,客户机并不需要知道自己是客户机。

  • 在某些网络中,路由反射器的客户机之间已经建立了全连接,它们可以直接交换路由信息,此时客户机到客户机之间的路由反射是没有必要的,而且还占用带宽资源。VRP支持配置命令undo reflect between-clients来禁止RR将从客户机收到的路由再反射给其他客户机。(比如上面中,R2已经和R3建立了IBGP连接,此时就可以在R1上配置这个命令。)

7.3 防环机制

7.3.1 Originator_ID

  1. 可选非过渡属性

  2. Originator ID由RR产生,使用的Router ID的值标识路由的发送者,用于防止集群内产生路由环路。

    1. 当一条路由第一次被RR反射的时候,RR将Originator_ID属性加入这条路由,标识这条路由的发起设备。如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID属性。(需要注意的是,此时的Originator_ID指的是将该路由传递给RR的路由器的Router ID,而不是RR的Router ID)。
    2. 当设备接收到这条路由的时候,将比较收到的Originator ID和本地的Router ID,如果两个ID相同,则不接收此路由。
  3. 经典例子

10.png

7.3.2 Cluster_List

  1. 可选非过渡属性,用于集群间的防环,由每个路由反射器(RR)产生,记录反射路由经过的集群
  2. 路由反射器和它的客户机组成一个集群(Cluster)。在一个AS内,每个路由反射器使用唯一的Cluster ID作为集群标识,缺省情况下,每个路由反射器使用自己的Router ID作为集群ID。
  3. 为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。
  • 当RR在它的客户机之间或客户机与非客户机之间反射路由时,RR就把本地Cluster_ID添加到Cluster_List的前面。如果Cluster_List为空,RR就创建一个。
  • 当RR接收到一条更新路由时,RR会检查Cluster_List。如果Cluster_List中已经有本地Cluster_ID,丢弃该路由,如果没有本地Cluster_ID,将其加入Cluster_List,然后反射该更新路由。
  1. 经典例子

11.png

7.4 备份RR

12.png

  1. 备份RR
  • VRP需要使用命令reflector cluster-id给所有位于同一个集群内的路由反射器配置相同的Cluster_ID。(因为默认情况下,路由反射器使用自己的Router ID来作为Cluster_ID)。
  • 在冗余的环境里,客户机会收到不同反射器发来的到达同一目的地的多条路由,这时客户机应用BGP选择路由的策略来选择最佳路由。
  • Cluster_List的应用保证同一AS内的不同RR之间不出现路由循环。

2.拓扑描述

  • 当客户机Client1从外部对等体接收到一条更新路由(10.0.0.0/24)后,它通过IBGP向RR1和RR2通告这条路由
  • RR1接收到该更新路由后,它向其他的客户机(Client2、Client3)和非客户机(RR2)反射,同时将本地Cluster_ID添加到Cluster_List前面。
  • RR2接收到该反射路由后,检查Cluster_List,发现自己的Cluster_ID已经包含在Cluster_List中,因此,它丢弃该更新路由,不再向自己的客户机反射。

7.5 同级反射器

13.png

7.6 分级反射器

14.png

8.BGP联盟

15.png

  • 联盟将一个AS划分为若干个子AS。每个子AS内部建立IBGP全连接关系,子AS之间建立联盟EBGP连接关系,但联盟外部AS仍认为联盟是一个AS。
  • 配置联盟后,原AS号将作为每个路由器的联盟ID。
  • 保留原有的IBGP属性,包括Local Preference属性(正常情况下,该属性是不会传出AS的)、MED属性和Next_Hop属性等,联盟相关的属性在传出联盟时会自动被删除,即管理员无需在联盟的出口处配置过滤子AS号等信息的操作。

8.1 防环机制

16.png

  • 联盟内部的成员AS号对于其它非联盟AS是不可见的,所以路由在从联盟内部发送到其它非联盟AS时,联盟成员AS号被剥离。

9.BGP路由反射器与联盟对比

参考因素 比 较
多层次 两种方法都支持多层次来进一步增强扩展性。路由反射器支持多级路由反射结构。联盟允许在成员AS内使用路由反射。
策略控制 两者都提供路由选择策略控制,不过联盟可以提供更大的灵活性。
常规IBGP迁移的复杂性 路由反射的迁移复杂性非常低,因为总体网络配置几乎很少发生改变。然而,从IBGP到联盟的迁移需要对配置和网络架构做很大的改变。
能力支持 联盟内的所有路由器必须支持联盟配置能力,因为所有路由器需要支持联盟AS-PATH属性。在路由反射的架构中,只需要反射器支持路由反射能力。然而,在新的分簇设计中,客户也必须支持反射器属性。
IGP扩展 路由反射在AS内需要单一的IGP,而联盟支持单一的或分开的IGP。这可能是联盟比路由反射所具有的最明显的优势。如果IGP达到了其扩展性限制,或者是因为范围太大而难于处理管理任务,那么可以使用联盟来减小IGP路由表的大小。
部署经验 由于更多的服务提供商已经部署了路由反射而非联盟,因此从路由反射中已经获得了更多的经验。
AS合并 实际上AS合并与IBGP扩展性是无关的,但在这里讨论是因为它是联盟的特点之一。 一个AS可以和一个已存的联盟合并,这是通过把新的AS作为联盟的一个子AS对待来完成的。

10.路由聚合

17.png

  • 路由聚合是会使用Aggregator属性(可选过渡属性),该属性标识发生聚合的节点,携带发生聚合节点的route-id和AS号。

10.1 自动聚合

18.png

  • 该命令对BGP引入的路由进行聚合,引入的路由可以是直连路由、静态路由、RIP路由、OSPF路由、ISIS路由。配置聚合后,BGP将按照自然网段聚合路由,明细路由在BGP路由更新中被抑制。该命令对network命令引入的路由无效。
  • BGP只向对等体发送聚合后的路由
  • 缺省情况下BGP不启用自动聚合

10.2 手动聚合

19.png

  • 聚合路由不会携带成员明细路由的AS_Path属性。
  • 通过AS_SET属性来携带AS号,以避免环路。SET和SEQUENCE的不同之处在于,SET选项下的AS列表通常用于路由聚合,将来自不同AS的AS号无无序排列在AS列表里,而SEQUENCE选项下的AS列表是有序的,没经过一个AS都会将其AS号排序在列表的前端。
  • 聚合路由中添加AS_SET有可能产生路由震荡。

11.BGP增强特性

11.1 BGP ORF

20.png
RFC5291、RFC5292规定了BGP基于前缀的ORF能力,能将本端设备配置的基于前缀的入口策略通过路由刷新报文发送给BGP邻居。BGP邻居根据这些策略构造出口策略,在路由发送时对路由条目进行过滤。这样不仅避免了本端设备接收大量无用的路由,降低了本端设备的**CPU使用率,还有效减少了BGP邻居的配置工作,降低了链路带宽的占用率**。

拓扑描述

  • 直连EBGP邻居中,Client1、R1协商基于前缀的ORF 能力后,Client1将本地配置的基于前缀的入口策略打包到Route-refresh报文中发送给R1。R1根据接收到的路由刷新报文构造出口策略,通过**Route-refresh报文发送路由**给Client1。Client1只收到它需要的路由,而R1不必维护路由策略,减少了配置工作。
  • Client1、Client2为RR的客户端,Client1与RR、Client2与RR,分别协商基于前缀的ORF 能力,Client1、Client2将本地配置的基于前缀的入口策略打包到Route-refresh 报文中发送给RR。RR 根据接收到的前缀信息构造出口策略,通过**Route-refresh报文将路由反射**给Client1、Client2。Client1和Client2只收到需要的路由,RR不必维护路由策略,减少了配置工作。

11.2 Active-Route-Advertise

21.png

  • 默认情况下路由只需在BGP中优选即可向邻居发布。配置了此特性之后,路由必须同时满足在BGP协议层面优选与在路由管理层面活跃两个条件,才能向邻居发布。
  • 与命令bgp-rib-only(用来禁止BGP路由下发到IP路由表)互斥。

11.3 BGP按组打包

22.png

  • 其实就是配置时的Peer Group

11.4 4字节AS号概念

23.png
4字节AS号定义的角色

  • New Speaker:支持4字节AS号扩展能力的对等体。
  • Old Speaker:不支持4字节AS号扩展能力的对等体。
  • New Session:New Speaker之间建立的BGP连接。
  • Old Session:New Speaker和Old Speaker之间或者Old Speaker之间建立的BGP连接。


    协议扩展

  • 定义了2种新的可选过渡属性AS4_Path(属性码为0x11)和AS4_Aggregator属性(属性码为0x12)用于在Old Session上传递4字节AS信息

  • 如果New Speaker和Old Speaker建立连接,定义AS_TRANS(保留值为23456)用于衔接2字节AS和4字节AS
  • 新的AS号有三种写法:

    • splain:就是一个十进制的数字
    • asdot+:写成(2字节).(2字节)的形式,所以旧的2字节ASN123可以写成0.123,ASN65536是1.0;最大为65535.65535;
    • asdot:旧的2字节写法照旧,新的4字节写成asdot+的形式;(1-65535;1.0-65535.65535)
    • 华为支持asdot写法。


    拓扑描述

  • R2收到R1的一条四字节AS的路由,AS号码为10.1;

  • R2与R3建立邻居,需要令R3认为R2的AS号为AS_TRANS;
  • R2发送路由给R3的时候把AS_TRANS记录在AS_Path里面,把10.1与自己的AS号码20.1按照BGP要求的顺序记录在AS4_Path;
  • R3对于不识别的属性AS4_Path不作处理依然保留,它只按照BGP的规则来发送路由给RD。当然它认为R4的AS号码也是AS_TRANS;
  • 这样当R4收到从R3来的路由会把AS_PATH中的AS_TRANS按照顺序替换为AS4_Path里所记录的相应的地址,在R4上把AS_PATH属性还原为30 20.1 10.1。

12.Internet设计概念

12.1 优化BGP能力

建立对等体会话

  • 对等体会话可以通过BGP Speaker两端直连口或者环回口建立。一般情况下,IBGP邻居通过环回口建立邻居关系;EBGP邻居通常通过直连物理口建立邻居关系。
  • 为了保证对等体间会话的安全可以通过配置认证来实现。
  • IBGP邻居关系(没有使用路由反射器或者联盟)需为逻辑全互联。
  • 为了减轻对IGP的压力,可以禁用同步。


    路由更新起源

  • 可以通过路由引入或者network命令,将路由引入到BGP中。优化路由策略 可以通过输入策略和输出策略、ORF等对BGP路由进行优化。路由过滤和属性控制

  • 在接收或者发布BGP路由时,可以对发送或者接收的路由进行过滤。
  • 通过对BGP路由属性进行控制,可以影响BGP路由的传播。


    路由聚合

  • 通过路由聚合能够进一步优化BGP路由表项,缩减路由表项规模。

12.2 提高BGP可用性

冗余

  • 通过冗余路径以保证在网络发生故障时有备份路径


    流量对称

  • 科学的设计网络、具体策略的应用以保证来去流量路径一致


    负载均衡

  • 当有多条路径存在时,可考虑通过适当策略实现流量的负载分担,以充分利用带宽

12.3 控制AS内部路由

非BGP路由和BGP路由之间的交互

  • 一般情况下,非BGP路由可以通过路由引入或者network分发到BGP路由表中,对于分发到BGP中的路由,应采用合理的策略过滤使合适的路由加载到BGP路由表中。


    默认路由的控制

  • 对于默认路由的发放,可以通过策略使默认路由根据某些具体条件来下发默认路由


    策略路由

  • 通过策略路由来优化流量路径

12.4 控制大型AS

BGP按组打包

  • 通过BGP按组打包,能够大大节省路由器性能。


    路由反射器和联盟

  • 通过路由反射器和联盟,减少IBGP会话数量,优化BGP大型网络。

12.5 设计稳定的Internet

减少不稳定路由的产生

  • 使用稳定的IGP路由协议。
  • 提升路由器性能。
  • 减少人为失误。
  • 扩展链路带宽。


    提升BGP稳定性

  • 应用新的BGP策略时,使用BGP软复位。

  • 对于不稳定的路由,对其进行合理的惩罚,以减少对BGP的冲击。