HCIE课程笔记11-BGP基本原理

    BGP是Border Gateway Protocol的简称

    BGP是一种增强的路径矢量路由协议,同时BGP是拥有丰富的策略控制技术的外部网关协议。

    BGP多运行于AS与AS之间

 

一 BGP概述

(1)BGP是一种外部网关协议(EGP),与OSPF、RIP等内部网关协议(IGP)不同,其着眼点不在于自动发现网络拓扑,而在于在AS之间选择最佳路由和控制路由的传播。

(2) BGP使用TCP作为其传输层协议(监听端口号为179),提高了协议的可靠性,且不需要专门的机制来确保连接的可控性。

(3)BGP进行域间的路由选择,对协议的稳定性要求非常高。因此用TCP协议的高可靠性来保证BGP协议的稳定性。

(4)BGP的对等体之间必须在逻辑上连通,并进行TCP连接。

(5)路由更新时,BGP只发送更新的路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息。

(6)BGP从设计上避免了环路的发生。AS之间:BGP通过携带AS路径信息来标记途经的AS,带有本地AS号的路由将被丢弃,从而避免了域间产生环路。AS内部:BGP在AS内学到的路由不再通告给AS内的BGP邻居,避免了AS内产生环路。

(7)BGP提供了丰富的路由策略,能够对路由实现灵活的过滤和选择。

(8) BGP提供了防止路由振荡的机制,有效提高了Internet网络的稳定性。

(9) BGP易于扩展,能够适应网络新的发展。主要是通过TLV进行扩展。

 

二 BGP基本概念

1 自治系统

AS(autonomous system)是指在一个实体管辖下的拥有相同选路策略的IP网络。

(1)自治系统的典型定义是指由同一个技术管理机构管理,使用统一选路策略的一些路由器的集合。

(2) 每个自治系统都有唯一的自治系统编号,这个编号是由IANA分配的。

(3)自治系统的编号范围是从1到65535,其中1到64511是注册的因特网编号,64512到65535是私有网络编号。

(4)BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。AS号分为2字节AS号和4字节AS号,其中2字节AS号的范围为1 至65535,4字节AS号的范围为1至4294967295。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。

2 EBGP和IBGP

 

 

 

 IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,从IBGP对等体学到的路由不能转发给其他IBGP对等体;所以IBGP对等体相互之间需要建立全连接。

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

3 BGP报文交互中的角色

 Speaker:发送BGP消息的路由器称为BGP发言者,它接收或产生新的路由信息,并发布给其它BGP Speaker。

 Peer:相互交换消息的BGP Speaker之间互称对等体(Peer),若干相关的对等体可以构成对等体组(Peer Group)。

 

4 BGP报文

    BGP的运行是通过消息驱动的,共有Open、Update、Notification、Keepalive和Route-Refresh等5种消息类型。

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

 Update消息:用于在对等体之间交换路由信息。一条Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。

 Keepalive消息:BGP会周期性的向对等体发出Keepalive消息,用来保持连接的有效性。

 Notification消息:当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。

 Route-Refresh消息:通过OPEN消息告知BGP peer本地支持路由刷新能力(Route-Refresh capability)。在所有BGP路由器使能Route-Refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发布Route-Refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。

 

BGP报文应用:

 BGP使用TCP建立连接,本地监听端口为179。和TCP连接建立相同,BGP连接的建立也要经过一系列的对话和握手。TCP通过握手协商通告其端口等参数,BGP的握手协商的参数有:

BGP版本、BGP连接保持时间、本地的路由器标识(RouterID)、授权信息等。这些信息都在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报文。

BGP报头

 Marker(标记):16字节,固定为1。

 Length(长度):两字节无符号整数。指定了消息的全长,包括头部。

 Type(类型):1 字节,指示报文类型:

• Open

• Update

• Keepalive

• Notification

• Route-Refresh

 

