数据包在 域内路由 的 OSPF/IS-IS 网络里已经能找到最短路径,但那是在一个组织内部。当数据包需要从中国电信的网络跨到中国联通的网络,从 AWS 的 AS 跨到 Google 的 AS——谁来决定走哪条路?IGP 只关心”怎么走最快”,但跨组织转发从来不是纯粹的最短路径问题。运营商之间有商业合同,有结算关系,有”我的流量不给你白嫖”的策略需求。
BGP(Border Gateway Protocol,边界网关协议)就是互联网的”外交系统”。它不追求全局最优,而是让每个组织按自己的策略决定流量怎么进出。理解 BGP,才能理解互联网为什么是今天这个样子——为什么有些路径看起来绕远却偏偏那么走,为什么一次 BGP 配置错误能让半个互联网断线。
一、自治系统:互联网的”国家”
1.1 AS 的概念与编号
自治系统(Autonomous System,AS)是互联网路由的基本行政单位。一个 AS 是一组在统一管理下运行相同路由策略的 IP 网络集合。每个 AS 拥有一个由 IANA 分配的唯一编号——ASN(Autonomous System Number)。
ASN 有两种格式:
| 格式 | 范围 | 可用数量 | 状态 |
|---|---|---|---|
| 2-byte ASN | 0 ~ 65535 | 65536(实际可用约 64000) | 已耗尽 |
| 4-byte ASN | 0 ~ 4294967295 | 4,294,967,296 | 当前使用 |
2-byte ASN 中,64512 ~ 65534 是私有 ASN(类似 RFC 1918 私有 IP),不会出现在全球 BGP 路由表中。4-byte ASN 的私有范围是 4200000000 ~ 4294967294。
# 查询某个 ASN 的归属信息whois -h whois.radb.net AS4134# 输出节选:# as-name: CHINANET-BACKBONE# descr: No.31,Jin-rong Street# descr: Beijing 100032, China# 中国电信骨干网
# 查询某个 IP 前缀所属的 ASwhois -h whois.radb.net 202.97.0.0# 输出:origin: AS41344-byte ASN 的表示方式有两种:ASPLAIN(直接写数字,如 AS199509)和 ASDOT(点分格式,如 AS3.10037)。
1.2 为什么需要 AS
互联网不是一台超级路由器管理的全局网络,而是上万个组织各自运营的网络互联而成。AS 划分的三个核心动机:
-
规模:全球 BGP 路由表已超过 100 万条前缀。如果用 OSPF 算全局最短路径,LSDB 会膨胀到任何单台路由器都无法承受。AS 把路由问题分层——AS 内部用 IGP,AS 之间用 BGP。
-
策略独立:中国电信和中国联通之间怎么交换流量,是两家公司之间的商业决策。AS 让每个组织独立制定路由策略,不必把内部拓扑暴露给外部。
-
管理边界:AS 内部怎么跑路由协议是自己的事——用 OSPF 也好,IS-IS 也好,静态路由也好,外部不关心也不需要知道。AS 边界就是管理边界。
1.3 AS 之间的关系
AS 之间的商业关系决定了路由策略。三种基本关系:
| 关系 | 含义 | 路由策略 | 结算 |
|---|---|---|---|
| Transit(提供商-客户) | 客户付费购买互联网可达性 | 提供商向客户通告全表(或默认路由),客户向提供商通告自己的前缀 | 客户付费 |
| Peer(对等互联) | 双方平等交换流量 | 只通告自己的客户前缀给对方,不充当对方的 Transit | 通常免费 |
| Customer(客户-提供商) | Transit 的反向视角 | 同上,只是视角不同 | 同上 |
“Peer 不传 Transit 流量”是互联网经济的基本规则。如果 AS4134 和 AS4837 是 Peer 关系,AS4134 不会把从 AS3356 学到的路由传给 AS4837——否则 AS4837 就免费获得了到全球的 Transit,而 AS4134 的上游提供商 AS3356 也不会答应。这就是 BGP 策略路由的核心驱动力。
二、BGP 协议基础
2.1 BGP 的设计哲学
BGP 和 IGP 有根本性的设计差异。OSPF/IS-IS 追求最短路径,BGP 追求策略可控。这源于一个现实:互联网不是一台路由器,没有全局最优——每个 AS 有自己的利益诉求。
BGP 选择**路径矢量(Path Vector)**而非距离矢量,核心区别是通告的信息从”距离是多少”变成了”经过哪些 AS”。AS_PATH 属性记录了到达目的地经过的所有 AS 编号——收到更新时检查自己的 ASN 是否已在路径中,在则丢弃,从而从根本上避免了路由环路。
| 维度 | 距离矢量(RIP) | 路径矢量(BGP) |
|---|---|---|
| 通告信息 | 目的网络 + 距离 | 目的网络 + AS 路径 + 属性 |
| 防环机制 | 水平分割/毒性逆转(不完整) | AS_PATH 检查(完整) |
| 策略支持 | 几乎没有 | 丰富(属性 + 策略) |
| 收敛速度 | 慢(计数到无穷) | 较慢(策略计算复杂) |
| 规模 | 小网络 | 全球互联网 |
2.2 BGP 会话建立
BGP 运行在 TCP 之上,端口 179。两台路由器先建立 TCP 连接,然后交换 BGP 消息协商参数。BGP 会话分为两种:
- eBGP(External BGP):不同 AS 之间的 BGP 会话,用于交换 AS 间路由信息
- iBGP(Internal BGP):同一 AS 内部的 BGP 会话,用于在 AS 内传播外部路由
# FRR 中配置 eBGP 会话vtyshconfigure terminalrouter bgp 65001 neighbor 10.0.1.2 remote-as 65002 neighbor 10.0.1.2 description "eBGP to AS65002"
# FRR 中配置 iBGP 会话router bgp 65001 neighbor 192.168.1.2 remote-as 65001 neighbor 192.168.1.2 description "iBGP within AS65001" neighbor 192.168.1.2 update-source lo0eBGP 邻居默认要求直连(TTL=1),iBGP 邻居可以跨多跳(TTL=255)。iBGP 通常使用 Loopback 地址建立会话,这样即使物理链路故障,只要 IGP 还能到达对方的 Loopback,BGP 会话就不会断。
2.3 BGP 消息类型
BGP 定义了四种消息类型:
| 消息类型 | 功能 | 触发条件 | 关键字段 |
|---|---|---|---|
| OPEN | 协商 BGP 会话参数 | TCP 连接建立后 | Version, My AS, Hold Time, BGP Identifier |
| KEEPALIVE | 维持会话存活 | 每 1/3 Hold Time 发送一次 | 无(仅 BGP 头部) |
| UPDATE | 通告/撤销路由 | 路由变化时 | NLRI, Path Attributes, Withdrawn Routes |
| NOTIFICATION | 报告错误并关闭会话 | 检测到错误时 | Error Code, Error Subcode, Data |
OPEN 消息协商的 Hold Time 取双方配置的较小值。如果 Hold Time 超时未收到 KEEPALIVE 或 UPDATE,会话断开。
# 查看 BGP 邻居状态show bgp summary
# 典型输出:# Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd# 10.0.1.2 4 65002 125 118 5 0 0 00:45:32 3# 192.168.1.2 4 65001 98 95 5 0 0 00:32:15 3State/PfxRcd 列显示邻居状态——数字表示从该邻居学到的路由前缀数量。如果显示 Idle、Connect、Active 等状态,说明会话未建立成功。
2.4 BGP 有限状态机
BGP 会话建立过程遵循一个六状态有限状态机:
各状态含义:
| 状态 | 含义 | 关键动作 |
|---|---|---|
| Idle | 初始状态 | 拒绝所有入站连接,等待 Start 事件 |
| Connect | 等待 TCP 连接建立 | 主动发起 TCP 连接 |
| Active | 主动尝试建立 TCP | ConnectRetry 到期后重试 |
| OpenSent | 已发送 OPEN,等待对方 OPEN | 检查对方 OPEN 参数 |
| OpenConfirm | OPEN 参数协商完成 | 等待 KEEPALIVE 确认 |
| Established | 会话建立完成 | 可以交换 UPDATE/KEEPALIVE |
如果 BGP 邻居一直卡在 Active 状态,最常见的原因是 TCP 连接无法建立——检查路由是否可达、ACL 是否放行 TCP 179、对端是否配置了正确的 neighbor 语句。如果卡在 Idle,通常是配置错误或被对端拒绝。
三、BGP 路由通告与属性
3.1 NLRI 与路由通告
BGP UPDATE 消息是路由信息交换的核心载体。一条 UPDATE 消息可以通告可达路由、撤销不可达路由,或两者兼有:
BGP UPDATE 消息结构:┌──────────────────────────┐│ Withdrawn Routes Length │ ← 撤销路由的长度├──────────────────────────┤│ Withdrawn Routes │ ← 被撤销的前缀列表├──────────────────────────┤│ Total Path Attr Length │ ← 路径属性总长度├──────────────────────────┤│ Path Attributes │ ← 路径属性(AS_PATH, NEXT_HOP 等)├──────────────────────────┤│ NLRI │ ← 网络层可达信息(通告的前缀)└──────────────────────────┘NLRI(Network Layer Reachability Information)就是被通告的 IP 前缀,比如 203.119.0.0/22。路径属性描述了到达该前缀的”路径特征”——经过哪些 AS、下一跳是谁、优先级多高。
3.2 AS_PATH 属性
AS_PATH 是 BGP 最重要的属性之一,记录了路由更新经过的所有 AS。它有两个核心功能:防环和选路。
AS_PATH 有两种类型段:
| 类型 | 含义 | 示例 |
|---|---|---|
| AS_SEQUENCE | 有序的 AS 列表 | 65003 65002 65001(按经过顺序排列) |
| AS_SET | 无序的 AS 集合 | {65001, 65002}(聚合路由时使用) |
防环机制:路由器收到 UPDATE 后,检查 AS_PATH 中是否包含自己的 ASN。如果在,说明这条路由曾经经过自己,丢弃——环路不可能形成。
# 模拟 AS_PATH 防环检查def check_as_path(local_asn, as_path): """检查 AS_PATH 是否包含本地 ASN""" if local_asn in as_path: print(f"AS_PATH {as_path} 包含本地 ASN {local_asn},丢弃该路由") return False print(f"AS_PATH {as_path} 不包含本地 ASN {local_asn},接受该路由") return True
# AS65001 收到一条 AS_PATH 为 65003 65002 65001 的路由check_as_path(65001, [65003, 65002, 65001])# 输出:AS_PATH [65003, 65002, 65001] 包含本地 ASN 65001,丢弃该路由
# AS65004 收到同一条路由check_as_path(65004, [65003, 65002, 65001])# 输出:AS_PATH [65003, 65002, 65001] 不包含本地 ASN 65004,接受该路由eBGP 路由器向外部邻居通告路由时,会在 AS_PATH 前部 prepend 自己的 ASN。iBGP 路由器向同一 AS 内的邻居通告时,不修改 AS_PATH——因为还没出 AS 边界。
3.3 NEXT_HOP 属性
NEXT_HOP 指示到达目的前缀的下一跳 IP 地址。eBGP 和 iBGP 对 NEXT_HOP 的处理规则不同:
- eBGP:NEXT_HOP 设为发送 UPDATE 的路由器的接口 IP(即 eBGP 邻居地址)
- iBGP:NEXT_HOP 不改变——从 eBGP 学到的路由传给 iBGP 邻居时,NEXT_HOP 仍然是 eBGP 邻居的地址
这会导致一个问题:iBGP 路由器收到的路由 NEXT_HOP 指向外部 AS 的路由器,如果 IGP 不知道怎么到达那个 NEXT_HOP,路由就不可用。解决方案是 next-hop-self:
# 在 AS 边界路由器上配置 next-hop-selfrouter bgp 65001 neighbor 192.168.1.2 remote-as 65001 neighbor 192.168.1.2 next-hop-self # 将 NEXT_HOP 改为自己的 Loopback 地址 # 这样 iBGP 邻居通过 IGP 就能到达下一跳3.4 LOCAL_PREF 属性
LOCAL_PREF(本地优先级)是 AS 内部使用的属性,只在 iBGP 之间传递,不会传出 AS。它决定 AS 的出口选择——LOCAL_PREF 越高越优先。
# 配置 LOCAL_PREF 策略router bgp 65001 neighbor 10.0.1.2 route-map SET-LOCALPREF in
route-map SET-LOCALPREF permit 10 match ip address prefix-list PREFERRED set local-preference 200route-map SET-LOCALPREF permit 20 set local-preference 100典型场景:AS65001 同时从 AS65002 和 AS65003 学到同一前缀,但和 AS65002 的链路带宽更大。给从 AS65002 学到的路由设置更高的 LOCAL_PREF,AS 内所有路由器都会优先选择 AS65002 作为出口。
3.5 MED 属性
MED(Multi-Exit Discriminator,多出口鉴别器)用于告诉邻居 AS:“如果你有多个出口到我这个 AS,请优先走 MED 值较小的那个出口”。MED 是唯一一个可以影响邻居 AS 选路决策的属性。
| 维度 | LOCAL_PREF | MED |
|---|---|---|
| 作用方向 | 影响 AS 内出口选择 | 影响邻居 AS 入口选择 |
| 传递范围 | AS 内(iBGP 传递,eBGP 不传) | AS 间(eBGP 传递给邻居 AS) |
| 默认值 | 100 | 0 |
| 选路规则 | 越大越优先 | 越小越优先 |
| 配置位置 | 入方向 route-map | 出方向 route-map |
# 配置 MED 策略router bgp 65001 neighbor 10.0.1.2 route-map SET-MED out
route-map SET-MED permit 10 match ip address prefix-list PRIMARY-PREFIX set metric 50 # MED = 50,优先选择route-map SET-MED permit 20 set metric 200 # MED = 200,次优选择MED 只在两个 AS 有多个互联点时才有意义。如果 AS65001 和 AS65002 只有一个互联点,MED 没有作用——因为只有一个入口。MED 的比较默认只在来自同一 AS 的多条路径之间进行(bgp always-compare-med 可以改变这一行为)。
3.6 Community 属性
Community 是一个 32 位的标记,格式为 AA:NN(前 16 位是 ASN,后 16 位是编号),用于对路由进行分组和策略实施。它不像 AS_PATH 或 LOCAL_PREF 直接影响选路,而是作为一种”标签”让路由策略更灵活。
# 配置 Communityrouter bgp 65001 network 192.168.1.0/24 route-map ADD-COMMUNITY
route-map ADD-COMMUNITY permit 10 set community 65001:100 65001:200
# 常见 Well-known Community# no-export: 不传出 AS(不发给 eBGP 邻居)# no-advertise: 不通告给任何 BGP 邻居# local-AS: 不传出本地 AS(Confederation 内使用)# internet: 正常通告(默认行为)
# 基于 Community 过滤路由ip community-list standard BLOCKED permit 65001:666route-map FILTER-BLOCKED deny 10 match community BLOCKEDroute-map FILTER-BLOCKED permit 20
router bgp 65002 neighbor 10.0.1.1 route-map FILTER-BLOCKED inCommunity 的典型应用:上游运营商告诉客户”标记了 65001:100 的路由我给你做优先处理”,客户只需在出方向设置 Community,无需和上游协商复杂的策略。
3.7 其他属性
| 属性 | 类别 | 含义 |
|---|---|---|
| ORIGIN | Well-known mandatory | 路由来源:IGP(i)、EGP(e)、Incomplete(?) |
| ATOMIC_AGGREGATE | Well-known discretionary | 标记该路由是聚合路由,丢失了路径细节 |
| AGGREGATOR | Optional transitive | 记录执行聚合的 ASN 和路由器 IP |
| ORIGINATOR_ID | Optional non-transitive | RR 场景中记录路由的发起者(防环) |
| CLUSTER_LIST | Optional non-transitive | RR 场景中记录经过的 Cluster(防环) |
ORIGIN 属性的选路优先级:IGP > EGP > Incomplete。network 命令通告的路由 ORIGIN 为 IGP,redistribute 引入的路由 ORIGIN 为 Incomplete。
四、BGP 选路决策
4.1 13 步选路过程
当 BGP 路由器从多个邻居学到同一前缀的多条路径时,需要选择最优路径。BGP 的选路过程是一个 13 步的逐级比较——每一步只比较一个属性,能分出胜负就停止,不能则进入下一步:
| 步骤 | 比较属性 | 优先规则 | 说明 |
|---|---|---|---|
| 1 | Weight | 越大越优先 | Cisco 私有属性,FRR 不支持 |
| 2 | LOCAL_PREF | 越大越优先 | AS 内出口选择 |
| 3 | 本地生成的路由 | 优先 | network 或 aggregate-address 生成的 |
| 4 | AS_PATH | 越短越优先 | 经过 AS 数量少的优先 |
| 5 | ORIGIN | IGP > EGP > Incomplete | 路由来源可信度 |
| 6 | MED | 越小越优先 | 多出口选择 |
| 7 | eBGP > iBGP | eBGP 优先 | 外部路由优先于内部路由 |
| 8 | IGP 下一跳代价 | 越小越优先 | 到 NEXT_HOP 的 IGP 代价 |
| 9 | 最长 BGP 存活时间 | 越长越优先 | 老路由优先 |
| 10 | Router ID | 越小越优先 | 邻居的 BGP Router ID |
| 11 | 邻居 IP | 越小越优先 | 邻居的 IP 地址 |
| 12 | Cluster List 长度 | 越短越优先 | RR 场景 |
| 13 | Neighbor IP | 越小越优先 | 最终决胜 |
实际工作中,前 8 步覆盖了绝大多数选路场景。步骤 9-13 基本只在理论中出现——如果选路需要走到第 11 步才分出胜负,说明配置有问题。
4.2 选路实战示例
假设 AS65001 从三个方向学到前缀 203.0.113.0/24:
R3 的选路过程:
- 步骤2 LOCAL_PREF:路径1(200)= 路径2(200)> 路径3(100),路径3 淘汰
- 步骤4 AS_PATH:路径1 长度 1 < 路径2 长度 2,路径2 淘汰
- 结果:选择路径1,经 AS65002 到达
如果路径1 和路径2 的 AS_PATH 长度相同,则进入步骤5 比较 ORIGIN,再到步骤6 比较 MED——MED 小的优先。
4.3 路由过滤与策略
BGP 的策略能力很大程度上来自路由过滤。FRR 支持三种过滤机制:
# === prefix-list:基于前缀匹配 ===ip prefix-list CUSTOMER seq 5 permit 192.168.1.0/24 le 32ip prefix-list CUSTOMER seq 10 permit 10.0.0.0/8 le 24ip prefix-list BOGON seq 5 deny 0.0.0.0/8 le 32ip prefix-list BOGON seq 10 deny 10.0.0.0/8 le 32ip prefix-list BOGON seq 15 deny 127.0.0.0/8 le 32ip prefix-list BOGON seq 20 deny 169.254.0.0/16 le 32ip prefix-list BOGON seq 25 deny 192.168.0.0/16 le 32ip prefix-list BOGON seq 30 deny 224.0.0.0/4 le 32ip prefix-list BOGON seq 35 permit 0.0.0.0/0 le 32
# === route-map:组合匹配和动作 ===route-map FROM-CUSTOMER permit 10 match ip address prefix-list CUSTOMER set local-preference 150 set community 65001:100route-map FROM-CUSTOMER deny 20 match ip address prefix-list BOGON
# === 应用到 BGP 邻居 ===router bgp 65001 neighbor 10.0.1.2 route-map FROM-CUSTOMER in neighbor 10.0.1.2 filter-list 1 out # filter-list 基于 AS_PATH 正则匹配
ip as-path access-list 1 permit ^65001$# 只通告起源于本 AS 的路由Bogon 前缀(RFC 1918 私有地址、未分配地址空间等)绝不能出现在全球 BGP 路由表中。但现实中,由于配置错误或恶意行为,Bogon 路由泄漏时有发生。入方向过滤 Bogon 是 BGP 安全的基本功——在 BGP安全与路由信任 中会深入讨论路由泄漏防护。
五、eBGP 与 iBGP
5.1 eBGP 会话
eBGP 会话连接不同 AS 的边界路由器。默认行为:
- TTL = 1:eBGP 消息只能传一跳,要求邻居直连
- 修改 NEXT_HOP:向 eBGP 邻居通告路由时,NEXT_HOP 设为自己的出口地址
- 修改 AS_PATH:向 eBGP 邻居通告路由时,在 AS_PATH 前部 prepend 自己的 ASN
如果 eBGP 邻居不在直连链路上(比如通过 IGP 可达的远端邻居),需要配置 multihop:
# eBGP multihop 配置router bgp 65001 neighbor 192.168.100.2 remote-as 65002 neighbor 192.168.100.2 ebgp-multihop 5 neighbor 192.168.100.2 update-source lo0 # TTL 设为 5,使用 Loopback 接口建立会话5.2 iBGP 全互联问题
iBGP 有一个核心规则:从 iBGP 邻居学到的路由不再传给其他 iBGP 邻居(iBGP 水平分割)。这条规则的目的是防止 AS 内部路由环路——因为没有 ASN 变化来标识路径。
但这带来了一个扩展性问题:AS 内有 N 台边界路由器时,需要 N×(N-1)/2 条 iBGP 会话才能保证所有路由器学到完整路由。10 台路由器需要 45 条会话,100 台需要 4950 条——不可接受。
两种解决方案:
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| Route Reflector | 指定 RR 服务器,允许其反射 iBGP 路由 | 扩展性好,配置简单 | RR 是单点故障,需要冗余 |
| Confederation | 将 AS 内部划分为子 AS,子 AS 间用 eBGP | 不需要额外设备 | 配置复杂,子 AS 间 AS_PATH 处理特殊 |
5.3 Route Reflector 详解
Route Reflector(RR)是解决 iBGP 全互联的标准方案。RR 打破 iBGP 水平分割规则,允许将从 iBGP 客户端学到的路由反射给其他 iBGP 客户端。
RR 的反射规则:
| 从谁学到 | 反射给 Client | 反射给 Non-Client | 反射给 eBGP |
|---|---|---|---|
| Client | |||
| Non-Client | |||
| eBGP |
RR 防环机制使用两个属性:
- ORIGINATOR_ID:记录路由的发起者(Client 的 Router ID),收到自己 ORIGINATOR_ID 的路由时丢弃
- CLUSTER_LIST:记录路由经过的 RR Cluster ID,重复则丢弃
5.4 FRR 配置示例
AS65001 内部用 RR,外部和 AS65002、AS65003 互联:
# ===== RR1 配置(Route Reflector)=====vtyshconfigure terminalinterface lo0 ip address 1.1.1.1/32router ospf ospf router-id 1.1.1.1 network 10.0.0.0/8 area 0router bgp 65001 bgp router-id 1.1.1.1 neighbor 2.2.2.2 remote-as 65001 neighbor 2.2.2.2 update-source lo0 neighbor 2.2.2.2 route-reflector-client neighbor 3.3.3.3 remote-as 65001 neighbor 3.3.3.3 update-source lo0 neighbor 3.3.3.3 route-reflector-client neighbor 4.4.4.4 remote-as 65001 # 另一个 RR,全互联 neighbor 4.4.4.4 update-source lo0 network 192.168.1.0/24
# ===== Client 1 配置(边界路由器,连接 AS65002)=====vtyshconfigure terminalinterface lo0 ip address 2.2.2.2/32router ospf ospf router-id 2.2.2.2 network 10.0.0.0/8 area 0router bgp 65001 bgp router-id 2.2.2.2 neighbor 1.1.1.1 remote-as 65001 neighbor 1.1.1.1 update-source lo0 neighbor 1.1.1.1 next-hop-self neighbor 10.0.12.2 remote-as 65002 neighbor 10.0.12.2 route-map FROM-65002 in network 192.168.2.0/24
route-map FROM-65002 permit 10 set local-preference 200
# ===== Client 2 配置(边界路由器,连接 AS65003)=====vtyshconfigure terminalinterface lo0 ip address 3.3.3.3/32router ospf ospf router-id 3.3.3.3 network 10.0.0.0/8 area 0router bgp 65001 bgp router-id 3.3.3.3 neighbor 1.1.1.1 remote-as 65001 neighbor 1.1.1.1 update-source lo0 neighbor 1.1.1.1 next-hop-self neighbor 10.0.13.2 remote-as 65003 network 192.168.3.0/24验证配置:
# 在 RR1 上查看 BGP 邻居show bgp summary
# 查看路由的详细属性(注意 Originator 和 Cluster list)show bgp ipv4 unicast 192.168.2.0/24 detail# BGP routing table entry for 192.168.2.0/24# 65002# 10.0.12.2 from 2.2.2.2 (2.2.2.2)# Origin IGP, localpref 200, valid, internal, best# Originator: 2.2.2.2, Cluster list: 1.1.1.1六、BGP 路由聚合
6.1 聚合的必要性
全球 BGP 路由表的增长是互联网面临的核心扩展性挑战:
| 年份 | BGP 路由表条目 | 增长率 |
|---|---|---|
| 2000 | ~100,000 | — |
| 2010 | ~350,000 | 250% |
| 2020 | ~860,000 | 146% |
| 2025 | ~1,100,000 | 28% |
每条路由都需要被全球所有 BGP 路由器存储和处理。路由聚合通过将多条具体前缀合并为一条更宽泛的前缀,减少路由表规模。比如 256 条 /24 前缀可以聚合为一条 /16 前缀——路由表条目减少 255 条。
6.2 聚合方法
BGP 聚合使用 aggregate-address 命令:
# 基本聚合(summary-only:抑制具体路由)router bgp 65001 aggregate-address 192.168.0.0/16 summary-only # 只通告 192.168.0.0/16,不通告其下的具体 /24 前缀
# 聚合但保留部分具体路由(suppress-map)router bgp 65001 aggregate-address 192.168.0.0/16 suppress-map SUPPRESS-THESE
ip prefix-list SUPPRESS-LIST seq 5 permit 192.168.1.0/24ip prefix-list SUPPRESS-LIST seq 10 permit 192.168.2.0/24route-map SUPPRESS-THESE permit 10 match ip address prefix-list SUPPRESS-LIST# 被匹配的前缀被抑制,其余具体前缀正常通告
# 聚合路由的属性继承router bgp 65001 aggregate-address 192.168.0.0/16 as-set # as-set: 使用 AS_SET 记录被聚合路由的 AS_PATH # 不加 as-set: 聚合路由的 AS_PATH 为空,丢失路径信息6.3 聚合与路由泄漏
聚合是一把双刃剑——减少了路由表规模,但也可能引入问题:
# 场景:AS65001 聚合 192.168.0.0/16# 但其中 192.168.100.0/24 实际属于 AS65002(已被 AS65001 收回)# 如果用 summary-only,192.168.100.0/24 的更精确路由不会通告# 流量会被错误地导向 AS65001
# 解决方案:使用 suppress-map 保留需要精确通告的前缀router bgp 65001 aggregate-address 192.168.0.0/16 summary-only network 192.168.100.0/24 # 单独通告,利用最长前缀匹配优先
# 或者使用 route-map 设置 Communityrouter bgp 65001 aggregate-address 192.168.0.0/16 attribute-map AGG-ATTR
route-map AGG-ATTR permit 10 set community no-export # 聚合路由不传出 AS,具体路由正常通告BGP 选路遵循最长前缀匹配原则——更具体的前缀总是优先于聚合路由。这意味着即使聚合路由指向错误的方向,只要更精确的路由正确,流量仍然会走正确的路径。聚合路由相当于”兜底路由”。
七、动手实践:GNS3 搭建 BGP 拓扑
7.1 实验拓扑
搭建一个 3 个 AS 的拓扑,模拟运营商互联场景:
7.2 FRR 配置
# ===== R1 配置(AS65001 内部路由器)=====vtyshconfigure terminalinterface eth0 ip address 10.0.12.1/24interface lo0 ip address 1.1.1.1/32router ospf ospf router-id 1.1.1.1 network 10.0.12.0/24 area 0 network 1.1.1.1/32 area 0router bgp 65001 bgp router-id 1.1.1.1 neighbor 2.2.2.2 remote-as 65001 neighbor 2.2.2.2 update-source lo0 neighbor 2.2.2.2 next-hop-self network 172.16.1.0/24
# ===== R2 配置(AS65001 边界路由器)=====vtyshconfigure terminalinterface eth0 ip address 10.0.12.2/24interface eth1 ip address 10.0.23.2/24interface lo0 ip address 2.2.2.2/32router ospf ospf router-id 2.2.2.2 network 10.0.12.0/24 area 0 network 2.2.2.2/32 area 0router bgp 65001 bgp router-id 2.2.2.2 neighbor 1.1.1.1 remote-as 65001 neighbor 1.1.1.1 update-source lo0 neighbor 1.1.1.1 next-hop-self neighbor 10.0.23.3 remote-as 65002 neighbor 10.0.23.3 route-map FROM-65002 in network 172.16.1.0/24 network 10.0.12.0/24
route-map FROM-65002 permit 10 set local-preference 200
### 7.3 观察 BGP 选路
```bash# 在 R1 上查看 BGP 路由表show bgp ipv4 unicast# traceroute 追踪跨 AS 路径traceroute 172.16.2.1
# 用 tcpdump 抓 BGP UPDATEsudo tcpdump -i eth1 -vv tcp port 179 and 'tcp[tcpflags] & tcp-push != 0'
# 用 Wireshark 过滤 BGP UPDATE:bgp.message_type == 2
# 查看 BGP 路由的详细属性show bgp ipv4 unicast 172.16.2.0/24 detail
---
## 参考
- [RFC 1918](https://www.rfc-editor.org/rfc/rfc1918) — Address Allocation for Private Internets- [IANA Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/)支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






