关键词:路由重分发、环路防制、Route Tag、Filter-Policy、路由回环、双向重分发、路由标记
第100篇:路由重分发环路的防制:Tag 与 Filter-Policy
一、引言
在第99篇中,我们学习了 OSPF 与 BGP 之间的路由重分发原理。重分发打通了不同路由协议之间的壁垒,但也引入了一个致命风险——路由环路。
当网络中同时存在从 OSPF 到 BGP 和从 BGP 到 OSPF 的双向重分发时,路由可能从一个协议注入另一个协议,再经另一台路由器"回流"到原协议,形成环路。这种环路不像二层环路那样会产生广播风暴,但它会导致路由表震荡、次优路径和流量黑洞,排查难度极高。
本文深入探讨使用 Tag(路由标记)和 Filter-Policy(过滤策略)两种核心技术来防制路由重分发环路。
二、核心概念
2.1 双向重分发环路场景

环路路径:
| 步骤 | 路由 | 协议 | 说明 |
|---|---|---|---|
| ① | 10.1.1.0/24 | OSPF → BGP | ASBR1 将 OSPF 路由注入 BGP |
| ② | 10.1.1.0/24 | BGP | R2 将路由传播给 ASBR2 |
| ③ | 10.1.1.0/24 | BGP → OSPF | ASBR2 将 BGP 路由注入 OSPF |
| ④ | 10.1.1.0/24 | OSPF | ASBR1 再次收到自己的路由 → 环路 |
2.2 路由 Tag 机制
Tag 是附加在路由上的一个 32 位标记值,用于标识路由的来源或属性:
| 协议 | Tag 字段 | 取值范围 |
|---|---|---|
| OSPF | External Tag | 0-4294967295 |
| BGP | Community(等价) | AS:Value |
| IS-IS | External Tag | 0-4294967295 |
| 静态路由 | Tag | 0-4294967295 |
Tag 防环原理:
- 在重分发时将路由标记为"已重分发"
- 在反向重分发时检查 Tag,如果是"已重分发"的路由则拒绝注入

