第31篇:路由环路是怎么产生的——TTL 与跳数限制

一、写在前面

前面的文章我们学了路由表、静态路由、浮动静态路由。但如果路由表配置不当,可能会出现一个很危险的情况——路由环路(Routing Loop)

路由环路:数据包在两个或多个路由器之间来回转发,永远到不了目的地,直到 TTL 归零被丢弃。

它和二层环路(广播风暴)的后果不同,但同样严重——带宽被浪费、CPU 飙升、用户断网。


二、路由环路是怎么产生的?

2.1 根本原因

路由表信息不一致——两台路由器互相认为对方是去某个目的地的下一跳。

2.2 经典场景

   R1                      R2
GE0/0/0 ──── 10.0.12.0/24 ──── GE0/0/刻意
    │                          │
    └── 192.168.1.0/24         └── 10.0.2.0/24

配置错误:

# R1 的错误配置
[R1] ip route-static 10.0.2.0 255.255.255.0 10.0.12.2   ← 正确

# R2 的错误配置——回程路由指回了 R1!
[R2] ip route-static 192.168.1.0 255.255.255.0 10.0.12.1  ← 错误!

结果:当 R2 收到一个目的 IP 是 192.168.1.1 的数据包时:

R2 查表:192.168.1.0/24 → 下一跳 10.0.12.1(R1)
  → 发给 R1
R1 查表:192.168.1.1 是直连网段
  → ??? 
  → 如果 R1 的直连路由因某些原因失效了(比如端口 Down),
    但静态路由还在...
  → 但更典型的是:R1 自己的静态路由错误

真正的环路场景是这样的:

经典的两路由器互相"踢皮球":

# R1 的错误配置——去 10.0.2.0 走 R2
[R1] ip route-static 10.0.2.0 255.255.255.0 10.0.12.2

# R2 的错误配置——去 10.0.2.0 也走回 R1
[R2] ip route-static 10.0.2.0 255.255.255.0 10.0.12.1

R1 → "去 10.0.2.0?发给 R2" R2 → "去 10.0.2.0?发给 R1" R1 → "去 10.0.2.0?发给 R2" R2 → "去 10.0.2.0?发给 R1" ...

永无止境!


三、TTL——防止环路无限循环的最后防线

3.1 TTL 是什么

TTL(Time To Live,生存时间) 是 IP 报文头中的一个字段,初始值由发送方设置(通常 64、128、255)。

IP 包头中的 TTL 字段(8 bit,取值 0~255)

3.2 TTL 如何防止环路

数据包从 PC-A 发出,TTL=64
    │
    ├─ R1 收到:TTL-1 = 63,转发给 R2
    │
    ├─ R2 收到:TTL-1 = 62,转发给 R1(环路!)
    │
    ├─ R1 收到:TTL-1 = 61,转发给 R2
    │
    ├─ ...(不断循环,每次 TTL-1)
    │
    └─ TTL=1 时,最后一个路由器发现 TTL-1=0
       → 丢弃数据包
       → 向源 IP 发送 ICMP Time Exceeded 报文

3.3 用 tracert 验证 TTL

C:\> tracert 10.0.2.1
  1     1 ms     2 ms     1 ms  10.0.12.1       ← TTL=64→63
  2     2 ms     2 ms     2 ms  10.0.12.2       ← TTL=63→62
  3     2 ms     3 ms     2 ms  10.0.12.1       ← 又回来了!(环路!)
  4     3 ms     3 ms     3 ms  10.0.12.2
  5     3 ms     *         3 ms  10.0.12.1
  ...
 30     *         *         *     Request timed out.

当 tracert 的 TTL 耗尽后还是到达不了目的地,你就发现环路存在。


四、常见的路由环路场景

4.1 静态路由配错

R1 → 去 10.0.2.0 的下一跳写成了 R1 自己的另一个接口
或 R1 和 R2 互相把下一跳指向对方

解决:仔细检查每一条静态路由的下一跳地址。

4.2 路由重分发引起的环路

当两个路由协议(如 OSPF ←→ RIP)互相重分发时,A 学到路由又传回给 B,B 再传回给 A。

解决:使用路由标记(Tag)和路由策略过滤。

4.3 缺省路由环路

R1: 0.0.0.0/0 → R2
R2: 0.0.0.0/0 → R1

所有去外网的流量在 R1 和 R2 之间来回跑。

解决:下游路由器用默认路由指向上游,但上游路由器不能把默认路由指回下游。


五、环路检测与排查

5.1 从现象反推

现象 可能原因
ping 超时但 tracert 看到重复的跳数 路由环路
CPU 升高但端口流量并不大 环路导致 CPU 处理大量 TTL 耗尽包
ping 的 TTL 值越来越小且跳数重复 环路
某网段间歇性通断 动态路由协议的环路收敛中

5.2 排查命令

# 1. 跟踪路由路径
<Router> tracert 10.0.2.1
  traceroute to 10.0.2.1 (10.0.2.1), max hops: 30
  1  10.0.12.1    1 ms
  2  10.0.12.2    1 ms    ← 去 R2
  3  10.0.12.1    1 ms    ← 回来了!→ 环路
  4  10.0.12.2    1 ms
  ...

# 2. 查路由表,看异常
<Router> display ip routing-table 10.0.2.0

# 3. 查看静态路由配置
<Router> display current-configuration | include ip route-static

# 4. 查看 TTL 统计
<Router> display ip statistics
  Input:   packets
  Output:  packets
  Dropped: 1000 ...      ← Dropped 过多可能环路了

六、防止路由环路的措施

措施 针对场景
TTL 最终的物理防线(所有场景)
路由协议自己的防环机制 水平分割 / 毒性反转 / 最大跳数
路由策略 控制重分发时的路由方向
路由标记(Tag) 防止重分发后路由回灌
BFD 快速检测 链路故障后快速收敛,减少环路窗口
Loop-Free Alternate(LFA) MPLS/IP FRR 技术

七、思考

  1. 路由环路是怎么产生的?与二层环路(广播风暴)的根本区别是什么?
  2. TTL 的初始值常见有哪几个?TTL=1 时路由器会怎么处理?
  3. 如果两台路由器的默认路由互相指向对方,会有什么后果?
  4. tracert 命令输出中看到重复的 IP 地址,说明什么?
  5. 除了 TTL,还有哪些技术可以防止路由环路?
  6. 静态路由环路的排查步骤应该是什么?

下篇预告:第32篇《策略路由PBR_不按路由表走》——掌握策略路由PBR的配置,实现基于策略的流量调度。