1. Border Gateway Protocol(边界网关协议)特征


  • 提供无环的路由信息交换「基于 IP 协议栈的 6 号协议,179 端口」
  • BGP 是一个增强的距离矢量协议,扩展性强(因为是 TLV 类型所以支持多协议)
    • 可靠的路由更新机制
    • 丰富的 Metric 度量方式
    • 从设计上避免了环路的发生
  • IGP着重于发现和计算路由,而 BGP 着重于控制路由的传播和选择最优的路由
  • BGP 工作在 AS 之间或 AS 内部
    • AS(Autonomous System):由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合
      • 私有 AS 号:64512-65535
  • BGP 分为 iBGP 和 eBGP
    • iBGP(内部网关协议 internal Border Gateway Protocol):自身的 AS 号码与远端的 AS 号码相同
    • eBGP(外部网关协议 External Border Gateway Protocol):自身的 AS 号码与远端的 AS 号码不同
  • 传输路由的邻居关系建立在应用层,采用「TCP」进行传输路由协议和单播建立邻居关系
    • 在 BGP 中 IGP 存在意义:利用 IGP 实现 TCP 可达,是 iBGP 的底层协议
    • 在 BGP 中 iBGP 存在的意义:iBPG 用于承载 eBGP
  • 周期发送 Keepalive 消息来检测 TCP 的连接[维护BGP]
  • BGP Hello time 和 Hold Time 不一致不会影响邻居的建立
  • 拥有自己的 BGP 表项,当 BGP 表项中优选后才会加入到全局路由表
  • 不需要周期更新路由,路由采用增量更新和触发更新机制
  • 有丰富的属性信息,用来进行路由选路和基于策略进行路由控制
  • BGP 有很多防环原则(EBGP、EBGP、RR、Confederation、MPLS 等下的防环原则)
  • 当目标路由和下一跳地址相同时,该路由在 BGP 中就无效(如果华为设备想通告自身 BGP 更新源地址需要在 eBGP 设备宣告)
  • 支持 VLSM(可变长子网掩码)和 CIDR(无类域间路由)
  • 支持 MD5 认证
  • 适用的应用场景
    • 适合大中型网络
    • 适用于有多个 ISP 出口,根据目的网络来选择合适的 ISP 下一条
    • 一般用来需要为路由进行流量控制策略和选路
  • 不适用的应用场景
    • 只有单个 ISP 出口或单个其他 AS
    • 设备性能不够
    • 没有维护、操控(理解)BGP 的能力,无法预计启动 BGP 后的结果

      2. BGP Message


运行 BGP 的路由器称为 BGP Speake,BGP Speake 之间交互 5 种报文

1)Message Type

Open、Keepalive 和 Notification 报文用来建立和维护邻居关系;Update 和 Route-refresh 用来传递和更新路由信息

  • Open:负责和 Peer 建立邻居关系
  • Update:用来在 Peer 之间传递路由信息
  • Notification:检测到 BGP Speaker 错误时发送的报文消息
  • Keepalive:与 Peer 之间周期发送,用来为维护 TCP 连接
  • Route-refresh:用来通知 Peer 自己支持路由刷新能力

    2)BGP Message Header

    BGP 报文头部最短 19Byte,最长 4096Byte

image.png
BGP Message Header 格式解析

  • Marker:标记,用于检查 BGP Peer 的同步信息完整性和验证计算,如果没有验证为全 F
  • Length:BGP 报文的总长度,包括报文头部
  • Type:类型表示 BGP 报文后所接的报文类型

    • Type=1:Open
    • Type=2:Update
    • Type=3:Notification
    • Type=4:Keepalive
    • Type=5:Refresh

      3)Open Message

      用于建立 BGP 连接

  • Hold Time 用于协商 BGP Peer 间保持建立连接关系[发送 Keepalive 或 Update 等报文的时间间隔]。BGP 在收到 Peer 的 Open 报文后,对收到和发出的 Open 报文中 Hold Time 时间作比较,如果不一致,选择较小的时间作为协商结果

  • Hold Time 的值可以 = 0 或 ≥ 3s。值 = 0 时,可以建立邻居关系,但不会周期发送 Keepalive 报文,但在刚建立邻居时会发送一个
  • 默认的 Keepalive 每 60s 周期发送,Hold Time 时间为 180s[Keepalive 的 3 倍关系]
  • 只有在能力协商中使能了支持路由刷新功能(Route Refresh Capability),路由器才能处理 Refresh 报文。缺省支持 IPv4 单播能力与路由刷新能力

    ① Open Message

    image.png
    Open Message 格式解析

  • Version:版本,v4 或 v4+

  • My Autonomous System:发送者的 AS 号,用来确定是建立 iBGP 还是 eBGP
  • Hold Time:发送者的死亡时间,默认是 180s,可以设置为 0
  • BGP Identifier:发送者的 Router ID,选取规则与 OSPF 一致
  • Opt Parm Len:可选能力参数长度,值为 0,表示没有可选能力参数
  • Optional Parameters:可选能力参数,每个能力阐述都是 TLV 结构
    • AFI:地址簇标识,和 SAFI 配合确定网络层协议和 IP 地址间的关系
    • SAFI:子地址簇标识,和 AFI 配合确定网络层协议和 IP 地址间的关系

      ② AFI 和 SAFI 编码

      | AFI 编码 | AFI 说明 | SAFI 编码 | SAFI 说明 | BGP 能力支持说明 | | —- | —- | —- | —- | —- | | 1 | IPv4 地址簇 | 1 | 单播 | IPv4 单播 | | | | 2 | 组播 | IPv4 组播 | | | | 128 | VPN | IPv4 L3VPN | | 2 | IPv6 地址簇 | 1 | 单播 | IPv6 单播 | | | | 2 | 组播 | IPv6 组播 | | | | 128 | VPN | IPv6 L3VPN | | 196 | 二层 | 128 | VPN | L2VPN Kompella 方式 |

