Fail2ban 防御暴力破解需日志监控、规则触发、封禁动作三者协同,不替代强密码但可大幅降低自动化攻击成功率;安装后须手动配置 jail.local,确保 ignoreip、logpath、banaction 三项精准匹配。

用 Fail2ban 防御 Linux 上的暴力破解,核心不是“装上就完事”,而是让 日志监控、规则触发、封禁动作三者严丝合缝。它不替代强密码或密钥登录,但能大幅降低自动化脚本的成功率和干扰量。
安装与基础服务启动
不同系统命令略有差异,但逻辑一致:先确保仓库可用,再安装,最后启用服务。
- Ubuntu/Debian:
sudo apt update && sudo apt install -y fail2ban && sudo systemctl enable --now fail2ban - RHEL/CentOS/Rocky 8+:
sudo dnf install epel-release -y && sudo dnf install -y fail2ban && sudo systemctl enable --now fail2ban - Fedora:
sudo dnf install -y fail2ban && sudo systemctl enable --now fail2ban
安装后服务默认不启用任何防护 jail(监禁规则),必须手动配置才生效。运行 sudo systemctl status fail2ban 确认 Active: active (running),说明后台进程已就绪。
配置文件 怎么写才安全又不误封
永远不要直接编辑 /etc/fail2ban/jail.conf。它会被升级覆盖。正确做法是创建 /etc/fail2ban/jail.local(全局覆盖)或 /etc/fail2ban/jail.d/*.local(模块化管理)。
推荐最小可行配置示例(适配多数场景):
[DEFAULT] ignoreip = 127.0.0.1/8 ::1 192.168.1.100 # 替换为你自己的管理 IP bantime = 1h # 封禁 1 小时(可设为 86400 或 -1 永久)findtime = 10m # 10 分钟内统计失败次数 maxretry = 5 # 累计失败 5 次即触发封禁 backend = systemd # 推荐,比 file 轮询更准、更省资源 <p>[sshd] enabled = true port = ssh # 若改过 SSH 端口,这里写具体数字如 2222 logpath = /var/log/auth.log # Ubuntu/Debian 路径 </p><h1>logpath = /var/log/secure # CentOS/Rocky 路径 </h1><p>filter = sshd banaction = firewallcmd-ipset # 配合 firewalld(Rocky/CentOS 默认)</p><h1>banaction = iptables-multiport # 配合 iptables(旧系统或自定义环境)</h1>
关键点:
ignoreip 必须填你常用登录的公网或内网 IP,否则可能把自己锁在外面;
logpath 必须和真实 SSH 日志路径一致 ,错一条路径,Fail2ban 就完全“看不见”攻击;
banaction 要匹配你实际启用的 防火墙 服务(firewalld 或 iptables),否则封禁动作无效。
验证是否真在工作
配置保存后,重启服务:sudo systemctl restart fail2ban。然后分三步确认:
- 查状态:
sudo fail2ban-client status sshd→ 显示“Number of jail: 1”和“Status: started”表示 jail 已加载 - 看日志:
sudo journalctl -u fail2ban -n 20 -f→ 尝试用错误密码连 SSH,应看到类似“Found xxx.xxx.xxx.xxx”和“Ban xxx.xxx.xxx.xxx”的记录 - 查封禁列表:
sudo fail2ban-client status sshd→ 输出中“Banned IP list”下应出现被封 IP
如果没反应,优先检查:
– sudo tail -20 /var/log/auth.log 是否真有“Failed password”记录;
– sudo fail2ban-client get sshd logpath 输出是否和日志实际路径一致;
– sudo firewall-cmd --list-rich-rules | grep fail2ban(firewalld)或 sudo iptables -L f2b-sshd(iptables)是否生成了规则。
日常运维与应急处理
封禁不是一劳永逸,要兼顾防护与可用性:
- 手动封 IP:
sudo fail2ban-client set sshd banip 203.0.113.42 - 手动 解封:
sudo fail2ban-client set sshd unbanip 203.0.113.42 - 临时停用某 jail:
sudo fail2ban-client stop sshd(排查问题时用) - 查看所有活跃 jail:
sudo fail2ban-client status
注意:解封后 IP 不会自动重试登录,但下次再触发规则仍会被封。若发现某 IP 频繁误触(比如公司出口 NAT 共享 IP 下多个用户输错),可调高 maxretry 或加入 ignoreip。
基本上就这些。Fail2ban 不复杂,但容易忽略日志路径、防火墙匹配、白名单设置这三个关键点。配好之后,每天少看几百条失败登录告警,服务器也安静不少。