【HCNP路由交换学习指南】学习笔记丨第07章 BGP

BGP 的基本概念

首先回顾**自治系统(Autonomous System,AS)**的传统定义:由一个单一的机构或组织所管理的一系列 IP 网络及其设备所构成的集合。

**自治系统的简单理解:**可以简单地将 AS 理解为一个独立的机构或者企业所管理的网络,例如一家网络运营商的网络等。另一个关于 AS 的例子是,一家全球性的大型企业在其网络的规划上将全球各个区域划分为一个个的 AS,例如中国区是一个 AS,韩国区是另一个 AS。

根据工作范围不同,动态路由协议可分为两类:

  • IGP(Interior Gateway Protocol,内部网关协议)

    例如 RIP、OSPF、IS-IS 等。IGP 协议用于帮助路由器发现到达本 AS 内各个网段的路由,从而实现​ ​AS 内部的数据互通,一个 AS 通常采用一种 IGP 协议,也有许多大型的网络,会在一个 AS 中采用多种 IGP 协议以便支撑该网络多元化的需求。

  • EGP(Exterior Gateway Protocol,外部网关协议)

    例如 BGP 等。在一个由多个 AS 构成的大规模的网络中,还需要 EGP 协议来完成​ ​AS 之间的路由交互。BGP 就是最为熟知和使用得最为广泛的一种 EGP 协议。

**BGP(Border Gateway Protocol,边界网关协议)**几乎是当前唯一被用于在不同 AS 之间实现路由交互的 EGP 协议。BGP 适用于大型的网络环境,例如运营商网络,或者大型企业网等。BGP 支持 VLSM、支持 CIDR(Classless Inter-Domain Routing,无类域间路由),支持自动路由汇总、手工路由汇总。

BGP 使用 TCP(端口号 179)作为传输层协议,两台互为对等体的 BGP 路由器首先会建立 TCP 连接,随后协商各项参数并建立对等体关系,初始情况下,两者会同步双方的 BGP 路由表,在 BGP 路由表同步完成后,路由器不会周期性地发送 BGP 路由更新,而只发送增量更新或在需要时进行触发性更新。

**增量更新/触发性更新 :**BGP 的路由更新,只发送增量更新或在需要时进行触发性更新,这大大地减小了设备的负担及网络带宽损耗,由于 BGP 往往被用于承载大批量的路由信息,如果依然像 IGP 协议那样,周期性地交互路由信息,显然是相当低效和不切实际的。

BGP 定义了多种 **路径属性(Path Attribute)**用于描述路由,就像一个人拥有身高、体重、学历、特长和经历等属性一样,一条 BGP 路由同样携带着多种属性,路径属性将影响 BGP 路由的优选。BGP 还定义了丰富的路由策略工具,这些工具使得 BGP 具有强大的路由操控能力。

BGP 的发展经历了数个版本,目前在 IPv4 环境中,BGPv4(BGP Version 4)被广泛使用,该版本在 RFC4271 中被描述。本章基于 BGPv4 进行讲解。

BGP 对等体关系类型

IGP 协议要求需要建立邻居关系的两台路由器必须是直连的。但 BGP 对等体关系的建立并不要求设备必须直连。BGP 采用 TCP 作为传输层协议,两台路由器只要具备 IP 连通性,并且能够顺利地基于 TCP 179 端口建立连接,就可以建立 BGP 对等体关系。

因此, BGP 的对等体关系是可以跨设备建立的。建立 BGP 邻居关系的路由器互称 BGP 对等体(Peer)

BGP 对等体关系有两种类型:

  1. EBGP 对等体关系(External BGP Peer)

    如果建立对等体关系的两台 BGP 路由器位于不同的 AS,那么它们之间的关系被称为 EBGP 对等体关系。通常情况下,EBGP 对等体关系必须基于直连接口建立,因为缺省情况下,EBGP 对等体之间发送的 BGP 协议报文的 TTL 值为 1。

  2. IBGP 对等体关系(Internal BGP Peer)

    如果建立对等体关系的两台 BGP 路由器位于相同的 AS,那么它们之间的关系被称为 IBGP 对等体关系。在两台路由器之间建立 IBGP 对等体关系时,并不要求它们必须直连。

