fail2ban是Linux系统防御暴力破解并自动封禁IP的首选方案,通过监控auth.log或secure日志识别失败登录,触发iptables动态封禁;需配置jail.local启用sshd、设maxretry=3、findtime=600、bantime=7200,并重启服务验证状态。

Linux系统检测到暴力破解后自动封禁IP,核心是让防火墙规则能“感知”异常行为并即时响应。目前最成熟、易落地的方案是用 fail2ban,它不依赖手动写规则,而是通过分析日志(如 /var/log/auth.log 或 /var/log/secure)识别失败登录,再调用 iptables 动态加黑名单。如果你追求极致轻量或内核级响应,也可用 iptables -m recent 模块做无日志实时频控——但需严格按顺序布防。
用 fail2ban 实现稳定可靠的自动封禁
fail2ban 是生产环境首选,因为它逻辑清晰、配置灵活、支持解封和日志审计,且默认集成 iptables。
- 安装并启用服务:Ubuntu/Debian 执行
sudo apt install fail2ban;CentOS/RHEL 用sudo yum install fail2ban(或dnf) - 复制配置模板:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local,后续只改jail.local - 编辑
/etc/fail2ban/jail.local,确保[sshd]段启用:enabled = truemaxretry = 3(3 次失败即触发)bantime = 7200(封禁 2 小时)findtime = 600(10 分钟窗口期) - 重启服务:
sudo systemctl restart fail2ban - 验证是否生效:
sudo fail2ban-client status sshd可看到当前被封 IP 列表
用 iptables -m recent 做无日志快速拦截
适合对延迟敏感、不想依赖日志轮转或磁盘 I/O 的场景。它在内核 Netfilter 层直接计数,60 秒内 5 次新连接就拉黑,全程不落盘、不调外部程序。
- 规则必须严格按顺序插入 INPUT 链(顺序错则失效):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --rcheck --seconds 300 --hitcount 1 -j DROPiptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --update --seconds 300 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --set --rsource - 注意:
--set必须放在最后一条,否则新连接无法计入统计;--rcheck放最前才能优先丢弃已拉黑 IP - 封禁时长由
--seconds控制(如 300 秒),超时后自动从哈希表移除,无需手动清理
补充防护建议,提升整体鲁棒性
单靠自动封禁不够,还需从源头削弱攻击面:
- 禁用密码登录,强制使用 SSH 密钥:
PasswordAuthentication no和PubkeyAuthentication yes写入/etc/ssh/sshd_config后重载sudo systemctl reload sshd - 限制可信 IP 访问 SSH 端口,例如只允许公司出口 IP:
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT,再加一条DROP拒绝其余所有 - 启用 recidive jail,对反复攻击者延长封禁时间(如 7 天):
[recidive]段设enabled = true和bantime = 604800
手动验证与日常维护要点
部署后别跳过验证环节:
- 模拟攻击测试:从另一台机器用错误密码连 SSH 多次,观察
fail2ban-client status sshd是否出现该 IP - 查 iptables 是否插入了规则:
sudo iptables -L INPUT -n | grep f2b-(fail2ban)或grep ssh_attack(recent) - 手动解封某 IP:
sudo fail2ban-client set sshd unbanip 192.168.1.100 - 定期检查日志:
sudo tail -f /var/log/fail2ban.log或journalctl -u fail2ban -f











