互联网上任何一台开放 SSH 的服务器,每天都会遭受来自全球的暴力破解尝试。fail2ban 是一个主动防御工具:它监控系统日志,发现短时间内多次登录失败后,自动将对方 IP 封禁一段时间,从源头阻断暴力破解。本文演示如何在搬瓦工 VPS 上安装和配置 fail2ban。

本文要点

  • 安装 fail2ban 并启动服务
  • 通过 jail.local 自定义封禁规则,不修改原始配置
  • 设置封禁时长与失败次数阈值
  • 查看封禁状态与手动解封 IP

安装 fail2ban

Debian / Ubuntu

apt update && apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban

CentOS / 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 是什么意思?

表示永久封禁,直到手动解封。适合安全要求高的场景,但误封后需手动处理。