IBGP 水平分割原则

每条 BGP 路由都携带着多个路径属性,其中一个非常重要的路径属性就是 AS_Path。AS_Path 是每条 BGP 路由都会携带的属性,它描述了一条 BGP 路由在传递过程中所经过的 AS 的号码,AS_Path 的长度会影响路由器对 BGP 路径的优选。此外,AS_Path 还用于防止出现路由环路。如下图所示,R2 从 R4 收到该路由后,会忽略这条路由更新,因为它在收到的路由中看到了自己本地的 AS 号码,便意识到网络中出现了环路。

在这里插入图片描述
AS_Path 属性可以防止 BGP 路由在 EBGP 对等体之间传递时发生环路,然而当路由在 IBGP 对等体之间传递时,AS_Path 属性的值是不会发生改变的。即 BGP 路由在一个 AS 内传递时,是无法依赖 AS_Path 提供的防环能力的,那么此时路由环路就有可能发生。

针对这类问题,BGP 提供了一种解决方案——IBGP 水平分割

下图中,当 R2 收到 R1 通告的 10.1.1.0/24 路由后,它将这条路由通告给自己的 IBGP 对等体 R3 及 R4,R4 会将该路由通告给 IBGP 对等体 R3,而 R3 又会将该路由通告给 R2,这就容易引发路由环路。

在这里插入图片描述
BGP 规定,当路由器从一个 IBGP 对等体学习到某条 BGP 路由时,它将不能再把这条路由通告给任何 IBGP 对等体,这就是 IBGP 水平分割规则。在本例中,R4 从 IBGP 对等体 R2 学习到的路由将不能再通告给 R3,因为 R3 也是它的 IBGP 对等体。同理,R3 从 R2 学习到的 BGP 路由也不能通告给 R4。

IBGP 水平分割也会带来问题。在这个网络中,R4 增加了一个 IBGP 对等体 R5。由于 IBGP 水平分割规则的限制,R4 是无法将学习自 IBGP 对等体 R2 的 10.1.1.0/24 路由再通告给另一个 IBGP 对等体 R5 的,因此这将造成 R5 无法学习到去往 AS 64512 的路由。

在这里插入图片描述

在一个 AS 内部实现 IBGP 对等体全互联 是一种常规的解决方案。

**IBGP 对等体全互连:**在一个 AS 内建立 IBGP 对等体全互联模型在许多场景中是可行的,但如果 AS 内的 BGP 路由器数量特别大时,所有的路由器两两之间建立 IBGP 对等体关系显然可能给网络及设备带来较大的负担,而且也降低了网络的可扩展性。

在这里插入图片描述

路由黑洞问题及 BGP 同步规则

已知同 AS 内两台 BGP 路由器之间无需直连也可建立 IBGP 对等体关系,只要它们具备 IP 连通性并且可以建立 TCP 连接即可。BGP 的这个特点使得路由的传递更加灵活,然而稍有不慎,这个特性也可能带来一个麻烦,例如路由黑洞。

在这里插入图片描述

如图所示:

  1. R1、R2、R3、R7 均为 BGP 路由器且按照图示建立 BGP 对等体关系;
  2. AS 34567 内部部署 OSPF,因此该 AS 内部的路由器知晓到达该 AS 内各个网段的路由信息;
  3. R4、R5、R6 只运行 OSPF,不运行 BGP;
  4. R3 及 R7 之间没有直连的物理链路,但建立起 IBGP 对等关系。

R1 将 1.0.0.0/8 的路由通过 BGP 通告给 R3,然后 R3 通告给 R7,再由 R7 通告给 R2,最终 R2 能获知去往 1.0.0.0/8 网段的路由信息。当 R2 将去往该目的网段的数据包发送给 R7 后,R7 会通过路由表寻找到下一跳为 R4 或 R6,并将数据包转发。但 R4 及 R6 只有本区域内路由,没有去往 1.0.0.0/8 的路由,因此发往这个目的网段的数据包在 R4 这里被丢弃——即存在路由黑洞问题。