Open报文结构

 Version:BGP的版本号。对于BGPv4来说,其值为4。

 My Autonomous System:本地AS编号。通过比较两端的AS编号可以确定是EBGP连接还是IBGP连接。

 Hold Time:在建立对等体关系时两端要协商Hold time,并保持一致。如果两端所配置的Hold time时间不同,则BGP会选择较小的值作为协商的结果。如果在这个时间内未收到对端发来的Keepalive消息,则认为BGP连接中断。如果保持时间为0,则标识不发送Keepalive报文。

 BGP Identifier:BGP路由器的Router ID,以IP地址的形式表示,用来识别BGP路由器。

 Opt Parm Len(Optional Parameters Length):可选参数的长度。如果为0则没有可选参数。

 Optional Parameters:是一个可选参数用于BGP验证或多协议扩展(Multiprotocol Extensions)等功能。每一个参数为一个(Parameter Type-Parameter Length-Parameter

Value)三元组 。

 

Update报文结构

 Withdrawn Routes Length :(2字节无符号整数) 不可达路由长度,表示Withdrawn Routes字段的数据长度。如果Withdrawn Routes Length字段数值为0,则表示Withdrawn

Routes字段没有任何数据,在UPDATE消息中不会被显示。

 Withdrawn Routes :(变长) 撤销路由。该字段包括一系列的IP地址前缀信息,以<length, prefix>的格式来表示,比如<19,198.18.160.0>表示一个198.18.160.0 255.255.224.0的

网络。

 Path Attribute Length :(2字节无符号整数) 路由属性长度,表示Path Attribute字段的数据长度。如果Path Attribute Length数值为0,则表示Path Attribute字段没有任何数据,在UPDATE消息中不会被显示。

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

 

Keepalive报文结构

 KeepAlive 报文的组成只包括一个BGP数据报头。缺省情况下,发送KeepAlive 的时间间隔为 60 秒,Hold Time是180秒。每次从邻居处接收到KeepAlive 报文将重置Hold Time定时器,如果Hold Time定时器超时,就认为对等体Down掉。

 

Notification报文结构

 Errorcode:错误码。1字节长的字段。每个不同的错误都使用唯一的代码表示,而每一个错误码都可以拥有一个或多个错误子码,但如果某些错误码并不存在错误子码的话,则该错误子码字段以全0表示。

 Errsubcode:错误子码。

 

5 BGP状态机

 

 

 

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连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态;

• 如果TCP连接失败,那么BGP转至Active状态;

• 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。

• 如果发生其他事件(由系统或者操作人员启动的),则退回到Idle状态。

 

 在Active状态下,BGP总是在试图建立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状态。

 

 在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到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状态。

 

6 对等体之间的交互原则

 

 

BGP对等体交互原则:

(1)从IBGP对等体获得的路由,只发布给EBGP对等体

(2)从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体

(3)只讲BGP的最优路由发布给对等体

(4)只发送更新的BGP路由

 

 

 

7 数据库

IP路由表(IP-RIB):全局路由信息库,包括所有IP路由信息;

BGP路由表(Loc-RIB):BGP路由信息库,包括本地BGP Speaser选择的路由信息;

邻居表:对等体邻居清单列表;

Adj-RIB-In:对等体宣告给本地BGP Speaker的未处理的路由信息库;

Adj-RIB-Out:本地BGP Speaker宣告给指定对等体的路由信息库;

 

8 BGP路由信息处理

 

 

 

BGP路由信息处理:

 (1)当从对等体接收到更新数据包时,路由器会把这些更新数据包存储到路由选择信息库(Routing Information Base, RIB)中,并指明是来自哪个对等体的(Adj-RIB-In)。这些更新数据包被输入策略引擎过滤后,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径。

 (2)得出的最佳路径被存储到本地BGP RIB (Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB),以用作安装考虑。

 (3)除了从对等体接收来的最佳路径外,Loc-RIB也会包含当前路由器注入的(被称为本地发起的路由),并被选择为最佳路径的BGP前缀。Loc-RIB中的内容在被通告给其他对等体之前,必须通过输出策略引擎。只有那些成功通过输出策略引擎的路由,才会被安装到输出RIB (Adj-RIB-Out)中。

 

9 BGP与IGP交互

 

BGP同步:
在IBGP路由加入路由表并发布给EBGP对等体之前,会先检查IGP路由表。只有在IGP也知道这条IBGP路由时,它才会被加入到路由表,并发布给EBGP对等体。

 

