聚合在做什么
聚合(路由汇总、超网)是把若干条连续的网段合成一条前缀更短的路由。判断能不能合并只看两点:这些小网段是否连续、以及合起来的总量是不是 2 的幂且起点按这个总量对齐。例如 192.168.0.0/24 到 192.168.3.0/24 共 4 个 /24,正好对齐成 192.168.0.0/22。
为什么必须对齐
CIDR 路由条目永远是「起点 + 前缀长度」的形式,无法表达任意起止范围。192.168.1.0/24 与 192.168.2.0/24 看起来相邻,但它们不在同一个 /23 边界内:前者的 /23 是 192.168.0.0/23(覆盖 0 与 1),后者的 /23 是 192.168.2.0/23(覆盖 2 与 3)。要覆盖这两个段只能退到 /22,或者保留两条路由。
基本信息
| 合并条件 | 网段连续,且总量为 2 的幂、起点按该大小对齐 |
|---|---|
| 新前缀 | 32 - log2(合并后的地址总量) |
| 常用手段 | ipaddress.collapse_addresses、device 侧 summary-address |
| 收益 | 路由表更短、收敛更快、变更影响面更小 |
| 代价 | 可能覆盖未规划地址,形成黑洞 |
典型使用场景
- 企业出口只向上游通告一条汇总路由,减少路由条目与抖动
- OSPF/EIGRP 区域边界做路由汇总,隔离区域内部变化
- 防火墙与 ACL 用一条规则覆盖整个地址块,减少规则数量
- 跨站点 VPN 用汇总路由简化隧道配置
- 审计现网时检查是否存在可汇总但未汇总的碎片路由
- 迁移或合并网络时快速算出一条能覆盖所有旧段的前缀
逐层合并:4 个 /24 → 1 个 /22
逐层合并:4 个 /24 → 1 个 /22
192.168.0.0/24 + 192.168.1.0/24 → 192.168.0.0/23
192.168.2.0/24 + 192.168.3.0/24 → 192.168.2.0/23
192.168.0.0/23 + 192.168.2.0/23 → 192.168.0.0/22
# 每一次合并都要求两块相邻且起点按新块大小对齐Python 批量聚合并验算
Python 批量聚合并验算
import ipaddress as ip
nets = [ip.ip_network('172.16.%d.0/24' % x) for x in range(32, 64)]
print(list(ip.collapse_addresses(nets))) # [IPv4Network('172.16.32.0/19')]
print(2 ** (32 - 19)) # 8192 个地址
print(len(nets), 32) # 输入 32 条,聚合后 1 条常见聚合示例
| 输入网段 | 可汇总为 | 覆盖地址量 | 注意 |
|---|---|---|---|
| 2 个偶数对齐的 /24 | /23 | 512 | 起点必须是偶数段 |
| 4 个 /24(起点为 4 的倍数) | /22 | 1024 | 典型园区分部汇总 |
| 8 个 /24 | /21 | 2048 | 机房分区汇总 |
| 16 个 /24 | /20 | 4096 | 整栋楼或一个站点 |
| 2 个 /25,起点 .0 与 .128 | /24 | 256 | 同一条 /24 内部再合并 |
聚合的正确性可以用一条判据快速验证:汇总后前缀必须整除块大小(起点对齐),并且所有被合并的小网段都能被这条前缀覆盖而不带进无关网段。两个条件同时成立才算干净汇总。
聚合出比实际使用范围更大的前缀会形成黑洞:172.16.32.0/19 覆盖 32 到 63 共 32 个 /24,只要其中有一段被别的用途占用或完全未规划,指向该段的流量就会被汇总路由吸走并丢弃。