4)Update Message

Update Message 既有更新也有撤销,可以包含在一个报文中

  • 一条 Update 报文可以发布多条具有相同路由信息的路由更新,也可以只用于路由撤销
  • Total Path Attribute(完全路径属性)包含了 Path Attributes(路径属性)和 Network Layer Reachability Information(网络可达信息 NLRI)

    ① Update Message

    image.png
    Update Message 格式解析g

  • Unfeasible Routers Length:路由撤销的长度。值为 0 时,表示没有撤销的路由

  • Withdrawn Routers:路由撤销列表,包含路由撤销的前缀信息和掩码
  • Total Path Attribute Lengh:路由更新的路由长度和路由属性。值为 0 时,表示没有需要更新的路由
  • Path Attributes:路径属性,需要更新的路径属性,一条 Update 报文可以发布多条具有相同路由信息的路由更新
  • Network Layer Reachability Information(NLRI):路由更新的地址列表,包含路由更新的掩码和前缀信息

    ② 路径属性

    按其类型号从小到大的顺序排序,填写更新的路由的所有属性,每一个属性单元起码包括属性类型、属性长度、属性值三部分,采用 TLV 格式

属性类型 属性值
1:Origin IGP
EGP
Incomplete
2:As_path AS_Set
AS_Sequence
AS_Confed_Set
AS_Confed_Sequence
3:Next_hop 下一跳的 IP 地址
4:Multi_Exit_Disc(MED) 用于判断流量进入 AS 时的最佳路径
5:Local_Pref 用于判断流量离开 AS 时的最佳路径
6:Atomic_Aggregate BGP Speaker 选择聚合后的路由,而非具体的路由
7:Aggregator 发起聚合的路由器 ID 和 AS 号
8:Community 团体属性
9:Originator_ID 反射器发起者的 Router ID
10:Cluster_List 发射路由经过的反射器列表
14:MP_Reach_NLRI 多协议可达 NLRI
15:MP_Unreach_NLRI 多协议不可达 NLRI
16:Extended Communtities 扩展团体属性

5)Notification Message

用于处理 BGP 进程中的各种错误

① Notification Message

image.png
Notification Message 格式解析

  • Error Code:错误的类型
  • Error Subcode:错误的细节编号
  • Data:错误的数据内容

    ② 错误码和错误子码

    | 错误码 | 错误子码 | | —- | —- | | 1:消息头错误(Message header error) | 1:连接未同步(connection not synchronized) | | | 2:错误的消息长度(error message length) | | | 3:错误的消息类型(error message type) | | 2:Open 消息错误(Open message error) | 1:不支持的版本号(unsupported version number) | | | 2:错误的对等 AS(error peer AS) | | | 3:错误的BGP标识符(error BGP identifier) | | | 4:不支持的可选参数(unsupported optional parameter) | | | 5:认证失败(authentication failed) | | | 6:不可接受的保持时间(unacceptable Holdtime) | | | 7:不支持的能力(unsupported capability) | | 3:Update 消息错误(Update message error) | 1:畸形属性列表(malformed attribute list) | | | 2:不可识别的公认属性(unrecognized well-known attribute) | | | 3:缺少公认属性(well-known attribute is missing) | | | 4:属性标志错误(attribute flags error) | | | 5:属性长度错误(attribute length error) | | | 6:无效 Origin 属性(invalid origin attribute) | | | 7:AS 路由环路(AS routing loop) | | | 8:无效 Next_Hop 属性(invalid Next-Hop attribute) | | | 9:可选属性错误(error optional attribute) | | | 10:无效网络字段(invalid network field) | | | 11:畸形 AS_Path(abnormal AS-Path) | | 4:Hold Timer 溢出(Hold timer expired) | 0:没有特别的错误子码定义(no special definition of the error subcode) | | 5:有限状态机错误(Finite state machine error) | 0:没有特别的错误子码定义(no special definition of the error subcode) | | 6:终止(Cease) | 1:前缀超过最大值(maximum number of prefixes reached) | | | 2:管理关闭(administrative shutdown) | | | 3:删除邻居(peer de-configured) | | | 4:管理重置(administrative reset) | | | 5:连接失败(connection rejected) | | | 6:其他配置改变(other configuration change) | | | 7:连接冲突(connection collision resolution) | | | 8:资源短缺(out of resources) | | | 9:BFD 断开连接(BFD session Down) |

6)Keepalive Message

Keepalive 报文用于维护 BGP 的 TCP 连接

  • 默认的 Keepalive 每 60s 周期发送
  • Keepalive 报文只有 BGP 报文头,没有具体内容,故其报文长度应固定为 19 个字节

image.png

7)Route-Refresh Message