同步是指IBGP和IGP之间的同步,其目的是避免误导外部AS的路由器。

 

二 BGP路由属性特点

BGP路由属性是一套参数,它是对路由的进一步的描述的进一步的描述

(1)公认必遵:所有BGP路由器必须识别,且必须存在于Update消息中;如果缺少这种属性,路由信息就会出错;

(2)公认任意:所有BGP路由器必须可以识别,但不要求必须存在于Update消息中;缺少这类属性不会导致路由信息出错;

(3)可选过渡:在BGP对等体之间具有可传递性的属性;BGP路由器可以不支持此属性,但它仍然会接受这类属性,并传递给其他对等体;

(4)可选非过渡:如果BGP路由器不支持此属性,则相应的这类属性会被忽略,且不会传递给其他对等体;

 

常用的属性类别如下所示:

 Origin为公认必遵属性

 AS_Path为公认必遵属性

 Next_Hop为公认必遵属性

 Local_Pref为公认任意属性

 community为可选过渡属性

 MED为可选非过渡属性

 Originator_ID为可选非过渡属性

 Cluster_List为可选非过渡属性

 

 

Origin

 

Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:

(1) IGP:具有最高的优先级。通过路由始发AS的IGP得到的路由信息,比如通过network命令注入到BGP路由表的路由,其Origin属性为IGP。标识符为”i”;

(2) EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。标识符为“e”;

(3) Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。标识符为“?”;

 

 

AS_Path

AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。当BGP路由器从EBGP对等体接收路由时,如果发现AS_Path列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。

 

   当BGP Speaker本地通告一条路由时:

  (1)当BGP Speaker将这条路由通告到其他AS时,便会将本地AS号添加在AS_Path列表中,并通过Update消息通告给邻居路由器。

  (2)当BGP Speaker将这条路由通告到本地AS时,便会在Update消息中创建一个空的AS_Path列表。

 

   当BGP Speaker传播从其他BGP Speaker的Update消息中学习到的路由时:

  (1)当BGP Speaker将这条路由通告到其他AS时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP路由器根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。

  (2)当BGP Speaker将这条路由通告到本地AS时,不会改变这条路由相关的AS_Path属性.

拓扑描述:

 当R4将网段10.0.0.0/24通告给AS400和AS100时,会在AS_PATH中添加自己的AS号。当R5将网段10.0.0.0/24通告给AS100时,也会添加添加自己的AS号。当AS100内的R1、R3和R2之间将网段10.0.0.0/24相互通告时,AS_PATH属性不会改变,在其他BGP选路条件相同的前提下,BGP会选择AS_PATH路径最短的,即选择通过R3直达R4的路由。

 

Next_Hop

 

 

      Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:

(1)BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。

(2)BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。

(3)BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。

 

 

Local_Pref

Local_Pref属性

 (1)该属性仅在IBGP对等体之间有效,不通告给其他AS。它表明路由器的BGP优先级。

 (2)该属性用于判断流量离开AS时的最佳路由。当BGP路由器通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。

 

 

 

MED

    MED属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED 值较小者作为最佳路由。

    MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。

 

 

 

团体属性

   团体属性是一组有相同特征的目的地址的集合。团体属性用一组以4字节为单位的列表来表示,设备中团体属性的格式是aa:nn或团体号。

   团体属性属于可选过度属性,团体属性分为自定义团体属性和公共团体属性。

   公共团体属性有如下四类:

(1)Internet:缺省情况下,所有的路由都属于Internet团体。具有此属性的路由可以被通告给所有的BGP对等体。

(2) No_Advertise:具有此属性的路由在收到后,不能被通告给任何其他的BGP对等体。

(3)No_Export:具有此属性的路由在收到后,不能被发布到本地AS之外。如果使用了联盟,则不能被发布到联盟之外,但可以发布给联盟中的其他子AS。

(4)No_Export_Subconfed:具有此属性的路由在收到后,不能被发布到本地AS之外,也不能发布到联盟中的其他子AS。

  

 

四 BGP选路原则

