互联网上任何一台开放 SSH 的服务器,每天都会遭受来自全球的暴力破解尝试。fail2ban 是一个主动防御工具:它监控系统日志,发现短时间内多次登录失败后,自动将对方 IP 封禁一段时间,从源头阻断暴力破解。本文演示如何在搬瓦工 VPS 上安装和配置 fail2ban。
本文要点
- 安装 fail2ban 并启动服务
- 通过 jail.local 自定义封禁规则,不修改原始配置
- 设置封禁时长与失败次数阈值
- 查看封禁状态与手动解封 IP
安装 fail2ban
Debian / Ubuntu
apt update && apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2banCentOS / AlmaLinux / Rocky
# 先启用 EPEL 仓库
dnf install -y epel-release
dnf install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban配置文件说明
| 文件 | 说明 | 是否修改 |
|---|---|---|
| /etc/fail2ban/fail2ban.conf | 全局配置(软件默认值) | 否,升级会覆盖 |
| /etc/fail2ban/jail.conf | 监控规则模板 | 否,升级会覆盖 |
| /etc/fail2ban/jail.local | 用户自定义配置(优先级最高) | 是,在此修改 |
只改 .local 文件
永远不要直接修改 jail.conf——软件更新时会覆盖它。所有自定义配置写在 jail.local 文件中。
创建并配置 jail.local
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local在 [DEFAULT] 段和 [sshd] 段修改以下参数:
[DEFAULT]
# 封禁时长(秒);-1 表示永久
bantime = 3600
# 检测窗口(秒),此时间内失败达 maxretry 则封禁
findtime = 600
# 允许的最大失败次数
maxretry = 5
# 本机回环永不封禁
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s如果 SSH 端口非默认 22
请将 [sshd] 中的 port = ssh 改为实际端口号,例如 port = 2222,否则封禁规则不会作用于正确端口。
应用配置并验证
# 重启服务使配置生效
systemctl restart fail2ban
# 查看 sshd jail 状态
fail2ban-client status sshd输出中 Currently banned 显示当前封禁 IP 列表;Total banned 显示历史封禁总次数。
手动解封 IP
# 解封某个 IP
fail2ban-client set sshd unbanip 203.0.113.100
# 手动封禁某个 IP
fail2ban-client set sshd banip 203.0.113.99查看 fail2ban 日志
# 实时追踪日志
tail -f /var/log/fail2ban.log
# 筛选封禁记录
grep "Ban " /var/log/fail2ban.log | tail -20结合 SSH 密钥登录更安全
fail2ban 能减缓暴力破解,但配合 SSH 密钥登录(禁用密码登录)才是最彻底的方案——没有密码可猜,暴力破解从根本上失去意义。
小结
- 安装后默认保护 SSH,开箱即用
- 自定义配置写在 jail.local,不要改 jail.conf
- 建议 bantime=3600、findtime=600、maxretry=5 作为起点,按需调整
- 非 22 端口的 SSH 一定要同步修改 jail.local 的 port 值
- 用 fail2ban-client status sshd 随时查看封禁状态
常见问题
自己的 IP 被 fail2ban 封了怎么解封?
用 KiwiVM 紧急控制台登录,执行 fail2ban-client set sshd unbanip 你的IP 即可立即解封。
fail2ban 会误封正常用户吗?
多次输错密码会触发封禁。可将可信 IP 加入 ignoreip 白名单,或适当增大 maxretry 值减少误封。
fail2ban 能防御其他服务吗?
能。fail2ban 内置了 nginx、apache、postfix 等多种 jail,在 jail.local 中启用对应段落即可保护更多服务。
bantime 设为 -1 是什么意思?
表示永久封禁,直到手动解封。适合安全要求高的场景,但误封后需手动处理。