报文用于动态的请求 BGP 路由发布者重新发布 Update 报文,进行路由更新

  • 所有设备都能支持 Route-Refresh 能力情况下,如果 BGP 的入口路由策略发生了变化,本地 BGP 路由器会向 Peer 发布 Route-Refresh 消息,收到此消息的 Peer 会将路由信息重新发给本地 BGP
  • 可以在不中断 BGP 连接的情况下,对 BGP 路由表进行动态刷新,并应用新的路由策略

image.png
Router-Refresh Message 格式解析

  • AFI:地址簇标识
  • Res:固定为0,在接收报文时,被忽略
  • SAFI:子地址簇标识

    3. BGP 状态机


在 OpenSent 状态之前都是因为 TCP 连接无法建立连接导致的

image.png

  • Idle(空闲)状态:BGP 总是以 Idle 状态为起始点,该状态拒绝所有入站连接[未建立任何状态]
    • 如果发生差错,BGP 会将状态迁移到 Idle 并开启重连定时器,在定时器到期时重启 BGP(每次重连定时器都是之前的 2倍)
    • 任何状态中收到 Notification 报文或 TCP 拆链通知等 Error 事件,BGP 都会迁移到 Idle 状态
  • Connect(连接)状态:BGP 尝试建立 TCP Session[尝试建立 TCP Session]
    • 如果 TCP 连接建立成功,BGP 会[向邻居发送 Open 报文]并迁移到 OpenSent 状态
    • 如果 TCP 连接建立失败,BGP 会继续侦听邻居初始化的连接并开启重连定时器,迁移到 Active 状态。如果重连定时器超时,仍处于 Connect 状态,则重置重连定时器,并再次尝试与邻居建立 TCP 连接,状态停留在 Connect
  • Active(激活)状态:BGP 会尝试与邻居初始化 TCP 连接[建立 TCP Session 失败]
    • 如果 TCP 连接建立成功,BGP 会关闭重连定时器完成初始化过程,[向邻居发送 Open 报文]并迁移到 OpenSent 状态(默认 Hold Time 定时器设置为 180s)
    • 如果重连定时器超时,BGP 会将状态迁移到 Connect。并重置重连定时器和初始化 TCP 连接后,继续侦听邻居的连接。如果邻居试图以非期望的 IP 建立 TCP 会话,则重置重连定时器并拒绝该连接,状态停留在 Active
  • OpenSent(打开发送)状态:BGP 会一直等待侦听来自邻居的 Open 报文[建立 TCP Session 成功,并发送了 Open 报文]
    • 接收到 Open 报文后,会检查该报文的每个字段,如果没有差错,则[发送 Keepalive 报文并设置 Keepalive 定时器],迁移到 OpenConfirm 状态(默认 Keepalive 定时器 60s)
      • Open 报文会根据邻居的 AS 号,确定邻居连接的是 iBGP 还是 eBGP
      • Open 报文会协商 Hold Time 时间,以便确定一个较小的 Hold Time 值。如果协商的 Hold Time 时间为 0,则不启动保持定时器和 Keepalive 定时器
    • 如果接收到的 Open 报文,检查字段时发现存在差错,会发送 Notification 报文并迁移到 Idle 状态
    • 如果收到断开 TCP 连接的请求,则关闭 BGP 连接并重置重连定时器,开始侦听邻居发起的新连接,并迁移到 Active 状态
  • OpenConfirm(打开确认)状态:BGP 会一直侦听来自邻居的 Keepalive 或 Notification 报文[已经接收到了 Open 报文,并同意了所有路径能力属性]
    • 如果[接收到 Keepalive 报文],则迁移到 Established 状态
    • 如果接收到 Notification 报文或 TCP 拆链的请求,则迁移到 Idle 状态。如果 Hold Time 定时器到期、检测到存在差错或者发生终止事件,会向邻居发送一个 Notification 报文,关闭 BGP 连接并迁移到 Idle 状态
  • Established(建立)状态:BGP 连接已经完全建立,Peer 之间可以互相交换 Update、Keepalive 和 Notification 报文[BGP 邻居关系建立成功,收到了邻居的 Keeplive 报文]
    • 如果接收到 Update 或 Keepalive 报文,BGP 就认为对端处于正常运行状态,将保持 BGP 连接,并重启 Hold Time 定时器
    • 如果接收到 Notification、错误的 Update、错误的 Keepalive 报文和 TCP 拆链通知,则迁移到 Idle 状态
    • 如果发生其他事件(除启动事件外)BGP 都会发送一条 Notification 报文并迁移到 Idle 状态
    • Route-refresh 报文不会改变 BGP 状态

      4. BGP 工作原理


  • BGP 的数据库中,路由条目必须是有效「表示方式 *****和可达的「表示方式 **>**才会加入全局路由表。并且如果不是有效的和可达的,不会通告给邻居路由器
  • BGP 可以跨设备建立 BGP 邻居,但需要 TCP 可达
  • 通常情况下建立 eBGP 采用直连建立[eBGP 默认 TTL=1],iBGP 采用环回口建立[iBGP 默认 TTL=255]
    • 如果 eBGP 采用环回口建立就需要开启多跳支持
    • 如果 eBGP 达到其他 AS 有多条链路,则可以采用环回口建立(可以负载,不需要建立多个 eBGP 邻居)
    • 使用默认路由建立 eBGP。如果是思科设备,邻居是无法 UP;华为设备邻居可以 UP,但是路由是无效的并且不是最优
  • BGP的 Keepalive 每 60s 为周期发送,Hold Time 时间为 180s[Keepalive 的 3 倍关系]
    • 如果 Hold Time 时间与 Peer 对等体不一致,不会影响邻居建立,会自动协商,选择较小的时间作为协商结果
    • Hold Time 的值可为零(不发 Keepalive 报文,但在刚建立邻居时会发送一个)
  • 如果某设备想产生 BGP 路由,那么这些路由必须以其他方式存在该设备上
    • IGP 路由
    • 静态
    • 直连方式
  • BPG 路由的来源方式不同,路由优先程度也不同[Network > 重分布]
    • Network:将 IGP 路由宣告到 BGP,宣告的掩码必须和 IGP 的掩码保持一致(精确匹配)。自身看来下一跳地址为 0.0.0.0,起源代码为 i
    • Import:可以把 IGP 路由或静态路由重分布到 BGP 数据库中。自身看来下一跳地址为0.0.0.0,起源代码为 ?
    • Aggregate:可以把 IGP 的所有路由聚合到 BGP 数据库中。自身看来下一跳地址为127.0.0.1,起源代码为 ?

      5. BGP 通告原则


  1. BGP 只会把自身最优的路由传递给邻居。如果去往同一目的有多条路径时,BGP 只会将最优的路由放入全局路由表(除非 IGP 没有该路由)
  2. BGP 从 eBGP 收到路由会传递给 iBGP 和 eBGP
    • BGP 从 eBGP 收到的路由传递给 iBGP 默认不会更改下一跳属性,且只会传递一跳「避免环路的发生」。需要在传递该路由的设备上手工配置下一跳自我
  3. BGP 从 iBGP 收到的路由不会传递给其他 iBGP 邻居。iBGP 自身产生的路由只会传递给相邻一跳的 iBGP 邻居「TTL = 1」
    • 类似水平分割原则,主要是为了「避免 iBGP 的环路产生」。但也造成了其他 BGP Speaker 路由条目不全的问题
      • 解决水平分割的问题需要 iBGP 全互联( “ (N*N-1)/2 “ )
        • 路由反射器(RR):打破水平分割,减少邻居关系
        • 联邦:由多个私有 AS 组成,由一个公有 AS 管理
  4. BGP 从 iBGP 获得的路由是否会传递到 eBGP 邻居,需要依据 IGP 和 iBGP 的同步来决定(没有同步可能会引发路由黑洞或路由无效)
    • Cisco 默认开启同步,可以通过命令开启或关闭
    • Huawei 默认关闭同步,所以华为设备 eBGP 从 iBGP 获得的路由会传递到 eBGP
    • BGP 与 IGP 同步的概念:从 iBGP 获得的路由信息传递给它的 eBGP 邻居,需要该路由能通过 IGP 获得,否则不传递给 eBGP(针对 iBGP 同步 IGP)「控制层面正常,但数据平面(转发平面)不可达」
      • 因为 BGP 是一种 Host to Host 的连接,可以在非直连设备上建立连接,如果中间路由器没有运行 BGP,就有可能出现路由黑洞
        • 当运行 BGP 的设备把去往 iBGP 路由的下一跳地址做递归查询(查询路由表)后交给中间设备时,由于中间设备没有运行 BGP 协议,导致没有 BGP 的路由,则产生了路由黑洞
      • 解决路由黑洞的方式
        • 将 iBGP 的路由引入到 IGP,默认情况下只能把 EBGP 引入到 IGP,不把 IBGP 引入到 IGP。不可取(容易造成环路)
        • 在产生路由黑洞的设备上,配置去往 BGP 下一跳的静态路由,不建议
        • 利用物理链路或逻辑链路(GRE)打通 BGP 设备之间的连接,不建议
        • 全互联(建立的连接太多),不建议
        • 开启同步(华为不支持,Cisco 可以支持)
        • 路由反射器(用来解决水平分割的问题,全互联后也能解决路由黑洞的问题)
        • 联邦
        • MPLS

          5. BGP 路由策略的信息处理