2.3 Filter-Policy 机制
Filter-Policy 通过前缀列表或 ACL 在路由注入点进行过滤:
| 类型 | 方向 | 说明 |
|---|---|---|
| import filter | 入向 | 过滤接收到的路由 |
| export filter | 出向 | 过滤发出的路由 |
| import-route filter | 重分发 | 过滤重分发时的路由 |
三、技术细节
3.1 OSPF Tag 防环
工作原理:
OSPF 的外部路由(Type-5/Type-7 LSA)携带一个 32 位的 External Tag 字段。当从 BGP 注入 OSPF 时,可以设置这个 Tag 值。反向从 OSPF 注入 BGP 时,检查 Tag 值,如果匹配则拒绝。
# === ASBR1 配置 ===
# OSPF → BGP:设置 Tag
route-policy OSPF2BGP permit node 10
if-match ip-address prefix-list INTERNAL-NET
apply tag 100
# 注入 BGP 时将 Tag 设置为 100
# BGP → OSPF:检查 Tag
route-policy BGP2OSPF deny node 10
if-match tag 100
# Tag 为 100 的路由拒绝注入 OSPF
route-policy BGP2OSPF permit node 20
# 其他路由允许注入
ospf 1
import-route bgp 100 route-policy BGP2OSPF
bgp 100
import-route ospf 1 route-policy OSPF2BGP
ip prefix-list INTERNAL-NET seq 10 permit 10.0.0.0 8
Tag 传播特性:
| 场景 | Tag 是否保留 | 说明 |
|---|---|---|
| BGP 路由注入 OSPF | 是 | BGP 的 Tag 映射为 OSPF External Tag |
| OSPF 路由注入 BGP | 是 | OSPF 的 Tag 保留在 BGP 路由中 |
| OSPF 区域内传递 | 是 | Type-5 LSA 的 Tag 在 AS 内透传 |
| OSPF 区域间传递 | 是 | Type-5 LSA 跨越区域时 Tag 保留 |
3.2 Filter-Policy 防环
Filter-Policy 通过前缀列表精确控制哪些路由可以被重分发:
# === ASBR1:只将本地 OSPF 路由注入 BGP ===
# 定义本地 OSPF 路由前缀
ip prefix-list LOCAL-OSPF seq 10 permit 10.1.0.0 16
ip prefix-list LOCAL-OSPF seq 20 permit 10.2.0.0 16
# OSPF → BGP:只注入本地前缀
bgp 100
import-route ospf 1 route-policy LOCAL2BGP
route-policy LOCAL2BGP permit node 10
if-match ip-address prefix-list LOCAL-OSPF
route-policy LOCAL2BGP deny node 20
# 不在本地前缀列表中的 OSPF 路由不注入 BGP
# === ASBR2:只将特定 BGP 路由注入 OSPF ===
ip prefix-list BGP-NEEDED seq 10 permit 0.0.0.0 0
ip prefix-list BGP-NEEDED seq 20 permit 192.168.0.0 16
ospf 1
import-route bgp 100 route-policy BGP2OSPF-FILTER
route-policy BGP2OSPF-FILTER permit node 10
if-match ip-address prefix-list BGP-NEEDED
route-policy BGP2OSPF-FILTER deny node 20
# 只注入默认路由和特定前缀
3.3 Tag 与 Filter-Policy 组合使用
在生产环境中,通常同时使用 Tag 和 Filter-Policy 实现双重防护:
# === ASBR1 完整配置 ===
# 前缀列表定义
ip prefix-list LOCAL-NET seq 10 permit 10.1.0.0 16
ip prefix-list EXTERNAL-NET seq 10 permit 0.0.0.0 0
ip prefix-list EXTERNAL-NET seq 20 permit 192.168.0.0 16
# OSPF → BGP:标记本地路由
route-policy LOCAL2BGP permit node 10
if-match ip-address prefix-list LOCAL-NET
apply tag 1001
apply community 100:LOCAL additive
route-policy LOCAL2BGP deny node 20
bgp 100
import-route ospf 1 route-policy LOCAL2BGP
# BGP → OSPF:Tag 过滤 + 前缀过滤
route-policy BGP2OSPF deny node 10
if-match tag 1001
# 拒绝 Tag 为 1001 的路由(本端注入的)
route-policy BGP2OSPF deny node 20
if-match tag 1002
# 拒绝 Tag 为 1002 的路由(对端注入的)
route-policy BGP2OSPF permit node 30
if-match ip-address prefix-list EXTERNAL-NET
apply cost 100
route-policy BGP2OSPF deny node 40
# 默认拒绝
ospf 1
import-route bgp 100 route-policy BGP2OSPF
# === ASBR2 完整配置 ===
# 使用不同的 Tag 值
# OSPF → BGP
route-policy LOCAL2BGP permit node 10
if-match ip-address prefix-list LOCAL-NET
apply tag 1002
apply community 100:LOCAL additive
bgp 100
import-route ospf 1 route-policy LOCAL2BGP
# BGP → OSPF:拒绝所有 Tag 标记的路由
route-policy BGP2OSPF deny node 10
if-match tag 1001
route-policy BGP2OSPF deny node 20
if-match tag 1002
route-policy BGP2OSPF permit node 30
if-match ip-address prefix-list EXTERNAL-NET
3.4 BGP 方向的路由过滤
在 BGP 方向,可以使用多种过滤机制防止路由回流:
# === 方法1:Prefix-list 过滤 ===
ip prefix-list NO-REDISTRIBUTE seq 10 deny 10.0.0.0 8
ip prefix-list NO-REDISTRIBUTE seq 20 permit 0.0.0.0 0
route-policy BGP-EXPORT deny node 10
if-match ip-address prefix-list INTERNAL-RANGES
route-policy BGP-EXPORT permit node 20
# === 方法2:AS_PATH 过滤 ===
# 拒绝来自本 AS 的路由(防止路由回环)
ip as-path-filter 1 deny ^100.*100
# 拒绝 AS_PATH 中出现两次 100 的路由
route-policy BGP-IMPORT deny node 10
if-match as-path-filter 1
route-policy BGP-IMPORT permit node 20
# === 方法3:Community 标记 ===
ip community-filter basic LOCAL-COMM permit 100:LOCAL
route-policy BGP-IMPORT deny node 10
if-match community-filter LOCAL-COMM
route-policy BGP-IMPORT permit node 20
四、实战配置/案例分析
4.1 场景一:双 ASBR 双向重分发的完整防环设计
网络拓扑:

完整配置:
# ============================================
# ASBR1 配置
# ============================================
# 前缀列表
ip prefix-list ASBR1-LOCAL seq 10 permit 10.1.0.0 16
ip prefix-list ASBR1-ALLOW-IN seq 10 permit 0.0.0.0 0
ip prefix-list ASBR1-ALLOW-IN seq 20 permit 192.168.0.0 16
# OSPF → BGP:标记本地路由
route-policy ASBR1-OSPF2BGP permit node 10
if-match ip-address prefix-list ASBR1-LOCAL
apply tag 1001
apply community 100:ASBR1 additive
route-policy ASBR1-OSPF2BGP deny node 20
bgp 100
import-route ospf 1 route-policy ASBR1-OSPF2BGP
# BGP → OSPF:Tag 防护 + 前缀过滤
route-policy ASBR1-BGP2OSPF deny node 10
if-match tag 1001
# 拒绝自己的路由回流
route-policy ASBR1-BGP2OSPF deny node 20
if-match tag 1002
# 拒绝 ASBR2 的路由回流
route-policy ASBR1-BGP2OSPF permit node 30
if-match ip-address prefix-list ASBR1-ALLOW-IN
apply cost 100
route-policy ASBR1-BGP2OSPF deny node 40
ospf 1
import-route bgp 100 route-policy ASBR1-BGP2OSPF
# ============================================
# ASBR2 配置
# ============================================
ip prefix-list ASBR2-LOCAL seq 10 permit 10.2.0.0 16
ip prefix-list ASBR2-ALLOW-IN seq 10 permit 0.0.0.0 0
ip prefix-list ASBR2-ALLOW-IN seq 20 permit 203.0.113.0 24
route-policy ASBR2-OSPF2BGP permit node 10
if-match ip-address prefix-list ASBR2-LOCAL
apply tag 1002
apply community 100:ASBR2 additive
route-policy ASBR2-OSPF2BGP deny node 20
bgp 100
import-route ospf 1 route-policy ASBR2-OSPF2BGP
route-policy ASBR2-BGP2OSPF deny node 10
if-match tag 1001
route-policy ASBR2-BGP2OSPF deny node 20
if-match tag 1002
route-policy ASBR2-BGP2OSPF permit node 30
if-match ip-address prefix-list ASBR2-ALLOW-IN
apply cost 100
route-policy ASBR2-BGP2OSPF deny node 40
ospf 1
import-route bgp 100 route-policy ASBR2-BGP2OSPF
4.2 故障案例:Tag 未正确传递导致的环路
故障现象:配置了 Tag 防环,但环路仍然发生。
排查步骤:
# 步骤1:确认 Tag 是否正确设置
display bgp routing-table 10.1.1.0 24 verbose
# 查看 Tag 字段是否为 1001
# 步骤2:确认 Tag 在 BGP 传递中是否保留
display bgp routing-table peer 10.255.0.2 received-routes 10.1.1.0 24
# 在 ASBR2 上查看从 ASBR1 收到的路由 Tag
# 步骤3:确认 Tag 在 BGP→OSPF 注入时是否保留
display ospf routing 10.1.1.0 24
# 查看 OSPF External Tag 字段
# 根因分析:
# 可能的原因1:BGP 路由策略清除了 Tag
# display current-configuration configuration route-policy
# 发现某条策略使用了 apply tag 0 或 apply tag none
# 可能的原因2:iBGP 传递中 Tag 被清除
# 检查 RR 上的策略是否清除 Tag
# 可能的原因3:Tag 值冲突
# 不同 ASBR 使用了相同的 Tag 值
修复方案:
# 修复1:确保策略不修改 Tag
route-policy CHECKED permit node 10
if-match community-filter SOME-COMM
apply local-preference 200
# 不使用 apply tag,保留原有 Tag
# 修复2:确保各 ASBR 使用不同的 Tag
# ASBR1: Tag = 1001
# ASBR2: Tag = 1002
# ASBR3: Tag = 1003
# 按 ASBR 编号分配 Tag,避免冲突
4.3 故障案例:Filter-Policy 配置顺序错误
故障现象:Filter-Policy 没有按预期过滤路由。
# 错误配置
route-policy BGP2OSPF permit node 10
# 缺少 if-match 条件,所有路由在此节点放行
route-policy BGP2OSPF deny node 20
if-match tag 1001
# 这个 deny 节点永远不会匹配(node 10 已放行全部)
# 修复:正确配置节点顺序
route-policy BGP2OSPF deny node 10
if-match tag 1001
# deny 节点在前
route-policy BGP2OSPF permit node 20
if-match ip-address prefix-list ALLOWED
# 只放行允许的前缀
route-policy BGP2OSPF deny node 30
# 默认拒绝
五、总结
| 防环方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| OSPF Tag | 标记路由来源 | 简单易用,OSPF 原生支持 | 仅适用于外部路由 |
| Filter-Policy | 前缀精确过滤 | 精确控制,灵活度高 | 需要维护前缀列表 |
| BGP Community | 标记路由属性 | 传递灵活,支持正则匹配 | 需要额外配置 |
| AS_PATH 过滤 | 检测 AS 环路 | BGP 原生防环 | 仅适用于 eBGP |
| 组合策略 | 多层防护 | 最高安全性 | 配置复杂度最高 |
路由重分发防环最佳实践: 1. 避免不必要的双向重分发,能单向解决就不双向 2. 使用 Tag 作为第一道防线,为每台 ASBR 分配唯一 Tag 3. 使用 Filter-Policy 作为第二道防线,精确控制重分发范围 4. 在 BGP 侧使用 Community 标记作为辅助防环手段 5. 定期验证 Tag 传递路径,确保标记未被清除 6. 所有重分发策略必须有文档记录,包括设计意图和 Tag 分配
思考
- 为什么 OSPF Tag 只能用于外部路由(Type-5 LSA),不能用于内部路由?如果内部路由也需要标记,应该使用什么方法?
- 在多 ASBR 场景中,如果 Tag 值管理不当会发生什么问题?如何建立 Tag 编号管理制度?
- Filter-Policy 的 deny 节点和 permit 节点的顺序为什么如此重要?能否举例说明顺序错误导致的后果?
下篇预告:第101篇:二层环路与 STP 保护机制再探讨