Iptables重复封禁同一IP致规则溢出及CPU负载过高的排查与应急咨询
Iptables重复封禁同一IP致规则溢出及CPU负载过高的排查与应急咨询
兄弟,这种情况真的太闹心了——同一个IP反复被添加DROP规则,iptables堆了5万多条,直接把CPU干到负载爆炸,甚至要重启服务器才能缓解。咱们一步步来解决你的问题:
为什么同一IP会被重复封禁?
最常见的原因是封禁逻辑没做重复检查:比如你用的脚本/工具每次检测到这个IP的请求,就直接执行iptables -A INPUT -s [IP] -j DROP,完全没先查这个IP是不是已经在规则里了。哪怕IP已经被DROP了,只要脚本还能检测到请求(比如规则顺序不对,DROP规则排在后面,前面的规则先匹配到请求并记录,导致脚本误以为IP还能访问),就会不断加新规则。
另外也有可能是规则生效范围不对:比如你把DROP规则加在了自定义链里,但实际请求走的是INPUT主链,导致IP的请求还是能触发检测脚本,进而重复添加规则。
怎么排查是哪个进程/脚本在操作iptables?
给你几个实用方法:
- 用auditd监控iptables命令:
先安装auditd(比如apt install auditd或yum install auditd),然后执行:
之后查看审计日志(通常在auditctl -w /sbin/iptables -p x/var/log/audit/audit.log),里面会记录所有调用iptables的进程ID、脚本路径等信息。 - 检查定时任务:
看看有没有定时执行的脚本在搞事情:crontab -l # 查看当前用户的定时任务 ls -la /etc/cron* /var/spool/cron/ # 检查系统级定时任务 - 查看系统日志:
翻一下/var/log/syslog或/var/log/messages,搜索“iptables”关键词,看看有没有相关脚本的执行记录。 - 实时监控进程:
用top或htop盯着CPU高的进程,或者用strace追踪可疑进程的系统调用,看是不是在调用iptables。
如何临时禁用iptables应急?
如果已经快扛不住了,先应急处理:
方法1:直接停止iptables服务
- 用systemd的系统(CentOS7+/Ubuntu16+):
# 如果用的是原生iptables服务 systemctl stop iptables systemctl disable iptables # 可选,防止开机自动启动 # 如果用的是firewalld(CentOS默认) systemctl stop firewalld systemctl disable firewalld - 老版本SysVinit系统:
service iptables stop chkconfig iptables off
方法2:清空现有规则(保留服务但临时放行所有流量)
如果不想停服务,先清空所有规则应急:
iptables -F # 清空所有链的规则 iptables -X # 删除所有自定义链 iptables -P INPUT ACCEPT # 设置INPUT链默认策略为ACCEPT iptables -P FORWARD ACCEPT # 设置FORWARD链默认策略为ACCEPT iptables -P OUTPUT ACCEPT # 设置OUTPUT链默认策略为ACCEPT
额外建议
- 清理重复规则:先把现有5万多条重复规则清理掉,比如用脚本提取所有DROP规则的IP,去重后重新添加,再删除旧规则。
- 换用智能封禁工具:比如fail2ban,它会自动跟踪已封禁的IP,不会重复添加规则,还能设置封禁时长,比自己写的脚本靠谱多了。
备注:内容来源于stack exchange,提问作者MaxIT
相关产品推荐
相关产品推荐