image.png

  • 路由策略 Import 方向
    • 对邻居传递过来的路由信息,「先放入 BGP 路由表中(Adj-RIB-in,未经处理的路由信息),在执行路由策略」,然后于自身 RIB 进行比较后放入全局路由表
  • 路由策略 Export 方向
    • 向邻居传递的路由信息,「先从 BGP 的路由表中进行路由策略处理(Adj-RIB-out,经过处理的路由信息),然后将最优的路由进行传递

      6. 下一跳地址解析


image.png

  • AR1 和 AR3、AR2 和 AR3 都使用直连建立 eBGP。将 AR2 的 Loopback100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
    • BGP 在 MA 中采用直连接口建立 eBGP 连接,且都在同一网段。设备从 eBGP 收到传递过来的路由,再传递给其他 eBGP 时,如果在同一网段,不会修改下一跳属性地址。从而避免了次优路径的产生(BGP 的优化,类似于路由重定向和 OSPF 的 FA 地址)
      • AR3 向 AR1 传递从 AR2 传递过来的 100 网段路由时,发现下一跳的地址都是在同一网段。此时 AR3 不会更改下一跳属性地址
  • AR1 和 AR3、AR2 和 AR3 都使用 Loopback0 建立 eBGP。将 AR2 上 Loopbaack100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
    • 如果 eBGP 之间采用 Loopback 接口建立的连接,设备从 eBGP 收到传递过来的路由,在传递给其他 eBGP 时,会修改下一跳属性地址
      • AR3 向 AR1 传递从 AR2 传递过来的 100 网段路由时,由于是 Loopback 建立的邻居(不在同一网段),此时 AR3 会修改下一跳地址在传递给 AR1
  • AR1 与 AR3 用直连建立 iBGP,AR2 与 AR3 用直连建立 eBGP。将 AR2 上 Loopback100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
    • 设备从直连建立的 eBGP 收到传递过来的路由,由于跟 iBGP 是同一网段且直连建立的 iBGP 时,传递给 iBGP 时,不修改下一跳属性地址(BGP 的优化)
      • AR3 从直连建立 eBGP 的 AR2 上收到传递过来的 100 网段路由,再传递给同一网段建立 iBGP 的 AR1 时,此时 AR2 不会修改下一跳属性地址
  • AR1 与 AR3 用 Loopback0 建立 iBGP,AR2 与 AR3 用 Loopback0 建立 eBGP。将 AR2 上 Loopback100 宣告进 BGP,观察 AR1 上 100 网段的路由下一跳
    • 设备从 eBGP 收到传递过来的路由,再传递给 iBGP 时,默认是不会修改下一跳属性地址,需要手工在传递该路由的设备上配置下一跳自我(默认情况下,如果 iBGP 有去往该路由下一跳的 IGP 路由时,可以通信,否则不可以通信)
      • AR3 向 AR1 传递从 AR2(eBGP)传递过来的 100 网段路由时,由于是 eBGP 向 iBGP 传递,默认情况下 AR2 传递给 AR1 时,不会修改下一跳属性。如果 AR1 有去往 100 网段下一跳的 IGP 路由,则可以通信,否则不可以通信

        7. 路由反射器


