禁 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 限速设得过低时,监控探活自身会出现丢包告警,看起来像网络故障,实际是自己设的策略。