关键词: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 | 通过路由策略控制抑制哪些明细 | 部分明细需要精确路由的场景 |

四、实战配置/案例分析
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 的流量绕路,选择了非最优路径到达目的地。
排查:
- 查看聚合路由的 AS_PATH:
# 在外部AS查看
display bgp routing-table 192.168.0.0 verbose
AS_PATH: 100
# 聚合路由(默认模式)的AS_PATH只包含AS 100
# 丢失了明细路由中的AS 200、AS 300信息
- 分析次优路由原因:
- 明细路由1:AS_PATH = 300 200 100(经过3个AS)
- 明细路由2:AS_PATH = 300 100(经过2个AS)
- 聚合路由(默认模式):AS_PATH = 100(只显示1个AS)
- 外部 AS 看到聚合路由的 AS_PATH 只有 100,认为经过 AS 100 的路径最短,选择该路径
-
但实际上,部分流量到达 AS 100 后,需要再次经过 AS 200 才能到达目的地
-
解决方案:
# 方案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 聚合命令,但聚合路由没有生成。
排查:
- 检查聚合条件:
[R-PE] display bgp routing-table 192.168.0.0
# 聚合路由不存在!
[R-PE] display bgp routing-table 192.168.1.0
# 明细路由也不存在!
-
根因:BGP 聚合的前提是至少存在一条匹配的明细路由。如果明细路由没有被正确宣告(network 命令的前缀掩码不匹配、IGP 路由不存在等),聚合路由不会生成。
-
检查明细路由:
[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
# 或者:该网段是对端网络,本地没有直连路由
- 修复:
# 确保明细路由存在于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 | 标识该路由是聚合路由,可能丢失明细信息 |
思考
- 为什么默认聚合模式下聚合路由的 AS_PATH 为空?这种设计可能导致什么问题?as-set 如何解决这些问题?
- AS_SET 是无序集合,与 AS_SEQUENCE 的本质区别是什么?为什么聚合路由不能使用 AS_SEQUENCE?
- 在什么场景下应该使用 detail-suppressed 抑制所有明细路由?在什么场景下应该保留明细路由的通告?
下篇预告:第91篇:BGP Community 属性与路由控制