允许从 iBGP 邻居收到的路由传递给其他 iBGP 邻居,打破了 iBGP 防环原则。采用独有的「Cluster List」「Originator ID」属性防止路由环路 适合在已经具备了 BGP 的环境使用,在 eBGP 设备或中间设备做为 RR

1)RR 角色

image.png

  • 路由反射器(Route Reflector):RR 之间需要建立 iBGP
  • 反射客户端(Reflect-Client):由 RR 指定,只需要与 RR 建立 iBGP 邻居
  • 非反射客户端(None-Client):需要与 RR 建立 iBGP。与非客户端之间需要建立 iBGP,否则没有路由
  • 路由反射簇(Cluster):由客户端组成的管理域
    • 默认的 Cluster ID 为 Router ID,由 RR 创建
    • 一个 Cluster 可以包含多个 RR
    • 一个 Client 可以属于多个 Cluster
  • 始发者(Originator):标识路由的始发设备,用来防止在 Cluster 之间产生环路,由 RR 标记该路由始发设备的 Router ID,其他设备不能更改

    2)路由宣告原则

  • 从 None-Client 收到的路由只会传递给 Reflect-Client

  • 从 Reflect-Client 收到的路由会传递给所有的邻居(在有冗余的环境下,包含发起该路由的客户端本身,否则不通告)
  • 从 eBGP 传递过来的路由会传递给所有的 Reflect-Client 和 None-Client

    3)RR 的防环规则

  • 当 BGP Speaker 收到带有 Originator_ID 的路由时,则反射时不修改直接传递;如果收到不带有 Originator_ID 的路由时,则反射时添加路由通告者的Router ID(保证唯一性);如果收到路由与自身 Router ID 相同,则丢弃该路由(与 AS-Path 防环原则相同)

  • 由多个 Cluster ID 组成 Cluster List,每经过一个 RR 就会在原有 Cluster List 前加上 RR 自己的 Cluster ID。当 RR 收到一条路由时,会检查 Cluster List 是否包含自己的 Cluster ID,如果包含则丢弃该路由(与 AS-Path 防环原则相同)

    8. 联邦


没有打破 iBGP 防环原则,依旧遵循 适合在新建 BGP 环境中使用

  • 联邦 AS:对联邦外的 AS 号码(诸如 USA)
  • 成员 AS:成员之间采用 eBGP 连接,但路由表中表现为 iBGP
    • 成员的下一跳(不管是从 eBGP 还是 iBGP 传递过来的路由,都不会修改下一跳地址)、MED值、本地优先级会继承 | 比较 | 联邦 | 反射器 | | —- | —- | —- | | 多层次 | 支持,并且可以在成员 AS 中使用 RR | 支持 | | 策略控制 | 更灵活 | 支持 | | iBGP 迁移 | 较大的变更 | 较小变更,灵活性高 | | 能力支持 | 都必须支持联邦能力 | 只要某台设备支持 RR,但在多级 RR 中需要都支持 | | IGP 扩展 | 支持单一或分开的 IGP | 一般为单一的 IGP,多 IGP 不建议使用 | | 使用情况 | 较少,一般用在大型网络环境 | 适应绝大部分网络环境 | | AS 合并 | 可以把新的 AS 作为成员 AS 合并 | / |

