防御icmp攻击需分层控制:优先用raw表prerouting链拦截外网echo-request,再在input链按源ip限速(3/sec+burst 6),放行type 3/11等必要icmp类型,并启用rp_filter、禁广播响应等内核参数加固。

防御基于 ICMP 的网络攻击,不能只靠“关 Ping”或一条防火墙规则。核心是分层控制:在包进入内核协议栈前快速过滤,在 INPUT 链按源限速,在内核层堵住伪造和劫持路径。三层配合,才能兼顾安全、可用与排障能力。
优先用 raw 表拦截,避免无效包进协议栈
ICMP 洪水攻击本质是海量报文压垮软中断和 CPU。iptables 的 filter 表(如 INPUT 链)生效较晚,此时包已触发连接跟踪、日志、路由查找等开销。真正高效的做法是在 raw 表的 PREROUTING 链 就丢弃明确不需要的 echo-request:
- 直接丢弃所有外网口的 Ping 请求(保留内网调试):
sudo 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 链;raw 表位置更早,能显著降低 CPU 软中断压力
对允许的 ICMP 请求做源 IP 级限速
完全禁止 ICMP 会影响 MTU 发现、traceroute 和基础连通性诊断。更合理的方式是允许低频请求,但限制单个源 IP 的频率,防扫描也防慢速洪泛:
- 每秒最多 3 个 echo-request,突发允许 6 个(够运维,挡洪峰):
sudo iptables -A INPUT -p icmp --icmp-type 8 -m hashlimit --hashlimit-above 3/sec --hashlimit-burst 6 --hashlimit-mode srcip --hashlimit-name icmp_limit -j ACCEPT - 紧接一条兜底规则(顺序不能颠倒):
sudo iptables -A INPUT -p icmp --icmp-type 8 -j DROP - 必须用
--hashlimit-mode srcip,避免一个攻击者占满全部配额
放行必要 ICMP 类型,保障基础网络功能
ICMP 不只是 Ping。禁掉关键类型会导致路径不可达、超时、重定向等错误无法通知上层,引发静默断连或 TCP 连接卡死:
- 务必放行以下类型(放在 DROP 规则之前):
sudo iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT(destination-unreachable)sudo iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT(time-exceeded,traceroute 所需) - 可选:放行参数问题(type 12),辅助诊断 MTU 或选项异常
- 不建议放行重定向(type 5)、时间戳(type 13/14)等易被滥用类型
配合内核参数加固底层行为
防火墙管“怎么处理包”,内核参数管“系统怎么响应”。仅靠 iptables 无法防御伪造源 IP、广播放大或路由劫持类攻击:
- 编辑
/etc/sysctl.conf,追加以下内容并执行sudo sysctl -p:net.ipv4.icmp_echo_ignore_broadcasts = 1(防 Smurf 放大)net.ipv4.icmp_ignore_bogus_error_responses = 1(忽略畸形错误包)net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0(非网关服务器必须关)net.ipv4.conf.all.rp_filter = 1(反向路径过滤,防 IP 伪造) - 特别注意:
net.ipv4.icmp_echo_ignore_all = 0(保持开启响应),否则限速规则失效,且包仍进协议栈消耗资源











