ICMP 的攻击面
ICMP 是 IP 层的差错与控制协议,报错、探测、路径发现都靠它。历史上围绕它出现的攻击包括 Smurf 广播放大、Ping of Death 超大包重组崩溃、ICMP 洪水耗尽带宽,以及把数据封装进 Echo 载荷的 ICMP 隧道外逃。现代内核已经修掉了大部分可导致崩溃的缺陷,但放大与隧道这两类风险依然现实存在,出口流量监控中持续异常的 ICMP 值得关注。
基本信息
| 协议位置 | IP 层,协议号 1 |
|---|---|
| IPv6 对应 | ICMPv6,协议号 58,承担邻居发现等必需功能 |
| 常用类型 | 8/0 Echo 请求与应答,11 超时,3 不可达,5 重定向 |
| 典型风险 | 放大攻击、洪水、隐蔽隧道、信息探测 |
| 防护位置 | 边界设备限速、主机防火墙、流量监控 |
常见攻击与防护
| 攻击 | 原理 | 防护 |
|---|---|---|
| Smurf | 伪造源地址向广播地址发 Echo | 禁用定向广播,限制 ICMP 速率 |
| ICMP 洪水 | 海量 Echo 挤占带宽与设备资源 | 限速与流量清洗 |
| Ping of Death | 超大分片重组导致崩溃(历史) | 现代内核已修复 |
| ICMP 隧道 | 把数据藏进载荷外传 | 监测异常的大小与频率 |
| ICMP 重定向 | 伪造重定向改写主机路由表 | 主机侧关闭接受重定向 |
典型使用场景
- 边界策略设计:先明确哪些不可达与超时报文必须放行,否则会引发 PMTU 黑洞
- 主机加固:关闭接受 ICMP 重定向,避免路由表被伪报文改写
- 出口监控:对持续性、高频 ICMP 建立告警,识别被控主机的隐蔽通道
- IPv6 环境:ICMPv6 不能整体封禁,邻居发现依赖它,封禁会导致网络直接不可用
- 应急响应:从 ICMP 载荷大小分布入手,判断是否存在数据外传
检测与加固线索
检测与加固线索
tcpdump -nn -v 'icmp' -c 200 | head -30 # 关注非标准大包与高频单源
cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # 应为 1
sysctl net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.send_redirects # 建议为 0
nstat -az | grep -i icmp把 ICMP 整体封禁是常见的错误加固:路径 MTU 发现依赖 ICMP 不可达报文,封掉后会出现能 ping 通、小文件正常、大文件卡死的疑难故障;IPv6 环境更严重,邻居发现直接依赖 ICMPv6。正确做法是按类型与速率做限制,而不是全禁。