当到达同一目的地存在多条路由时,BGP依照如下策略顺序进行路由选择:

  1. 如果此路由的下一跳不可达,忽略此路由;
  2. 优选协议首选值(PrefVal)最高的路由;华为设备的特有属性,仅在本地有效;
  3. 优选本地优先级(Local_Pref)最高的路由;缺省本地优先级100,可以通过执行default local-preference命令可以修改BGP路由的缺省本地优先级;
  4. 优选本地生成的路由;包括通过network命令或import-route命令引入的路由、手动聚合路由和自动聚合路由。优选聚合路由(聚合路由优先级高于非聚合路由);通过aggregate命令生成的手动聚合路由的优先级高于summary automatic命令生成的自动聚合路由;通过network命令引入的路由优先级高于通过import-route命令引入的路由;
  5. 优选AS路径(AS_Path)最短的路由;AS_Path的长度不包括AS_CONFED_SEQUENCE和AS_CONFED_SET;AS_SET的长度为1,无论AS_SET中包括多少AS号;执行bestroute as-path-ignore命令后,BGP选路时,忽略AS_Path的比较。
  6. 比较Origin属性,依次优选Origin类型为IGP、EGP、Incomplete;
  7. 优选MED值最低的路由;BGP只比较来自同一个AS(不包括联盟的子AS)的路由的MED值;缺省值为0;执行bestroute med-none-as-maximum命令后,BGP选路时将该路由的MED值安最大值来处理;
  8. 优选从EBGP邻居学来的路由(EBGP路由优先级高于IBGP的路由);
  9. 优选到下一跳IGP Metric较小的路由;
  10. 优选Cluster_List最短的路由;
  11. 优选Router ID最小的路由器发布的路由;
  12. 比较对等体的IP Address,优选从具有较小IP Adddress的对等体学来的路由

 

负载分担:当到达同一目的地址存在多条等价路由时,可以通过BGP等价负载分担实现均衡流量的目的;形成BGP等价负载分担的条件是:BGP选路规则中“到下一跳的IGP metric”这条规则之前所有需要比较的属性完全相同。

 

五 BGP扩展特性

安全特性

BGP安全特性:

 (1)MD5:BGP使用TCP作为传输层协议,为提高BGP的安全性,可以在建立TCP连接时进行MD5认证。但BGP的MD5认证并不能对BGP报文认证,它只是为TCP连接设置MD5认证密码,由TCP完成认证。如果认证失败,则不建立TCP连接。  

   (2)限制从对等体接收的路由数量,防止资源耗尽性攻击。

   (3)AS_Path长度保护。通过在入口和出口两个方向对AS_Path的长度进行限定,直接丢弃AS_Path超限的报文。

 

 

路由衰减

    路由衰减(Route Dampening)用来解决路由不稳定的问题。多数情况下,BGP协议都应用于复杂的网络环境中,路由变化十分频繁。为了防止持续的路由振荡带来的不利影响,BGP使用路由衰减来抑制不稳定的路由。

    BGP衰减使用惩罚值(Penalty Value)来衡量一条路由的稳定性,惩罚值越高则说明路由越不稳定。路由每发生一次振荡(路由从激活状态变为未激活状态,称为一次路由振荡),BGP便会给此路由增加一定的惩罚值(1000)。当惩罚值超过抑制阈值(Suppress Value)时,此路由被抑制,不加入到路由表中,也不再向其他BGP对等体发布更新报文。被抑制的路由每经过一段时间,惩罚值便会减少一半,这个时间称为半衰期(Half-life)。当惩罚值降到再使用阈值(Reuse Value)时,此路由变为可用并被加入到路由表中,同时向其他BGP对等体发布更新报文。上文提到的惩罚值、抑制阈值和半衰期都可以手动配置。路由衰减只适用于EBGP路由。对于从IBGP收来的路由不能进行衰减,因为IBGP路由经常含有本AS的路由,内部网络路由要求转发表尽可能一致,IGP快速收敛就是为了达到信息同步,转发一致。如果衰减对IBGP路由起作用,不同设备的衰减参数不一致时,会导致转发表不一致。