为了规避路由黑洞问题,引入了 BGP 同步规则(BGP Synchronization)

**华为设备默认不启用 BGP 同步规则:**事实上,解决 BGP 路由黑洞问题的方案很多且都很成熟,例如建立 IBGP 全互连或采用 MPLS。同步规则也仅仅只是较为平常的一种方法,因此在华为设备上默认是关闭的。

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

在本例中,就是要 R3 将 BGP 路由引入 AS 34567 中的 OSPF,从而让 OSPF 也能够获知到达 1.0.0.0/8 的路由。但是,在 R3 上将 BGP 路由引入 OSPF 的操作需要非常谨慎地执行,因为 BGP 承载的路由信息往往是巨大的,如果不做任何限制地直接将 BGP 路由引入一个 IGP 协议,带来的影响会很大。因此,这种办法并非在所有场景中都适用。

路由通告

路由在对等体之间交互时,主要存在以下几个原则:

  • 当一台路由器发现了多条可到达同一个目的网段的 BGP 路由时,该路由器会通过一个路由选择进程在这些路由中选择一条最优(Best)的路由。通常情况下,路由器只将最优的路由加载到路由表中使用(激活了负载分担功能的情况除外),而且只会将最优的路由通告给 BGP 对等体。
  • 当一台路由器从自己的 EBGP 对等体学习到 BGP 路由时,缺省时它会将这些路由通告给所有 IBGP 对等体及所有 EBGP 对等体。
  • 当一台路由器从自己的 IBGP 对等体学习到 BGP 路由时,它不会将这些路由通告给其他 IBGP 对等体( IBGP 水平分割规则)。
  • 当一台路由器从自己的 IBGP 对等体学习到 BGP 路由时,如果 BGP 同步被激活,则路由器只有从 IGP 协议也学习到相应的路由时,才会将这些 BGP 路由通告给 EBGP 对等体;如果 BGP 同步被关闭,则即使没有从 IGP 协议学习到相应的路由,它也会将这些 BGP 路由通告给 EBGP 对等体。

以上讨论的所有情况,前提均是 BGP 路由的 Next-hop 属性所填充的下一跳地址可达。

Router-ID

BGP Router-ID 是网络设备的 BGP 协议标识符,长度为 32bit,与 IPv4 地址的格式相同。

在规划 BGP 网络时,需确保设备的 Router-ID 的 唯一性。BGP 的 Router-ID 可以通过两种方式获取,其一是让 BGP 自动选取,另一个方式则是通过手工配置的方式为设备指定(从网络可靠性的角度考虑,在实际部署时,建议采用手工配置的方式指定设备的 Router-ID)。

报文类型及格式

所有的 BGP 报文都有一个相同格式的头部,这个头部一共 19byte,如图所示:

在这里插入图片描述

  • 标记(Marker)

    该字段被保留用于协议兼容性,没有其他特别的含义。

  • 长度(Length)

    指示该 BGP 报文的长度(字节数)。

  • 类型(Type)

    指示了该 BGP 报文的类型,常见的 BGP 报文类型与类型字段值的对应关系如下:1.Open 报文,2.Update 报文,3.Notification 报文,4.Keepalive 报文。

Open 报文

两台 BGP 路由器一旦 TCP 连接被正确建立,双方便开始交换 Open 报文。

Open 报文中包含设备所处的 AS 号、BGP 版本号、Router-ID 以及一些可选参数等信息(例如用于描述 BGP 所支持的一些协议特性的参数等),如果路由器认可对方发送过来的 Open 报文,则立即回送一个 Keepalive 报文以作确认。

如图所示,为 Open 报文的格式,其中各个字段的描述如下:

