抓 ICMP 在做什么
icmp 原语直接匹配 ICMP 报文,配合下标可以按类型与代码细分:icmp[0] 是类型字段,icmp[1] 是代码字段。类型 8 是回显请求(ping),类型 0 是回显应答,类型 3 是目的不可达,类型 11 是超时。其中类型 3 代码 4 表示需要分片但设置了禁止分片标志,这是排查最大传输单元问题的关键报文。抓 ICMP 既用于确认连通性,也用于发现路径上的丢弃原因。
基本信息
| 全部 ICMP | icmp |
|---|---|
| 按类型 | icmp[icmptype] = icmp-echo 或 icmp[0] = 3 |
| 按类型与代码 | icmp[0] = 3 and icmp[1] = 4 |
| IPv6 对应 | icmp6 与 ip6[40] 取类型字段 |
| 常见类型 | 0 回显应答、3 目的不可达、8 回显请求、11 超时 |
常用类型与含义
| 类型 | 名称 | 典型场景 |
|---|---|---|
| 0 | 回显应答 | ping 回复,确认双向可达 |
| 3 | 目的不可达 | 含网络、主机、端口、协议不可达等多种代码 |
| 3 代码 4 | 需要分片但被禁止 | 路径最大传输单元发现问题,表现为大包不通小包通 |
| 8 | 回显请求 | ping 探测,也常见于监控系统 |
| 11 | 超时 | 跳数超限,常见于路由环路或追踪路由 |
| 13 与 14 | 时间戳请求与应答 | 较少使用,出现时值得确认来源 |
典型使用场景
- 确认某台主机是否可达,以及回包是否经过抓包点
- 排查大包不通:抓类型 3 代码 4 的报文,判断是否分片被拦
- 核对路径:与路由追踪结合,看在哪一跳返回超时
- 确认监控探测行为:识别周期性回显请求的来源
- IPv6 环境排查:ICMPv6 承担邻居发现,屏蔽会导致地址配置异常
常用示例
常用示例
tcpdump -i eth0 -nn icmp # 全部 ICMP
tcpdump -i eth0 -nn 'icmp[icmptype] = icmp-echo' # 只看 ping 请求
tcpdump -i eth0 -nn 'icmp[0] = 3 and icmp[1] = 4' # 需要分片但被禁止
tcpdump -i eth0 -nn 'icmp[0] = 11' # 超时
tcpdump -i eth0 -nn 'icmp and host 10.0.0.9' # 限定对端
tcpdump -i eth0 -nn 'icmp6 and ip6[40] = 128' # IPv6 回显请求ICMP 不可达报文里会携带原始 IP 头与部分数据,用 -X 或交给 Wireshark 可以看到被拒绝的那个报文长什么样,这对判断是哪条连接被拦很关键。
ICMPv6 是 IPv6 的必需组件,邻居发现、地址自动配置都依赖它。排查 IPv6 问题时不要一刀切屏蔽或过滤 ICMPv6,否则会制造出新的故障。
与 MTU 排查配合
与 MTU 排查配合
ping -M do -s 1472 10.0.0.9 # 禁止分片探测,验证路径最大传输单元
tcpdump -i eth0 -nn 'icmp[0] = 3' # 抓不可达报文,看是哪一跳返回
tcpdump -i eth0 -nn -vv 'icmp' -c 5 # 详细模式能解析出更具体的类型说明判读要点
- ping 不通不代表主机不可达,ICMP 常被中间设备限速或直接丢弃
- 大包不通小包通且抓到类型 3 代码 4,几乎可以确定是路径最大传输单元问题
- 回显请求来自固定地址且周期规律,多为监控探测,不必当成异常
- 超时报文说明路径跳数或存在环路,配合路由追踪定位具体节点