两类报文的分工
ICMP 报文分两大类:差错报文由路由器或目标主机在转发失败时自动发出(目的不可达、超时、重定向等),查询报文由应用主动发起并等待应答(Echo 请求与应答、时间戳)。二者的处理规则不同——差错报文必然携带原始数据报的头部与至少 8 字节载荷,这一特性既是排障线索,也是信息泄露面。
基本信息
| 协议号 | IPv4 中 IP 协议号 1;IPv6 中 ICMPv6 为 58 |
|---|---|
| 差错报文 | v4:3 不可达、4 源抑制(已废弃)、5 重定向、11 超时、12 参数错误 |
| 查询报文 | v4:8/0 Echo、13/14 时间戳;v6:128/129 Echo、133-137 NDP |
| 生成限制 | 差错报文不会对差错报文、广播与多播再生成,避免风暴 |
典型使用场景
- 排障时区分「端口没开」与「主机不可达」:前者回类型 3 代码 3,后者代码 0 或 1
- 判断 PMTU 问题:类型 3 代码 4(需要分片)是 MTU 黑洞的直接证据
- 用 traceroute 定位路径:依赖的正是类型 11 超时差错报文
- 设计防火墙策略:差错报文必须放行,查询报文可限速,重定向与源路由应丢弃
类别对照
| 类别 | 典型类型 | 触发方 |
|---|---|---|
| 差错报文 | 3 不可达、5 重定向、11 超时、12 参数错误 | 路由器或目标主机 |
| 查询报文 | 8/0 Echo、13/14 时间戳 | 应用主动发起 |
| v6 差错 | 1 不可达、2 包太大、3 超时、4 参数错误 | 路由器或主机 |
| v6 查询 | 128/129 Echo、133-137 NDP | 主机(NDP 为协议运作必需) |
按类型抓包
按类型抓包
tcpdump -nn 'icmp[0] == 3' -c 10 # 目的不可达,含代码位
tcpdump -nn 'icmp[0] == 3 and icmp[1] == 4' -c 5 # 只看「需要分片」(PMTU 线索)
tcpdump -nn 'icmp[0] == 11' -c 10 # 超时,traceroute 依赖它
tcpdump -nn 'icmp[0] == 5' -c 5 # 重定向,内网出现需警惕
tcpdump -nn 'icmp6' -c 10 # IPv6 侧整体观察差错报文携带原始头部加 8 字节载荷,因此外部扫描者可用它探测内网结构,这就是「ICMP 信息泄露」的原理;这也是老式防火墙倾向全面禁 ICMP 的由来,但代价是掐断了 PMTUD。
IPv4 的「源抑制」类型 4 早已废弃,现代实现不会发出,看到它多半是老旧设备或伪造流量,不影响正常路径。