防御icmp泛洪需“拦、限、关”三层:先用iptables/nftables raw表快速拦截外网echo-request,再按源ip限速,最后调优内核参数如ignore_broadcasts=1、rp_filter=1等,禁用icmp_echo_ignore_all不可替代前两步。

新手防御ICMP泛洪攻击,不能只关一个开关,得从“拦、限、关”三层入手:先在网卡收包前快速丢弃无效流量,再对合法ICMP请求限速,最后才考虑是否禁用响应。单纯设 net.ipv4.icmp_echo_ignore_all = 1 只让系统不回Ping,但攻击包照收、软中断照满、CPU照爆——这不叫防护,只是藏起来。
一、优先用iptables/nftables在raw表做快速拦截
这是最有效的第一步。raw表在连接跟踪(conntrack)之前执行,能避免无效ICMP包触发后续内核处理开销。
- 禁止外网接口接收echo-request(推荐,保留内网调试能力):
iptables -t raw -A PREROUTING -i eth0 -p icmp --icmp-type 8 -j DROP - 若用nftables(较新系统默认):
nft add rule ip filter prerouting iifname "eth0" ip protocol icmp icmp type echo-request drop - 注意:不要只加在INPUT链,必须用
-t raw或prerouting位置,否则规则生效太晚,起不到减压作用
二、对允许的ICMP请求做速率限制
有些场景需要保留基础ICMP功能(如路径MTU发现、运维排查),那就限制频率,不让攻击者刷量。
- 每秒最多1个echo-request,突发允许3个:
iptables -A INPUT -p icmp --icmp-type 8 -m hashlimit --hashlimit-above 1/sec --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name icmp_limit -j DROP - 搭配一条放行规则放在DROP之前:
iptables -A INPUT -p icmp --icmp-type 8 -m hashlimit --hashlimit-above 1/sec --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name icmp_limit -j ACCEPT - 限速目标建议按源IP区分(
--hashlimit-mode srcip),避免一个攻击者占满配额,影响其他正常用户
三、配合内核参数加固底层行为
这些参数不防洪,但能堵住辅助攻击路径、降低被利用风险,适合写进/etc/sysctl.conf并执行sysctl -p生效。
- 忽略广播Ping(防SMURF类放大攻击):
net.ipv4.icmp_echo_ignore_broadcasts = 1 - 忽略伪造错误响应(防部分畸形ICMP干扰):
net.ipv4.icmp_ignore_bogus_error_responses = 1 - 关闭ICMP重定向收发(防路由劫持):
net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0 - 开启反向路径过滤(防IP欺骗):
net.ipv4.conf.all.rp_filter = 1
四、别踩这些常见坑
新手容易以为“禁Ping=安全”,结果反而埋下隐患或白忙一场。
- 不要全局禁用所有ICMP类型——目的不可达(type 3)、超时(type 11)等是TCP连接和路径MTU发现必需的,全禁可能导致HTTPS连接失败、大文件传输卡顿
- 不要依赖
icmp_echo_ignore_all = 1当主防线,它不减少网络接口压力,实测5万pps攻击下CPU软中断仍可飙到90% - 防火墙规则要指定接口(如
-i eth0),否则可能误杀本地环回(lo)或内网通信,导致监控、容器间调用异常 - 改完sysctl参数务必用
sysctl -p加载,且检查是否真生效:sysctl net.ipv4.icmp_echo_ignore_broadcasts











