首页/网络/协议速查/屏蔽 ICMP 的后果与放行策略

屏蔽 ICMP 的后果与放行策略

「为了安全禁 ICMP」是流传最广的误区:会破坏 PMTUD、traceroute、诊断能力,安全收益却很低。

协议速查网络更新于 2026-10-13

禁 ICMP 是流传最广的误区

「为了安全把 ICMP 全禁掉」这条经验来自上世纪的 Ping of Death 时代,如今已不成立。全面禁 ICMP 的主要后果是掐断路径 MTU 发现(PMTUD)与差错通知,导致大包被静默丢弃、故障难以定位;而攻击者用 TCP 与 UDP 一样能打进来,安全的实际收益很低。现代做法是:放行差错报文,对 Echo 请求限速。

基本信息

适用平台Linux 防火墙(iptables/nftables/firewalld)、云安全组、网络设备 ACL
必须放行ICMP 差错类(类型 3、11、12)与 ICMPv6 的类型 1 到 4
v6 额外要求133 到 137 为 NDP 必需,禁掉会导致 IPv6 直接不可用
限速建议对 Echo 请求限速而非全禁,既能排障又能抗扫描

按流量给策略

流量建议原因
Echo 请求(入站)限速放行诊断价值大于风险
ICMP 差错(入站)必须放行PMTUD 与连接失败通知依赖它
ICMP 差错(出站)可限速信息泄露有限,但可减少扫描反馈
重定向与源路由丢弃存在路径篡改风险
ICMPv6 类型 1 到 4 与 133 到 137至少放行这些IPv6 协议运作必需

iptables 参考

iptables 参考
# 放行必要 ICMP 差错,Echo 只做限速
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 5/s -j ACCEPT
iptables -A INPUT -p icmp -j DROP          # 其余 ICMP 丢弃(重定向等在列)
# IPv6 侧务必放行 NDP 与差错,否则 v6 直接不可用
ip6tables -A INPUT -p icmpv6 --icmpv6-type 133:137 -j ACCEPT

典型使用场景

  • 安全基线评审时纠正「一律禁 ping」条款,改为限速加放行差错
  • 云安全组配置:入站放开 Echo 让监控可探活,同时保留差错类
  • 排查 IPv6 不通:最常见原因就是 NDP 相关的 ICMPv6 被 ACL 拦掉
  • 抗扫描策略:限速与延迟应答,而不是直接静默丢弃
现代通行做法:放行 ICMP 差错与 IPv6 必需类型,对 Echo 请求做速率限制;这样既保留排障能力,也不会成为扫描放大器。
在只允许白名单流量的严格环境中也要保留差错报文:把 ICMP 差错当作「无用流量」一并丢弃,会让所有跨 MTU 边界的连接出现难以复现的偶发失败。
限速参数要和监控口径对齐:把 Echo 限速设得过低时,监控探活自身会出现丢包告警,看起来像网络故障,实际是自己设的策略。

易错点

  • 「禁 ping 就等于抗攻击」是错觉:攻击者用 TCP 与 UDP 一样能打,禁 ICMP 反而害了自己的排障与 PMTUD
  • IPv6 环境沿用 IPv4 的 ICMP 规则:NDP 依赖的类型被拦,表现为地址无法解析、邻居状态异常
  • 只放行 Echo 请求不放行超时差错:traceroute 从此断掉,链路类故障失去最重要的定位手段
  • 把 ICMP 限速设得过严:正常排障时大量丢包,反而让人误判链路质量差

数据来源与参考

  • RFC 4890(ICMPv6 过滤建议)
  • RFC 1122

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