9. 团体属性


  • 团体属性不受 AS 的限制(Attributes),自身不可以影响选路
  • 给 BGP 的路由条目打上标记(匹配条件),确保路由过滤和选择的连续性,默认不向邻居更新团体属性

    1)应用方式

  • 向邻居传递路由时使用

  • 从邻居收取路由时使用
  • 产生路由时使用

    2)保留的团体属性

  • 0x00000000 ~ 0x0000FFFF

  • 0xFFFF0000 ~ 0xFFFFFFFF

    3)公认团体属性

  • Internet:可以向任何 BGP 邻居发送该属性(默认)

  • No_Export:不向 eBGP 传递该路由(RR 如果不配置,对收到携带团体属性的路由不会把团体属性传递给其他邻居)
  • Local-AS/No_Export_Subconfed:不传递出本地 AS 或联邦成员 AS
  • No_Advertise:不向任何 BGP 邻居发送该路由

    4)私有/自定义团体属性

  • 可以用于路由清洗、控制路由的路径

  • 默认情况下对设备中 BGP 路由表的所有条目都会携带团体属性
  • 前两个字节由 AS 来编码,后两个字节是 0~65535 的任意数值(AS 2字节、Number 2字节)

    10. BGP 路径属性


1)路径属性类型

  • 公认属性:所有 BGP 路由器都必须识别的属性(默认向邻居传递这类属性)
    • 公认必遵(Well-known mandatory):必须存在于 Update 消息中,如果缺少这种属性,路由信息就会出错
      • Origin(起源属性)
      • AS-Path(路径属性)
      • Next-Hop(下一跳属性)
    • 公认任意(Well-known discretionary):不要求必须存在于 Update 消息中,可以根据具体情况来决定是否添加到 Update 消息中
      • Local-Preference(本地优先属性)
      • Atomic-Aggregate(原子聚合属性)
  • 可选属性:不需要都被 BGP 路由器所识别(默认不向邻居传递这类属性)

    • 可选过渡(Optional transitive):接收该属性的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性
      • Aggregate(聚合者属性)
      • Community(团体属性)
    • 可选非过渡(Optional non-transitive):接收该属性的路由器如果不识别这种属性,将丢弃这种属性,不会再转发给邻居路由器
      • Multi_Exit_Disc(MED 属性)
      • AIGP(传递并累加IGP Cost值)
      • Originator ID(起源ID 属性)
      • Cluster List(簇列表属性)
      • MP_Reach_NLRI(BGP4+,多协议可达性)
      • MP_Unreach_NLRI(BGP4+,多协议不可达性)
      • Extended_Communities

        2)常见路径属性

        ① Origin

  • 起源代码中 **i > e > ?**,默认情况下不会被任何路由器修改(e 表示通告 EGP 学到的路由)

    ② AS_Path

    用于选路和防环。当从其他 AS 收到的路由中包含自己的 AS 号不会接收

  • 是 BGP 路由的传输路径中所经历的 AS 列表

  • BGP 路由表中各个条目的 AS_Path 越短越优,一般在最优的 eBGP 设备部署(特殊场景下可以针对某台设备配置忽略该选路原则)
  • 默认不会接收 AS_Path 属性中包含本 AS Number,从而避免产生环路
    • 但在某些特并采用 eBGP 接入到 ISP,如果不能接收包含本 AS Number 的路由,Hub 和 Spoke 的路由就不可达。所以需要在 Hub 节点配置本地 AS 号重复次数,解决该问题)AS 被分割),需要接收包含本 AS Number 的路由(Hub 和 Spoke 都运行的相同 AS 次数,解决该问题)
  • 当 BGP Speaker 传递自身引入的路由时,只有在传递到 eBGP 邻居,才会在 Update 消息中携带本地 AS Number 的 AS_Path 列表
  • 当 BGP Speaker 传递从其他 BGP Speaker 学到的路由时,只有在传递到 eBGP 邻居,才会把本地 AS Number 添加在 AS_Path 列表最前面

    ③ Next_Hop

  • iBGP 向 iBGP 邻居传递路由时,自己的更新源地址就是下一跳地址

  • eBGP 向 iBGP 邻居传递学到的路由时,不会改变路由信息的下一跳属性「解决方案:下一跳自我」
  • eBGP 向 eBGP 邻居传递路由时,会把下一跳属性设置为本地与邻居建立关系的接口地址
  • 在多点接入网络中,Cisco 会有类似 OSPF FA 地址类似的特性(重定向)

    • A <—-> B(eBGP)、B <—-> C(iBGP)、C <—-> D(eBGP),此时 A 去往 D 的下一跳地址直接为 C

      ④ Loacl-Preference(本地优先)

      控制内部访问外部的路径选择,一般在 eBGP 设备部署

  • 表示 BGP 路由条目的优先级,用来判断流量离开 AS 时的最佳路由[多出口使用,影响流量出本 AS]

    • BGP 设备通过不同的 iBGP 邻居得到目的地址相同但下一跳不同的多条路由时,将优选 Local Pref 属性值较高的路由
  • [仅在 iBGP 邻居之间有效],可以被 RR 反射,不会通告给其他 AS。Loacl Perf 「值越高越优」,默认优先级为「100」

    • 可以针对 iBGP 的出入方向调用
    • 可以针对 eBGP 的入方向调用,不能针对 eBGP 的出方向调用

      ⑤ Atomic-Aggregate(原子聚合)

  • 当明细路由被聚合后,用来通知其他 BGP 设备在聚合过程中丢失了一些路径属性,华为中默认继承 Community 和 Origin,只有 AS-Path 没有继承(需要通告 AS-Set 继承)

  • 可能变化的属性(继承的属性)

    • 是否发布明细路由和控制
      • 默认情况下不会抑制明细路由,当采用 detail-suppressed suppress-policy origin-policy 可以控制明细路由的发布、抑制和指定哪些明细路由被聚合
    • AS-Path
      • AS-Set(无序):会把来自不同 AS 的 AS 号码无序的排在聚合路由的 AS-List 里,标明聚合路由经过的 AS,从而避免环路的产生
        • 如果聚合路由不是在始发设备的 AS 做的聚合,而由其他 AS 设备做聚合并且不携带 AS-Set 属性(聚合的路由中不包含始发 AS-Path),那么这条聚合路由在传递到原始 AS 时,会接收并计算路由,从而产生环路风险
      • AS-Sequence(有序):每经过一个 AS 都会把经过的 AS 号码排在 AS-Path 前端
    • Origin:当聚合路由的 Origin 属性不同时,在华为中聚合后标记为 ?,在Cisco 中标记为 i ,会影响路由的选路。可以通过 attribute-policy 修改起源属性或其他属性
    • Community:不携带 Atomic-Aggregate 属性时,才会进行累加
    • ….

      ⑥ Aggregator(聚合者)

  • 标识聚合者的 Router ID,用来精确的找到聚合路由的源头。手工聚合的路由优先级高于自动聚合

    ⑦ Community(团体属性)

  • 用于标识具有相同特征的 BGP 路由,类似于 VLAN Tag

  • 团体属性由一系列4字节(0x00000000~0xFFFFFFFF)数值组成
  • 公认团体属性

    • Internet:可以向任何 BGP 邻居发送该路由
    • No_Advertise:不向任何 BGP 邻居发送该路由
    • No_Export:不向 AS 外发送该路由
    • No_Export_Subconfed:不向 AS 外发送该路由,也不向 AS 内其他子 AS 发布此路由(联邦)

      ⑧ Multi_Exit_Disc(多出口分离器)

      控制外部访问内部的路径选择,一般用于 eBGP 之间部署

  • 表示 BGP 路由的 Cost 值,用于判断流量进入 AS 时的最佳路由。如果是从 IGP 协议引入的路由,会继承 IGP 的 Cost 值

  • 起源自 eBGP 设备本地的 MED 可以通告给所有的邻居,但对来自 iBGP 内的路由里的 MED 值只能通告给 iBGP,给其他 eBGP 不会携带 MED 值
  • [对所有的 BGP 邻居都可以生效],但仅在相邻的两个 AS 之间传递
  • 默认[MED 值只会比较来自同一起始 AS 的路由],MED 「值越小越优」,默认为「0」

    • BGP 设备通过相同 AS 但不同 eBGP 邻居得到目的地址相同但下一跳不同的相同路由时,在其它条件相同的情况下,将优先选择 MED 值较小者作为最佳路由
    • 默认情况下不会比较不同 AS 过来的相同路由的 MED 值,如果需要比较不同 AS 过来的相同路由,可以使用命令开启(开启条件:除非能够确认不同的 AS 采用了同样的 IGP 和路由选择方式,否则别开启该属性)

      ⑨ Originator-ID(起源 ID)

  • RR 的防环机制。避免在有冗余 RR 的环境中,收到自己传递出去的路由,避免环路产生

  • 当 BGP Speaker 收到带有 Originator_ID 的路由时,比较是否是自身的 Router ID,如果相同则丢弃该路由(与 AS-Path 防环原则相同)

    ⑩ Cluster-List(集群列表)

  • RR 的防环机制。在 RR 反射路由时将自己的 Cluster ID 组成 Cluster List

  • 每经过一个 RR 就会在原有 Cluster List 前加上 RR 自己的 Cluster ID。当 RR 收到一条路由时,会检查 Cluster List 是否包含自己的 Cluster ID,如果包含则丢弃该路由(与 AS-Path 防环原则相同)

    11. BGP 选路原则


