关键词:BGP、路由聚合、Aggregate、AS_SET、AS_RANGE、明细路由、汇总路由、路由优化

第90篇:BGP 聚合与 AS_SET 属性

一、引言

BGP 路由聚合(Aggregation,也称 Route Summarization)是将多条具体的 BGP 路由(明细路由)合并为一条概要路由(聚合路由)的技术。聚合的核心目的是减少 BGP 路由表的规模、降低 Update 报文的数量、减少路由振荡的影响范围。

在全球 BGP 路由表已超过 90 万条的今天,路由聚合不仅是性能优化的手段,更是控制路由表膨胀的必要措施。然而,聚合也会丢失明细路由的路径属性信息,BGP 通过 as-set(AS_SET)和 as-range(AS_RANGE)选项提供了保留聚合后路径属性的机制。

二、核心概念

2.1 BGP 聚合的基本原理

BGP 聚合将具有相同高比特位前缀的多条明细路由合并为一条聚合路由:

明细路由 聚合后
192.168.1.0/24
192.168.2.0/24 192.168.0.0/22
192.168.3.0/24
192.168.4.0/24

聚合的优势:

优势 说明
减小路由表规模 多条明细合并为一条聚合,减少 BGP 表项
减少 Update 报文 明细路由变化时,聚合路由可能不变,无需发送 Update
隐藏内部拓扑 外部 AS 只看到聚合路由,不了解内部网络结构
减少路由振荡 单个明细路由的 Up/Down 不影响聚合路由的稳定性
降低处理开销 减少 Best Path 计算和路由表安装的数量

2.2 聚合的路径属性处理

聚合路由的路径属性是一个关键问题:不同明细路由可能具有不同的路径属性(AS_PATH、Origin、MED 等),聚合后使用哪条明细的属性?

处理方式 说明 路径属性来源
默认聚合(as-originate) 聚合路由作为新路由 originate,使用本地默认属性 本地默认(AS_PATH 为空、Origin=IGP)
as-set 聚合路由的 AS_PATH 包含所有明细路由的 AS 号集合(无序) 所有明细的 AS 号组成 AS_SET
as-range 聚合路由保留所有明细路由的属性副本 保留每条明细的完整属性

默认聚合的问题: - 聚合路由的 AS_PATH 为空(本地 originate),丢失了所有明细的路径信息 - 可能导致次优路由:外部 AS 根据空的 AS_PATH 选择经过本 AS 的路径,但实际该路径并非最优 - 可能引入环路:丢失了 AS_PATH 信息后,AS_PATH 环路检测失效

2.3 AS_SET 属性

AS_SET 是 AS_PATH 的一种特殊编码格式(AS_SET,代码=1),用于在聚合路由中保留明细路由的 AS 号信息:

特性 说明
编码类型 AS_SET(无序集合,代码=1)
与 AS_SEQUENCE 的区别 AS_SEQUENCE 是有序的(记录路径顺序),AS_SET 是无序的(仅记录集合)
防环作用 保留 AS 号,使 AS_PATH 环路检测仍然有效
选路作用 保留 AS 号数量,AS_PATH 长度比较仍然有效

AS_SET 示例:

明细路由1: AS_PATH = 300 200
明细路由2: AS_PATH = 300 400
明细路由3: AS_PATH = 500

聚合路由(as-set): AS_PATH = {200 300 400 500}
                   ↑ AS_SET(无序集合,大括号表示)

2.4 AS_RANGE 属性

AS_RANGE 是另一种保留聚合属性的机制:

特性 说明
编码类型 AS_RANGE(代码=4)
工作原理 保留所有明细路由的完整属性副本(多 Path ID)
选路影响 BGP 选路时使用"最优明细路由"的属性作为聚合路由的属性
适用场景 需要保留完整路径属性信息的场景

三、技术细节

3.1 聚合配置选项详解

# 基本聚合(默认模式)
bgp 100
 aggregate 192.168.0.0 22

# 聚合+as-set(保留AS号集合)
bgp 100
 aggregate 192.168.0.0 22 as-set

# 聚合+as-range(保留完整属性)
bgp 100
 aggregate 192.168.0.0 22 as-range

