用 fail2ban 拦截暴力破解与恶意 IP
读日志、识别失败登录、自动封禁攻击者 IP,给你的服务器加一道自动化防线。
任何暴露在公网的服务器,SSH 端口每天都会收到成千上万次自动化的暴力破解尝试。光靠强密码或密钥并不能减少这些噪音,而 fail2ban 能帮你自动把反复尝试的攻击者挡在门外。
fail2ban 是怎么工作的
fail2ban 是一个后台守护进程,核心逻辑非常直白:
- 读日志:持续监控日志文件(如 SSH 的 /var/log/auth.log)或 systemd journal。
- 匹配失败:用正则规则(称为 filter)识别「登录失败」这类事件。
- 计数封禁:当某个 IP 在 findtime 时间窗内失败次数达到 maxretry,就通过防火墙(iptables/nftables/firewalld)把它封禁 bantime 时长。
- 自动解封:bantime 到期后自动放行,无需人工干预。
一组这样的「监控 + 规则 + 封禁动作」叫做一个 jail(牢笼),最常用的就是 sshd。
安装
Ubuntu / Debian:
sudo apt update
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
CentOS / Rocky / AlmaLinux(fail2ban 在 EPEL 源中):
sudo dnf install epel-release
sudo dnf install fail2ban fail2ban-firewalld
sudo systemctl enable --now fail2ban
配置 sshd jail
不要直接改 /etc/fail2ban/jail.conf,升级时会被覆盖。请新建 /etc/fail2ban/jail.local,只写你要覆盖的项:
[DEFAULT]
# 白名单:本机和你的固定办公 IP,永不封禁
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 1h
三个关键参数:
- maxretry:窗口内允许的失败次数,超过即封。
- findtime:统计失败次数的时间窗(如 10m)。
- bantime:封禁时长,可用 1h、1d;设为 -1 表示永久封禁。
> 提示:较新的系统 SSH 日志只进 systemd journal 而不写 /var/log/auth.log。若封禁不生效,在 [sshd] 段加一行 backend = systemd。CentOS/Rocky 通常也需要它。
改完后重载配置生效:
sudo systemctl restart fail2ban
查看与手动解封
查看总体状态和某个 jail 的封禁情况:
sudo fail2ban-client status
sudo fail2ban-client status sshd
输出会列出当前累计失败数与 Banned IP list(已封禁 IP)。
误封了自己或同事?手动解封:
sudo fail2ban-client set sshd unbanip 203.0.113.55
也可以手动封禁一个已知的恶意 IP:
sudo fail2ban-client set sshd banip 198.51.100.7
扩展到 nginx
同样的思路可以保护 Web 服务。fail2ban 自带 nginx 相关 filter,只需在 jail.local 中启用对应 jail 并指向你的日志:
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
[nginx-botsearch]
enabled = true
logpath = /var/log/nginx/access.log
maxretry = 2
nginx-http-auth 拦截 HTTP Basic Auth 的暴力破解,nginx-botsearch 封禁扫描敏感路径的爬虫/机器人。你也可以为 WordPress 登录、SMTP、递归 DNS 等编写自定义 filter。
小结
fail2ban 是一个「安装即受益」的轻量防护工具:它读日志、认失败、自动封禁再自动解封。核心动作就三步——apt/dnf 装好、在 jail.local 里为 sshd 设好 maxretry/findtime/bantime、用 fail2ban-client status sshd 观察效果。记得把自己的固定 IP 加进 ignoreip 白名单以防误伤,再按需扩展到 nginx 等服务。它不能替代密钥登录、禁用 root SSH 或防火墙,但能显著削减暴力破解噪音,是任何一台 VPS 都值得几分钟配置的第一道自动化防线。