如果路由的下一跳不可达,忽略此路由

  1. Preferred-Value/Weight 值越高的优先[仅本地有效,默认 = 0]
  2. Local-Preference 值越高的路由优先[仅 iBGP 和联邦成员 AS 传递,默认 = 100]
  3. ASNIL(本地产生的路由 > 从邻居学到的路由[本地手动聚合路由(可以聚合 Network 和 Import) > 本地自动聚合路由(只能聚合 Import) > Network > Import > 从邻居学到的路由])
  4. AIGP(可选非过渡属性,有AIGP的优于没有AIGP属性的;先比较AIGP属性,再比较IGP Cost之和)
  5. AS_Path 越短越优
  6. 比较 Origin 属性[IGP > EGP > Incomplete **i > e > ?**
  7. 选择 MED 值较小的路由[默认 = 0]
  8. eBGP 路由 > iBGP 路由 > Loacl Cross > Remote Cross
  9. BGP Next_Hop 中 IGP Metric 最小的路由
  10. ECMP 负载均衡[前面 8 条都比较不出来,AS-Path需要完全相同(联邦成员 AS 不可以)]
  11. 时间更久的 eBGP(Cisco 私有)
  12. Cluster_List 越短越优
  13. Router_ID/Originator ID 越小越优(经过 RR 反射的比较 Originator ID;不经过 RR 反射的比较 Router ID)
  14. 选择有较小 IP 地址邻居的路由

    12. 正则表达式


AS-Path Filter:在同一个列表编号下,可以定义多条过滤策略(permit 或 deny)。在匹配过程中,这些规则之间是 “或” 的关系,只要路由信息通过其中一项规则,就认为通过由该列表编号标识的这组 AS-Path 过滤列表

  • 可以用作过滤或命中后匹配其他工具使用
  • AS-Path Filter 有风险,谨慎使用
  • BGP 的正则表达式由 “符号” 和 “AS号码” 组成 | 符号 | 说明 | | —- | —- | | ^ | 匹配一个字符串的开始(^200 表示只匹配 AS-Path 的第一个值为200) | | $ | 匹配一个字符串的结束(例如:200$ 表示只匹配 AS-Path 的最后一个值为200) | | . | 匹配任何单个字符以及符号(包括空格) | | + | 匹配前面的一个字符或一个序列,可以一次或多次出现 | | _ | 匹配一个符号(例如:逗号 , 、括号 () 、空格 ` 等) | |*| 匹配前面的一个字符或一个序列,可以零次或多次出现 | |()| 匹配变化的 AS 或一个独立的匹配,通常和|一起使用 | ||| 逻辑或 | |[]| 匹配一个范围内的 AS,通常和-一起使用 | |-` | 连接符 |

1)正则表达式匹配示例

  • **^ *** 开始符号和结束符号的使用:**ip as-path-filter 1 permit **``**^12.*74$**
    • 表示匹配 AS 号码 以 “ 12” 开始,并且 AS 号码 以 “74” 结束
      • AS_Path(123 621 743 34512 2374)
  • **|** 逻辑或的使用:**ip as-path-filter 1 permit **``**23|43**
    • 表示匹配 AS 号码中带有 “23 或 43”
      • AS_Path(123 621 743 34512 2374)
  • **[]** 匹配范围的使用:**ip as-path-filter 1 permit **``**[1-3][47]**
    • 表示匹配整个 AS-Path 中带有 “14、17、24、27、37
      • AS_Path(123 621 743 34512 2374)
  • **_** 匹配一个符号的使用:**ip as-path-filter 1 permit **``**_34512 170$**
    • 表示匹配以 “AS 号码 34512 与 170 直接相连 “
      • AS_Path(123 621 743 34512 170)
  • **.** 匹配一个符号或字符的使用:**ip as-path-filter 1 permit **``**[1-3].[47]**
    • 表示匹配整个 AS-Path 中带有 “14、17、24、27、37 和所有中间带符号的相连
      • AS_Path(123 621 743 34512 2374)
      • AS_Path(123 621 743 34512 2374)

        2)常用的正则表达式

        | 正则表达式 | 含义 | | —- | —- | | ^$ | 匹配本地 AS 始发的路由 | | .* | 匹配所有路由 | | _10_ | 匹配所有必须通过 AS10 的路由 | | ^10& | 匹配 AS-Path 中只有 AS10 的路由 | | ^10_. | 匹配从相邻 AS10 接收的路由 | | ^[0-9]+$ | AS_Path 只有一个 AS 号 |