# 聚合+suppress-policy(控制哪些明细被抑制)
bgp 100
 aggregate 192.168.0.0 22 as-set suppress-policy AGG-SUPPRESS

# 聚合+detail-suppressed(抑制所有明细路由)
bgp 100
 aggregate 192.168.0.0 22 as-set detail-suppressed

3.2 聚合路由的生成条件

聚合路由的生成遵循以下规则:

条件 说明
至少存在一条匹配的明细路由 没有明细路由时,聚合路由不生成(除非配置 attribute-policy 或 as-set 的特殊模式)
明细路由存在于 BGP 表中 明细路由必须存在于 Adj-RIBs-In 或 Loc-RIB 中
聚合前缀必须覆盖至少一条明细 聚合前缀的掩码长度必须短于(等于或包含)明细前缀

聚合路由的属性继承:

属性 默认聚合 as-set 聚合 as-range 聚合
AS_PATH 空(本地originate) 所有明细的 AS 号集合(无序) 最优明细的属性
Next_Hop 0.0.0.0(本地) 0.0.0.0 最优明细的 Next_Hop
Origin IGP 如果所有明细 Origin 相同则保留,否则 Incomplete 最优明细的 Origin
MED 0 所有明细 MED 的最大值 最优明细的 MED
LOCAL_PREF 100(默认) 最优明细的 LOCAL_PREF 最优明细的 LOCAL_PREF
Community 无 所有明细 Community 的并集 最优明细的 Community

3.3 明细路由的抑制(Suppression)

聚合后,明细路由是否仍然被通告,取决于配置:

配置 明细路由是否通告 适用场景
默认聚合 聚合路由和明细路由都通告 需要外部 AS 精确路由的场景
detail-suppressed 只通告聚合路由,抑制所有明细 完全隐藏内部拓扑
suppress-policy 通过路由策略控制抑制哪些明细 部分明细需要精确路由的场景

明细路由的抑制(Suppression) - 图示

四、实战配置/案例分析

4.1 BGP 聚合基础配置

# ===== 聚合路由器配置 =====
sysname PE1
bgp 100
 router-id 1.1.1.1

 # 配置eBGP邻居
 peer 2.2.2.2 as-number 200
 peer 2.2.2.2 connect-interface GigabitEthernet 0/0/1

 # 宣告明细路由
 network 192.168.1.0 24
 network 192.168.2.0 24
 network 192.168.3.0 24
 network 192.168.4.0 24

 # 配置聚合(as-set模式,保留AS号)
 aggregate 192.168.0.0 22 as-set detail-suppressed
 # 聚合后只通告192.168.0.0/22,不通告明细
 # as-set保留所有明细的AS号集合

# ===== 验证聚合效果 =====
display bgp routing-table 192.168.0.0 verbose
  Network: 192.168.0.0/22
  Path Attributes:
    Origin: IGP
    NextHop: 0.0.0.0
    AS_PATH: {200 300 400} Aggregator: 1.1.1.1 100
    # AS_PATH中的{}表示AS_SET
    # Aggregator字段标识聚合路由的生成者

4.2 案例分析:聚合导致次优路由

故障现象:聚合路由部署后,外部 AS 的流量绕路,选择了非最优路径到达目的地。

排查:

  1. 查看聚合路由的 AS_PATH:
# 在外部AS查看
display bgp routing-table 192.168.0.0 verbose
  AS_PATH: 100
  # 聚合路由(默认模式)的AS_PATH只包含AS 100
  # 丢失了明细路由中的AS 200、AS 300信息
  1. 分析次优路由原因:
  2. 明细路由1:AS_PATH = 300 200 100(经过3个AS)
  3. 明细路由2:AS_PATH = 300 100(经过2个AS)
  4. 聚合路由(默认模式):AS_PATH = 100(只显示1个AS)
  5. 外部 AS 看到聚合路由的 AS_PATH 只有 100,认为经过 AS 100 的路径最短,选择该路径
  6. 但实际上,部分流量到达 AS 100 后,需要再次经过 AS 200 才能到达目的地

  7. 解决方案:

# 方案1:使用as-set保留AS号
[R-PE] bgp 100
[R-PE-bgp] undo aggregate 192.168.0.0 22
[R-PE-bgp] aggregate 192.168.0.0 22 as-set detail-suppressed
 # 聚合后AS_PATH: {200 300} 100
 # 外部AS可以看到完整的AS号集合,做出更准确的选路决策

# 方案2:通告明细路由(不抑制)
[R-PE-bgp] aggregate 192.168.0.0 22 as-set
 # 不配置detail-suppressed,同时通告聚合和明细
 # 外部AS根据明细路由的精确AS_PATH选路

4.3 案例分析:选择性抑制明细

场景:AS 100 需要聚合 192.168.0.0/22,但 192.168.1.0/24 需要被外部 AS 精确路由(因为该网段有特殊的负载均衡需求)。

配置:

# 定义路由策略:抑制除192.168.1.0/24外的所有明细
ip prefix-list SUPPRESS-ALL seq 10 permit 192.168.0.0 22 greater-equal 24 less-equal 24

route-policy AGG-SUPPRESS permit node 10
 if-ip-address prefix-list SUPPRESS-ALL

route-policy AGG-SUPPRESS deny node 20
 # deny节点:不匹配的(192.168.1.0/24)不被抑制

bgp 100
 aggregate 192.168.0.0 22 as-set suppress-policy AGG-SUPPRESS

# 效果:
# - 192.168.0.0/22 (聚合路由): 通告
# - 192.168.1.0/24 (明细): 通告(不被抑制)
# - 192.168.2.0/24 (明细): 抑制
# - 192.168.3.0/24 (明细): 抑制
# - 192.168.4.0/24 (明细): 抑制

4.4 案例分析:聚合路由不生成

故障现象:配置了 BGP 聚合命令,但聚合路由没有生成。

排查:

  1. 检查聚合条件:
[R-PE] display bgp routing-table 192.168.0.0
  # 聚合路由不存在!

[R-PE] display bgp routing-table 192.168.1.0
  # 明细路由也不存在!
  1. 根因:BGP 聚合的前提是至少存在一条匹配的明细路由。如果明细路由没有被正确宣告(network 命令的前缀掩码不匹配、IGP 路由不存在等),聚合路由不会生成。

  2. 检查明细路由:

[R-PE] display ip routing-table 192.168.1.0
  # 192.168.1.0/24 不存在于IP路由表中!
  # 根因:直连接口配置的是192.168.1.0/24,但network命令写成了192.168.1.0 255.255.255.0
  # 或者:该网段是对端网络,本地没有直连路由
  1. 修复:
# 确保明细路由存在于IP路由表中,然后配置network宣告
[R-PE] bgp 100
[R-PE-bgp] network 192.168.1.0 24
[R-PE-bgp] network 192.168.2.0 24
 # 配置后,聚合路由自动生成

五、总结

聚合模式 AS_PATH 处理 明细路由处理 适用场景
默认聚合 空(本地originate) 聚合+明细都通告 不需要保留路径信息的简单场景
as-set 所有明细 AS 号集合(无序) 聚合+明细都通告 需要保留 AS 号防止环路的场景
as-set + detail-suppressed 所有明细 AS 号集合 仅通告聚合 完全隐藏内部拓扑(推荐)
as-range 保留最优明细属性 聚合+明细都通告 需要保留完整属性信息的场景
suppress-policy 可自定义 选择性抑制 部分明细需要精确路由的场景
聚合关键属性 说明
AS_SET 无序 AS 号集合,保留防环和选路信息
AS_RANGE 保留最优明细路由的完整属性副本
Aggregator 标识聚合路由的生成者(Router ID + AS 号)
Atomic_Aggregate 标识该路由是聚合路由,可能丢失明细信息

思考

  1. 为什么默认聚合模式下聚合路由的 AS_PATH 为空?这种设计可能导致什么问题?as-set 如何解决这些问题?
  2. AS_SET 是无序集合,与 AS_SEQUENCE 的本质区别是什么?为什么聚合路由不能使用 AS_SEQUENCE?
  3. 在什么场景下应该使用 detail-suppressed 抑制所有明细路由?在什么场景下应该保留明细路由的通告?

下篇预告:第91篇:BGP Community 属性与路由控制