第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 技术 |
七、思考
- 路由环路是怎么产生的?与二层环路(广播风暴)的根本区别是什么?
- TTL 的初始值常见有哪几个?TTL=1 时路由器会怎么处理?
- 如果两台路由器的默认路由互相指向对方,会有什么后果?
tracert命令输出中看到重复的 IP 地址,说明什么?- 除了 TTL,还有哪些技术可以防止路由环路?
- 静态路由环路的排查步骤应该是什么?
下篇预告:第32篇《策略路由PBR_不按路由表走》——掌握策略路由PBR的配置,实现基于策略的流量调度。