0. 课件来源
在多协议 IGP 共存的网络中(如 OSPF + IS-IS),需要在边界设备做双向注入(mutual redistribution)以实现全网互通。单点注入简单但无冗余,双点注入有冗余但存在路由回灌、环路、次优路径三大陷阱。本节从注入本质出发,逐步推导出 tag + 过滤的经典防环方案。
1. 注入(Redistribution)的本质
注入的本质:把路由从源协议"拷贝"进目的协议,目的协议将此路由以外部路由形式通告。
注入的三个关键认知:
1. 进入目的协议 = "进入目的协议的进程"
源:OSPF 目的:IS-IS
isis 1
import-route ospf 1 ← OSPF 路由进入 IS-IS 进程,成为 IS-IS Level-2 外部路由
2. 注入方向 = "进入" + "出"
源 → 目的:import-route(进入目的协议)
目的通告:以外部路由形式(ASE / ISIS-L2 External)
3. 双向 = 互不替代
单向注入只能解决一方访问另一方,双向才能完全互通2. 从单点到双点:冗余之痛
2.1 拓扑
IS-IS 域 OSPF 域
┌─────────┐ ┌──────────────┐
│ AR1 │ │ AR4 ── AR5 │
│ (L2) │ │ OSPF │
└────┬────┘ └──┬───┬───────┘
│ │ │
┌────┴────────────────────────────┤ │
│ AR2 (L1-2) AR3 (L1-2) │ │
│ 广义 ASBR 广义 ASBR│ │
└─────────────────────────────────┘ │
10.1.123.0/24 (IS-IS) 10.1.34.0/24 (OSPF)AR2 和 AR3 同时运行 IS-IS 和 OSPF,称为广义 ASBR(类似 ABR 角色但不是 ABR)。
2.2 单点双向注入(有通无冗余)
# 仅 AR2 上做双向注入
AR2:
isis 1
import-route ospf 1 # OSPF → IS-IS
ospf 1
import-route isis 1 # IS-IS → OSPFAR1 能 ping 通 AR5(55.5.5.5),但 AR2 故障则全网分裂。
2.3 双点双向注入(有冗余有环路)
# AR2 和 AR3 同时双点双向注入
AR2 + AR3:
ospf 1
import-route isis 1
isis 1
import-route ospf 1结果:AR1 ping 55.5.5.5 → 100% 丢包。Traceroute 显示 AR2 ↔ AR3 无限循环:
<AR1> tracert -a 10.1.1.1 55.5.5.5
1 10.1.123.2 → AR2
2 10.1.24.4 → AR4
3 10.1.34.3 → AR3
4 10.1.123.2 → 回到 AR2 ← 环路!
5 10.1.24.4 → AR4
6 10.1.34.3 → AR3
7 10.1.123.2 → 死循环……3. 路由回灌:环路的根因
3.1 回灌机制
【AR2 视角】
A: IS-IS 有 55.5.5.0/24(来自 AR5 → AR4 → OSPF → 注入 IS-IS)
B: AR2 把 IS-IS 路由注入 OSPF → 产生 T5 55.5.5.0/24(ADV=AR2)
C: AR3 在 OSPF 学到 T5 55.5.5.0/24 → AR3 把它注入 IS-IS
D: AR2 在 IS-IS 又看到 55.5.5.0/24(AR3 注入的)→ 又注入 OSPF
E: ⋯⋯死循环
本质:路由在 A↔B 两个协议之间形成闭环,不断"灌回来"。3.2 三种危害
| 问题 | 表现 |
|---|---|
| 路由回灌 | 同一条路由在两个协议间无限循环注入 |
| 次优路径 | 路由走了弯路(本应走 OSPF 直连,却绕了 IS-IS) |
| 环路 | 数据包在两个协议间来回转发、永不达 |
4. 防御方案演进
4.1 方案一:入向路由过滤(粗暴但有害)
# AR2 IS-IS 入向过滤 55.5.5.0/24
→ 如果 AR3-AR4 链路故障,AR3 本可走 AR2 到达 55.5.5.5
→ 但因为过滤了 55.5.5.0/24,AR3 永远学不到→ 冗余性丢失⚠️ 入向过滤的致命缺陷
过滤导致冗余路径被切断。一旦主路径故障,备用路径不可用。
4.2 方案二:ACL 过滤(静态不灵活)
AR2:
route-policy i-o deny node 10
if-match acl 2000 # 匹配 55.5.5.0/24 就丢弃
route-policy i-o permit node 20
ospf 1
import-route isis 1 route-policy i-o问题:每增加一条外部路由,ACL 就要跟着改 → 无法自动适应路由变化。
4.3 方案三:Tag + 过滤(经典正解)
核心思路:给注入进来的路由打标签(tag),对方看到这个标签就知道"这是我之前发出去的,不能再灌回来"。
AR2:
ospf 1
import-route isis 1 route-policy i-o
isis 1
import-route ospf 1 route-policy o-i
AR3:
ospf 1
import-route isis 1 route-policy i-o
isis 1
import-route ospf 1 route-policy o-iTag 流转逻辑
AR2 侧:
IS-IS 路由 → 注入 OSPF 时打 tag=10(o-i apply tag 10)
OSPF 路由 → 注入 IS-IS 时 → 如果 tag=10 就拒绝(i-o if-match tag 10 deny)
→ 否则放行并打 tag=20(i-o apply tag 20)
AR3 侧(对称设计):
IS-IS 路由 → 注入 OSPF 时打 tag=30(o-i apply tag 30)
OSPF 路由 → 注入 IS-IS 时 → 如果 tag=30 就拒绝(i-o if-match tag 30 deny)
→ 否则放行并打 tag=40(i-o apply tag 40)完整配置
# ─── AR2 ───
route-policy i-o deny node 10
if-match tag 10 # 拒绝 tag=10 的(AR2 自己发出去的)
route-policy i-o permit node 20
apply tag 40 # 放行并打 tag=40
route-policy o-i deny node 10
if-match tag 40 # 拒绝 tag=40 的(AR3 那边灌回来的)
route-policy o-i permit node 20
apply tag 10 # 放行并打 tag=10
ospf 1
import-route isis 1 route-policy i-o
isis 1
import-route ospf 1 route-policy o-i
# ─── AR3(对称) ───
route-policy i-o deny node 10
if-match tag 30
route-policy i-o permit node 20
apply tag 20
route-policy o-i deny node 10
if-match tag 20
route-policy o-i permit node 20
apply tag 30
ospf 1
import-route isis 1 route-policy i-o
isis 1
import-route ospf 1 route-policy o-i验证
[AR4] dis ospf lsdb ase
Type LinkState ID AdvRouter Age Metric
External 10.1.123.0 2.2.2.2 31 1 ← AR2 注入的
External 10.1.123.0 3.3.3.3 7 1 ← AR3 注入的
External 55.5.5.0 5.5.5.5 1376 1 ← 原始 ASBR 的!只有一条!
# 55.5.5.0/24 的 Type 5 只有 AR5 产生 → 回灌已防住5. 次优路径问题
即使防住了回灌环路,次优路径仍可能存在。
5.1 次优场景
AR1 访问 55.5.5.5:
路径A:AR1 → (IS-IS) → AR2 → (OSPF) → AR4 → AR5 # 最优
路径B:AR1 → (IS-IS) → AR3 → (OSPF) → AR4 → AR5 # 绕路
如果 AR3 发出的 T5 因为某些原因被 OSPF 优先选上,
AR1 可能走 AR3 而非更优的 AR2。5.2 防御:preference(优先级)调整
# 在 AR2 上将注入过来的 OSPF 外部路由优先级调低
isis 1
preference 20 route-policy from-ospf # IS-IS 的默认优先级 = 15
# 让 OSPF 域内计算优于注入路由
# OSPF internal = 10, IS-IS internal = 15, OSPF ASE = 1506. 双点双向注入最佳实践
| 原则 | 具体做法 |
|---|---|
| Tag 唯一标识 | 每台广义 ASBR 用不同的 tag 标识"我发出去的路由" |
| 入向 deny | 注入前检查 tag,发现是自己的 tag → deny |
| 出向 apply | 放行的路由打上新 tag,标识来源 |
| 对称配置 | 两台广义 ASBR 使用对称的 tag 方案 |
| preference 辅助 | 调整协议优先级避免次优路径 |
7. 易混淆点与考前速记
| 对比项 | 结论 |
|---|---|
| 注入方向 | import-route 进入目的协议,源协议不受影响 |
| 单点注入 | 有通无冗余,ASBR 故障全网分裂 |
| 双点注入 | 有冗余有风险,不防环必然环路 |
| 路由回灌 | 同一条路由在 A↔B 间循环注入,根因:无来源标记 |
| 入向过滤 | 粗鲁方案,切断冗余路径,不推荐 |
| ACL 过滤 | 静态方案,路由变更时 ACL 需手动维护,不推荐 |
| Tag + 过滤(推荐) | 给注入路由打 tag,对方识别 tag 后拒绝回灌 |
| Tag 逻辑 | deny if-match tag(我发出去的) → permit + apply tag(新的) |
| 每个 ASBR 用不同 tag | AR2: tag 10/40;AR3: tag 20/30 |
| 次优路径 | 可通过 preference 调整优先级缓解 |
考前速记 5 条:
注入本质:路由从源协议"拷贝"进目的协议,以外部路由通告单点有通无冗余,双点有冗余有风险(路由回灌+环路+次优)路由回灌 = A↔B 循环注入,原因是没有来源标记tag+过滤:每条注入路由打 tag → 看到自己的 tag 就 deny对称设计:AR2 tag 10/40 ↔ AR3 tag 20/30,preference 辅助防次优
🤖 AI 伴学
让 AI 用一个生动的故事帮你理解双点双向注入和 tag 防环:
"请用'两座城市建了两座桥'来类比双点双向注入:OSPF 和 IS-IS 是两座被一条河隔开的城市。单点注入就是只建了一座桥(AR2),人(路由)能从 OSPF 城走到 IS-IS 城,也能走回去,但桥塌了(AR2 故障)两城就断了。双点注入就是同时建了两座桥(AR2 + AR3),有了冗余,但出现了'鬼打墙'问题:一个人从 IS-IS 城走 AR2 桥来到 OSPF 城,到了 OSPF 城后又从 AR3 桥走回 IS-IS 城,再走 AR2 桥去 OSPF 城……无限循环(路由回灌环路)。tag+过滤的解决方案就是:每个人过桥时在背上贴一个贴纸(tag),桥对面的守桥人看到贴纸上的编号(tag 值)如果是自己城市发出去的,就不让他过桥(deny)。对称设计让每座桥各管各的 tag 编号(AR2: 10/40, AR3: 20/30),互相不冲突。"