13. 多协议 BGP(MP-BGP)


  • 对 IPv4 组播网络的支持称为 MBGP(RPF 检测)
  • 对 IPv6 单播网络的支持成为 BGP4+(只支持手动聚合)
    • MP_Reach_NLRI(BGP4+,多协议可达性):用于发布可达路由及下一跳信息
    • MP_Unreach_NLRI(BGP4+,多协议不可达性):用于撤销不可达路由
    • 可以使用全局单播地址建立 BGP 邻居
    • 可以使用 Link-Loacl 地址建立 BGP 邻居(有些设备不支持)
    • 可以用 IPv4 地址建立 BGP 邻居更新 IPv6 路由(过渡方式)

      14. 其他特性


  • 不变更下一跳地址:可以强制对邻居使用不变更下一跳地址
    • next-hop-invariable
  • 被动侦听: 由对端向本端发起主动建立 BGP 的 179 端口
    • listen-only
  • AS 欺骗:华为VRP5设备只会保留虚假的AS,会影响路由选路。cisco会在原有AS前增加虚假AS
    • fake-as
  • 移除私有AS:华为 VRP5 设备会把所有私有 AS 移除,导致 AS 变短,有可能会影响路由选路
    • public-as-only
  • 自动聚合:于 RIP 类似自动汇总为主类路由,只会汇总起源为 ? 的路由
    • summary automatic
  • 通过其他手段汇总:通告静态或 IGP 进行汇总后通告
    • aggregate
  • 接收重复的 AS 号码:允许 BGP 接收重复 AS 号的路由,特殊环境使用
    • allow-as-loop
  • 不同 AS 的 MED值比较:比较从任意 AS 收到的相同路由条目的 MED 值
    • compare-different-as-med
  • BGP的默认路由:可以从其他路由协议引入默认路由或 Network,也可以针对邻居产生默认路由
    • default-route-advertise
  • Null0 接口:可用于路由清洗(防止潜在的环路)
  • BGP认证:针对的是 TCP 报文的认证,存在于 TCP 报文的可选项字段中,Option 19,只能使用 MD5 方式