在这里插入图片描述

  • 版本(Version)

    BGP 协议的版本,本章介绍的是 BGPv4,因此该字段的值为 4。

  • AS 号(AS Number)

    该 BGP 报文发送方所处 AS 的号码。

  • 保活时间(Hold Time)

    在多长时间(以秒为单位)内必须收到对方的 Keepalive 报文或 Update 报文,否则将该对等体视为无效。在两台 BGP 路由器建立对等体关系的过程中,保活时间需要双方进行协商,双方配置的值可以不同,但是最终双方均只认可值更小的保活时间。

  • 路由器标识符(Router-ID)

    32bit 的 BGP 路由器标识符。

  • 可选参数长度(Optional Parameters Length)

    指示了 BGP 报文中,可选参数字段的长度(字节数)。

  • 可选参数(Optional Parameters)

    Open 报文里可以包含多个可选参数,每个可选参数使用类型(Type)、长度(Length)及值(Value)的三元组格式描述。在 Open 报文中,可选参数主要被用于宣告及协商 BGP 对等体的某些能力特性。

Update 报文

BGP 路由器使用 Update 报文向其对等体通告路由信息。

BGP 在一个 Update 报文中通告一条或多条 拥有相同路径属性 的路由,拥有不同的路径属性的 BGP 路由需使用不同的 Update 报文来通告。

Update 报文除了能够用于向对等体通告 BGP 路由,还能够用于撤销一条或多条 BGP 路由。

下图展示了 Update 报文的格式,其中各个字段的描述如下:

在这里插入图片描述

  • 撤销路由的长度(Withdrawn Routes Length)

    Update 报文中可以包含 0 条、1 条或者多条准备撤销的 BGP 路由。该字段是一个无符号整数,它指示了 Update 报文中所包含的“撤销的路由条目”字段的长度(字节数)。

  • 撤销的路由条目(Withdrawn Routes)

    这个字段用于存放需要被撤销的 BGP 路由前缀

    如果有多条 BGP 路由需要使用这个 Update 报文来撤销,那么这个字段将包含一个 BGP 路由前缀的列表,每条 BGP 路由前缀包含两元,分别是前缀长度及路由前缀。

  • 总路径属性长度(Total Path Attribute Length)

    这个字段指示了 Update 报文中路径属性的总长度。

  • 路径属性(Path Attributes)

    当 BGP 路由器使用 Update 报文向邻居通告 BGP 路由时,该报文中就包含着路径属性字段。BGP 定义了丰富的路径属性类型。

  • 网络层可达信息(Network Layer Reachability Information)

    这个字段用于存放需要被被通告的 BGP 路由前缀,如果有多条 BGP 路由需要使用这个 Update 报文来通告,那么这个字段将包含一个 BGP 路由前缀的列表,每条 BGP 路由前缀包含两元,分别是前缀长度及路由前缀,当然,一个 Update 报文用于通告拥有相同路径属性的路由前缀。

Keepalive 报文

BGP 是基于 TCP 工作的,它可以依赖 TCP 实现协议的可靠性,但是它并不依赖 TCP 的保活机制,而是使用周期性发送的 Keepalive 报文来了解对等体的存活情况。

BGP 路由器会为对等体维护一个 保活计时器(Hold Timer),如果保活计时器超时,则 BGP 对等体被视为不可达,此时 BGP 对等体关系需要重新建立。对等体之间周期性交互的 Keepalive 报文可以刷新保活计时器,防止该计时器超时。

BGP 路由器周期性发送 Keeaplive 报文的时间间隔缺省为 1/3 的保活计时器时间,在华为的数通产品上,保活计时器的时间缺省为 180s,因此缺省时,Keepalive 报文的周期性发送间隔为 60s。

在 BGP 对等体关系的建立过程中,Keepalive 报文还用于确认对方发送过来的 Open 报文。

Notification 报文

当 BGP 检测到一个错误时,它可以使用 Notification 报文来告知对等体。

下图展示了 Notification 报文的格式

在这里插入图片描述

  • 错误代码(Error Code)

    该字段的值是一个无符号整数,指示了错误的类型。

  • 错误子代码(Error Subcode)

    在错误代码的基础上进一步指示错误的类型。

  • 数据(Data)

    这个字段用于描述错误的原因。

查看 BGP 对等体

