Skip to content

0. 课件来源

在多协议 IGP 共存的网络中(如 OSPF + IS-IS),需要在边界设备做双向注入(mutual redistribution)以实现全网互通。单点注入简单但无冗余,双点注入有冗余但存在路由回灌、环路、次优路径三大陷阱。本节从注入本质出发,逐步推导出 tag + 过滤的经典防环方案。


1. 注入(Redistribution)的本质

注入的本质:把路由从源协议"拷贝"进目的协议,目的协议将此路由以外部路由形式通告。

text
注入的三个关键认知:

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 拓扑

text
     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 单点双向注入(有通无冗余)

text
# 仅 AR2 上做双向注入
AR2:
isis 1
 import-route ospf 1           # OSPF → IS-IS

ospf 1
 import-route isis 1           # IS-IS → OSPF

AR1 能 ping 通 AR5(55.5.5.5),但 AR2 故障则全网分裂

2.3 双点双向注入(有冗余有环路)

text
# 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 无限循环

text
<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 回灌机制

text
【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 方案一:入向路由过滤(粗暴但有害)

text
# 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 过滤(静态不灵活)

text
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),对方看到这个标签就知道"这是我之前发出去的,不能再灌回来"。

text
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-i

Tag 流转逻辑

text
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)

完整配置

text
# ─── 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

验证

text
[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 次优场景

text
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(优先级)调整

text
# 在 AR2 上将注入过来的 OSPF 外部路由优先级调低
isis 1
 preference 20 route-policy from-ospf    # IS-IS 的默认优先级 = 15

# 让 OSPF 域内计算优于注入路由
# OSPF internal = 10, IS-IS internal = 15, OSPF ASE = 150

6. 双点双向注入最佳实践

原则具体做法
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 用不同 tagAR2: tag 10/40;AR3: tag 20/30
次优路径可通过 preference 调整优先级缓解

考前速记 5 条

  1. 注入本质:路由从源协议"拷贝"进目的协议,以外部路由通告
  2. 单点有通无冗余,双点有冗余有风险(路由回灌+环路+次优)
  3. 路由回灌 = A↔B 循环注入,原因是没有来源标记
  4. tag+过滤:每条注入路由打 tag → 看到自己的 tag 就 deny
  5. 对称设计: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),互相不冲突。"

真人撰写written by human