新手防御icmp泛洪需“拦、限、关”三层协同:先用nftables prerouting链快速拦截外网echo-request,再按源ip限速响应,最后调优内核参数如rp_filter=1、ignore_broadcasts=1等加固底层。

调整 Linux 网络栈参数配合 nftables,不是只改防火墙规则,而是让内核处理包的方式更健壮、更抗压。重点不在“拦多少”,而在“少进内核、快判丢弃、不给攻击留缝”。nftables 是执行层,内核参数是底座,两者配合才真正起效。
优先在 prerouting 阶段做原始拦截
ICMP 泛洪的第一波压力来自软中断和协议栈解析开销。必须在连接跟踪(conntrack)之前就干掉恶意包,否则每个 echo-request 都会触发内存分配、哈希查找、日志计数——哪怕最终被 DROP,CPU 也已烧起来。
- 用 nftables raw 表 或 prerouting hook,别用 input 链: nft add rule ip filter prerouting iifname "eth0" ip protocol icmp icmp type echo-request drop
- 若系统启用了 conntrack(默认开启),务必确认规则在
prerouting且表类型为filter或显式指定hook prerouting priority -300,确保早于 nf_conntrack 模块介入 - 保留内网调试能力:可加条件
iifname != "lo" && oifname != "lo",或按源地址范围区分,如ip saddr != 192.168.0.0/16
对允许的 ICMP 做源级限速,而非全盘放行或全盘禁止
设 net.ipv4.icmp_echo_ignore_all = 1 只让内核不回 ping,但包仍进协议栈、占 softirq、刷 dmesg 日志——这是掩耳盗铃。真要兼顾可用性与防护,就得限速。
- 每秒最多响应 3 个 echo-request,突发容错 6 个(够运维排障,挡住扫描器节奏): nft add rule ip filter input ip protocol icmp icmp type echo-request limit rate 3/second burst 6 packets counter accept
- 紧接一条兜底 drop 规则(顺序不能颠倒): nft add rule ip filter input ip protocol icmp icmp type echo-request drop
- 限速建议绑定
srcip模式(nftables 本身不直接支持 hashlimit,需搭配ct或用meter扩展;若需精确 per-IP 限速,推荐用ipset + limit组合或降级用 iptables-hashlimit 做补充)
加固底层行为,堵住辅助攻击路径
这些参数不防洪,但能防止 ICMP 被当成跳板:比如广播 ping 放大、伪造错误响应干扰、重定向劫持路由、IP 欺骗绕过过滤。它们应写入 /etc/sysctl.conf 并运行 sysctl -p 生效。
- 关闭广播 ping(防 SMURF 类攻击): net.ipv4.icmp_echo_ignore_broadcasts = 1
- 忽略明显畸形的 ICMP 错误响应(如非对应连接的 destination-unreachable): net.ipv4.icmp_ignore_bogus_error_responses = 1
- 禁用 ICMP 重定向收发(防中间人篡改路由): net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0
- 开启反向路径过滤(rp_filter=1 启用严格模式,要求入包接口与回包路由一致,有效防 IP 欺骗): net.ipv4.conf.all.rp_filter = 1
验证与持续观察
配置完别就以为万事大吉。得看它是否真生效、有没有副作用。
- 查规则是否加载: nft list chain ip filter prerouting 和 nft list chain ip filter input
- 看内核参数实际值: sysctl net.ipv4.icmp_echo_ignore_broadcasts
- 监控 ICMP 相关软中断: watch -n1 'cat /proc/interrupts | grep -i "eth0.*TxRx\|icmp"'(若数值飙升后回落,说明限速起作用;若持续高位,可能规则未命中或位置太晚)
- 测试时用
ping -f(flood 模式)+tcpdump -i eth0 icmp对比前后包量,确认丢弃发生在网卡驱动后、协议栈前









