ICMP 目的不可达是什么
ICMP 类型 3 是最常见的差错消息:路由器或主机发现报文无法交付时,回送一条目的不可达,并用 Code(代码)说明具体原因。需要注意的是 ICMP 差错只携带原始 IP 头加前 8 字节的数据,因此它是提示而非完整回执;UDP 没有连接概念,很多失败判断都依赖这类消息。
基本信息
| 类型 | 3(Destination Unreachable) |
|---|---|
| 代码范围 | 0-15,常用 0/1/3/4/9/10/13 |
| 封装内容 | 原始 IP 头 + 原始载荷前 8 字节 |
| 关键用途 | 无路由通告、端口探测判定、PMTUD 触发 |
| 规范 | RFC 792、RFC 1812 §4.3.2 |
| 抓包过滤 | icmp[0] == 3 |
典型使用场景
- 确认目标网段是否真的无路由:类型 3 代码 0 表示路由器查不到路由
- traceroute 用 UDP 探测时,靠端口不可达判断探测包已到达目标主机
- 排查 PMTU 黑洞:代码 4 表示「需要分片但 DF 置位」,是路径 MTU 发现的关键信号
- 判断防火墙行为:回送 ICMP 回绝与静默丢弃对上层超时表现完全不同
- 核对 NAT 与策略设备是否改写了差错消息
抓取与观察
抓取与观察
tcpdump -nn -v 'icmp[0] == 3' -c 10 # 抓目的不可达
tcpdump -nn -v 'icmp[0] == 3 and icmp[1] == 4' -c 5 # 只看需要分片(PMTUD)
traceroute 8.8.8.8 | tail -5 # 终点常见端口不可达
ping -M do -s 1472 target # 触发分片需要的提示代码逐值读法
| 代码 | 含义 | 典型成因 |
|---|---|---|
| 0 | 网络不可达 | 路由器无匹配路由或路由被撤销 |
| 1 | 主机不可达 | 目标不在线,或 ARP 解析失败 |
| 2 | 协议不可达 | 目标主机未实现该协议 |
| 3 | 端口不可达 | UDP 打到未监听端口(TCP 用 RST 表示) |
| 4 | 需要分片但 DF 置位 | 报文超过路径 MTU,PMTUD 的核心信号 |
| 6/7 | 目标网络/主机未知 | 路由信息缺失或网络被隔离 |
| 9/10 | 网络/主机被管理禁止 | 被策略明确拒绝,常见于 ACL |
| 13 | 通信被管理过滤 | 防火墙按策略过滤,含端口维度 |
UDP 探测收到「端口不可达」说明包已经到达目标主机并被其协议栈处理,这正是 traceroute 判定终点的依据:最后一跳不再是超时,而是不可达消息。
边界防火墙回送 ICMP 差错会泄露内部策略细节(哪些网段存在、哪些端口被拒),对外通常选择静默丢弃,内网则可保留回绝以便快速排障。