Computer NetworkNotes

第 06 章:ICMP 与排障

zjc 于 2026-01-06 发布

这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 ICMP 常被当作 ping 的附属协议,但它同时承担错误报告、路径探测、PMTUD 和 IPv6 邻居发现等功能。错误地全面封禁 ICMP 会带来两类问题:排障困难,以及大包传输的 PMTUD 失效。

6.1 ICMP 的定位

ICMP 巐藏在 IP 协议号 1 中,用于传递控制和错误消息。它不是应用数据的承载协议。

常见类型:

类型 名称 场景
0 / 8 Echo Reply / Request ping
3 Destination Unreachable 网络、主机、端口不可达
5 Redirect 建议更优路径
11 Time Exceeded TTL 超时,traceroute
12 Parameter Problem 包头错误
3 / Code 4 Fragmentation Needed PMTUD

6.2 ping

基础用法:

ping 10.20.1.10
ping -c 100 10.20.1.10
ping -i 0.2 10.20.1.10
ping -6 2001:db8::1

指定不分片并测试载荷:

ping -M do -s 1472 10.20.1.10

计算:

ICMP Header 8 字节
IP Header 20 字节
1472 + 8 + 20 = 1500

如果 1472 不通而 1400 通,路径 MTU 可能小于 1500。

6.3 丢包解读

ping 结果需要区分三种情况:

  1. 全部不通:路由、地址、ACL 或目标不可达;
  2. 部分丢包:链路质量、队列拥塞、限速或负载不均;
  3. 请求正常但应用失败:传输层或应用层问题。

注意:

  1. 目标可能禁 ping 但服务可用;
  2. 中间设备可能限速 ICMP;
  3. ping 通不代表端口开放;
  4. ping 的 RTT 低不代表高负载时服务不排队;
  5. ICMP 走的路径可能与业务流量不同。

6.4 Destination Unreachable

常见代码:

Code 含义
0 Network Unreachable
1 Host Unreachable
2 Protocol Unreachable
3 Port Unreachable
4 Fragmentation Needed
5 Source Route Failed

例如 UDP 访问未监听端口,通常触发 Port Unreachable。路由器找不到路径时返回 Network/Host Unreachable。

6.5 traceroute

用法:

traceroute 10.20.1.10
traceroute -I 10.20.1.10
traceroute -T -p 443 10.20.1.10
traceroute -U -p 53 10.20.1.10
mtr -rw -c 100 10.20.1.10

协议差异:

方式 特点
UDP 默认,可能被策略影响
ICMP 常用,可能被限速
TCP 更接近业务端口路径

mtr 更适合观察持续趋势:

mtr -rw -c 200 -T -P 443 10.20.1.10

6.6 PMTUD

路径 MTU 发现依赖 ICMP Fragmentation Needed。

错误做法:

防火墙禁用所有 ICMP
  -> 路由器无法返回分片要求
     -> 发送方持续重传大包
        -> TCP 大流量卡住

处理:

  1. 放行 ICMP Type 3 Code 4;
  2. 正确设置隧道和 overlay MTU;
  3. TCP 启用 MSS Clamp;
  4. 云主机、容器、负载均衡和安全设备统一评估;
  5. ping -M dotracepath 验证。

Linux 相关:

sysctl net.ipv4.ip_no_pmtu_disc
sysctl net.ipv4.tcp_mtu_probing

6.7 ICMP 与安全

风险:

  1. ICMP 泛洪;
  2. 主机探测;
  3. 重定向攻击;
  4. 大包放大;
  5. 隐藏侧信道。

安全策略:

  1. 允许必要的错误报告;
  2. 限制 Echo 速率;
  3. 不盲目放行所有 ICMP;
  4. 关闭不必要的 ICMP Redirect 接受;
  5. 云安全组分层治理;
  6. 保留运维专用探测通道。

Linux 示例:

sysctl net.ipv4.conf.all.accept_redirects
sysctl net.ipv4.conf.all.send_redirects

6.8 排障案例

案例 1:服务访问超时

ping <target>
mtr -rw -c 100 <target>
traceroute -T -p 443 <target>
curl -v --connect-timeout 3 https://target

结论判断:

  1. ping 不通且 traceroute 断在网关:本机路由或网关问题;
  2. ping 通但 TCP 不通:安全组、防火墙或服务未监听;
  3. 某跳后延迟暴涨:路径或出口异常;
  4. 丢包与业务高峰相关:拥塞或带宽打满;
  5. 只有 IPv6 异常:AAAA、NDP 或防火墙策略。

案例 2:小包正常,大包失败

ping -M do -s 1472 <target>
ping -M do -s 1400 <target>
tracepath <target>

优先检查 VPN、隧道、云 overlay 和容器网络的 MTU。

本章小结

ICMP 承担错误报告、连通性测试、路径探测和 PMTUD 等关键功能。ping 是基础工具,但必须结合端口探测、应用请求和 traceroute 判断问题层级。全面封禁 ICMP 可能造成大包传输异常和排障困难,应精确放行错误报告类消息。

思考题

  1. ping 通但 HTTP 超时,可能有哪些原因?
  2. ICMP Type 3 Code 4 在 PMTUD 中有什么作用?
  3. traceroute 中间跳超时是否一定表示故障?
  4. 为什么推荐用 TCP traceroute 验证业务端口路径?
  5. 设计一份兼顾安全和可观测性的 ICMP 策略。