两台 BGP 路由器需要首先建立对等体关系,然后才能够正常交互 BGP 路由。但 BGP 路由器无法自动发现其他对等体,需要网络管理员通过命令手工指定 。当两台需建立对等体关系的 BGP 路由器完成配置后,双方需首先建立 TCP 连接,TCP 连接建立完成后双方开始交换 Open 报文,如果一方认可对方发送过来的 Open 报文,则使用 Keepalive 报文进行回应。

如果路由器收到了 BGP 对等体发来的、用于确认自己先前发送的 Open 报文的 Keepalive 报文,这意味着对方已经认可了自己所发的 Open 报文中的相关参数,则该路由器认为已经与对方完成了 BGP 对等体关系建立,此时双方便可以开始交互 Update 报文,而 Update 报文中便包含路由器所通告的路由信息。

在路由器上,使用 display bgp peer 命令可以看到该设备所指定的 BGP 对等体,以及当前所处的状态。

在这里插入图片描述

BGP 路由表

当运行 BGP 后,设备会维护 BGP 路由表(BGP Routing Table),在该数据表中,存储着设备发现的所有 BGP 路由。当设备从其他对等体接收 BGP 路由后,它可以针对这些路由施加入方向(import)的路由策略(例如路由过滤,或者修改路由的路径属性等),这些路由策略执行完后,被处理过的路由才会被加载到其 BGP 路由表中。

当设备发现了多条到达相同目的网段的 BGP 路由时,它会将这些路由都加载到自己的 BGP 路由表中,当然,无论到达同一个目的网段存在多少条路由,最终都将只有一条最优的路由会被选择,只有该条路由才具备被加载到设备全局路由表的资格(在没有配置 BGP 路由负载分担的情况下)。

BGP 定义了一套详细的规则,用于进行最优路由的决策。使用 display bgp routing-table 命令可以查看设备的 BGP 路由表,例如:

在这里插入图片描述

  • 表中的 * 表示路由有效,所谓有效指的是在全局路由表中可以找到下一跳地址对应的路由
  • 表中的 > 表示路由最优,例如到达 172.16.1.0/24 有两条路由,其中选出了最优的一条
  • 表中的 i 表示从 IBGP 学习到的路由

路由表中后几列为路由属性,在命令的后面添加路由前缀可以继续观察一条路由的详细信息,例如 :

在这里插入图片描述

将路由发布到 BGP

与 IGP 协议不同,BGP 并不自动发现路由,而是需要网络管理员通过以下方法将路由发布到 BGP。

network

与 OSPF 不同,在 BGP 配置视图中执行的 network 命令并不用于在指定网段(接口)上激活 BGP(BGP 的对等体是需要显式地通过 peer 命令指定),而仅用于将指定网段的路由发布到 BGP 发布。

在设备的 BGP 配置视图中,使用 network 命令会将其路由表中的直连路由、静态路由或通过 IGP 协议学习到的路由发布到 BGP。要注意,使用 network 命令发布的路由必须在设备的路由表中存在。这意味着在发布路由之前,必须配置好设备上的接口和路由信息。

import-route

BGP 中的 import-route 命令与 IGP 协议中的该命令功能相同,Import-route 命令可以将设备路由表中的直连路由、静态路由或通过 IGP 协议学习到的动态路由引入 BGP。

BGP 中的 network 与 import-route 命令有以下不同:

  1. 如果要将一个路由器的 OSPF 路由发布到 BGP,使用 network 需要针对每一条路由都使用一次该命令,效率较为低下,如果要批量发布路由,使用 import-route 就可以高效很多。
  2. Origin 属性是所有 BGP 路由必须携带的,该属性用于描述一条路由是如何被发布到 BGP 的(路由的来源),以上两个命令将路由发布到 BGP 时,路由的 Origin 属性不同(分别为 IGP,Incomplete)。

aggregate

与众多动态路由协议一样,BGP 同样支持路由的手工汇总,在 BGP 配置视图中,使用 aggregate 命令,可执行 BGP 路由手工汇总。该命令生效的前提是,设备已经通过 BGP 学习到了明细路由,之后再使用该命令,则可使设备向 BGP 发布指定的汇总路由。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值