关键词:路由重分发、环路防制、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 防环原理:

  1. 在重分发时将路由标记为"已重分发"
  2. 在反向重分发时检查 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 双向重分发的完整防环设计

网络拓扑:

场景一:双 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 分配

思考

  1. 为什么 OSPF Tag 只能用于外部路由(Type-5 LSA),不能用于内部路由?如果内部路由也需要标记,应该使用什么方法?
  2. 在多 ASBR 场景中,如果 Tag 值管理不当会发生什么问题?如何建立 Tag 编号管理制度?
  3. Filter-Policy 的 deny 节点和 permit 节点的顺序为什么如此重要?能否举例说明顺序错误导致的后果?

下篇预告:第101篇:二层环路与 STP 保护机制再探讨