Fail2ban 防暴力破解教程:自动封禁爆破 IP、SSH 和网站防护,秒级阻断攻击


你的 VPS 日志里,大概率每天都有成千上万条失败的 SSH 登录尝试。攻击者用脚本疯狂猜密码、扫端口,这就是暴力破解。光靠设个强密码还不够——人家是拿字典和脚本反复试的。Fail2ban 能自动盯住这些失败记录:一旦某个 IP 在短时间内失败太多次,就自动把它拉进防火墙黑名单封禁一段时间。这篇文章让你把 Fail2ban 配成服务器的"自动门卫"。

一、Fail2ban 是做什么的

Fail2ban 的核心逻辑是:读日志 → 找规律 → 封 IP。

  • 监控指定日志文件(如 SSH 登录日志)
  • 用正则匹配"失败/登录失败/暴力"等特征
  • 同一 IP 在一段时间内触发多次失败,就调用防火墙(iptables/nftables/firewalld)封禁它一段时间
  • 到期后自动解封

它对 SSH、Nginx、Apache、vsftpd、Postfix 等都内置了现成规则,开箱即用。

二、安装 Fail2ban

Ubuntu / Debian:

apt update
apt install -y fail2ban

CentOS / AlmaLinux:

yum install -y fail2ban

启动并设置开机自启:

systemctl enable fail2ban
systemctl start fail2ban

三、基本配置(推荐用 .local 文件)

Fail2ban 的主配置在 /etc/fail2ban/jail.conf。官方建议不要直接改它,而是新建 /etc/fail2ban/jail.local,覆盖自定义项(以后升级不会被覆盖)。

先启用 SSH 防护:

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h      # 封禁时长:1 小时(可按需,如 86400 封一天)
findtime = 10m     # 在 10 分钟内统计失败次数
maxretry = 3       # 失败 3 次就触发封禁

[sshd]
enabled = true
  • bantime:封多久
  • findtime:统计窗口
  • maxretry:窗口内失败多少次触发

保存后重启:

systemctl restart fail2ban

四、验证是否生效

# 查看有哪些 jail 在运行
fail2ban-client status

# 查看 sshd jail 的状态和已封 IP
fail2ban-client status sshd

第一次跑,Currently banned 可能为 0,属正常。出现这种日志即生效:[sshd] Found 1.2.3.4。

查看被禁止的 IP 列表:

fail2ban-client set sshd banip 1.2.3.4   # 手动封
fail2ban-client set sshd unbanip 1.2.3.4 # 手动解封

五、屏蔽 Nginx 暴力请求 / 防 CC

Fail2ban 也能防网站被刷。Nginx 访问日志里异常请求(大量 404、402、连续 POST)可触发封禁。在 jail.local 里加一个 nginx 规则(需要对应 filter):

# 简单示例:盯日志里出现带恶意特征的访问
[nginx-cc]
enabled = true
port    = http,https
logpath = /var/log/nginx/access.log

不同系统 Nginx 日志路径可能不同(宝塔在 /www/wwwlogs/)。更精确的 CC 防护建议用本站的 Nginx 限流限速 教程从接入层控制,Fail2ban 作为兜底一起用。

六、结合防火墙使用说明

Fail2ban 通过防火墙规则封 IP。不同系统底层不同:

  • Debian/Ubuntu 用 iptables/nftables
  • CentOS 8+ 用 firewalld

安装后默认自动适配,一般无需额外配置。若防火墙版本差异导致封不了,可装对应后端插件(python3-pyfwa 等)。

七、避免误伤:白名单设置

家庭/办公宽带可能动态换 IP,把自己封了会很尴尬。在 jail.local 里加白名单:

[DEFAULT]
ignoreip = 127.0.0.1/8 你自己家的公网IP

把自己的 IP 写进去,Fail2ban 不会封它。其他家宽用户偶尔被误封,把 maxretry 或 bantime 调宽松些,或加白名单。

八、查看封禁日志与排查

日志位置因发行版而异,通常看:

journalctl -u fail2ban -n 50          # systemd 日志
# 或
cat /var/log/fail2ban.log

重点看有没有 Found ...(命中失败)、Ban ...(封禁)、Unban ...(解封)记录。

若规则不生效,先确认: - jail 的 enabled = true 写对了没 - logpath 指向的日志文件真实存在、有内容 - 重启过 fail2ban

九、与 SSH 加固配合

Fail2ban 是"事后拦截",最好先做 SSH 本身的加固:改用密钥登录、关闭 root 直接登录、必要时改端口(参考本站 SSH 安全加固教程)。密钥登录几乎无法被爆破,Fail2ban 主要在那些还用密码/遇到其他服务的场景兜底,两者是黄金组合。

十、常见问题

Q1:封不住,日志一直报错?

多半是 logpath 指向的文件不存在,或 /var/log/auth.log 等文件权限/路径不对。用 ls -l /var/log/ 确认,改对路径后重启 fail2ban。

Q2:想封久一点?

把 bantime 调大,如 bantime = 86400(秒=24 小时)或 bantime = 7d。也可以配合 pulls 让同一 IP 二次触发直接封更久。

Q3:把自己封了进不去服务器?

用云厂商的 VNC/控制台/noVNC 进服务器,fail2ban-client unbanip 你的IP 解封自己再连。这也是为什么建议先设白名单。

Q4:改了配置不生效?

改 jail.local 后必须 systemctl restart fail2ban。且每次改完用 fail2ban-client status sshd 确认状态没异常。

Q5:服务器 CPU 被 fail2ban 拖累?

正常情况 fail2ban 占用极低。若日志量极大(被疯狂刷),先配合 Nginx 限流、iptables 在前面挡,减少进入 fail2ban 的流量。

总结

Fail2ban 是服务器防暴力破解的标配:读日志 → 匹配失败特征 → 自动封 IP,异常流量到不了你面前就被挡在防火墙外面。核心配置就 bantime / findtime / maxretry 三个参数,先启好 sshd 和 nginx 两个 jail,再设好白名单防误伤。配合 SSH 密钥加固和 Nginx 限流一起用,暴力破解基本就失效了。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Docker Compose 详解:一个文件编排多个容器,一键启动整套应用栈

Nginx 配置 HTTPS 免费证书教程:Let's Encrypt 签名、自动续期一步到位,让网站变 https 小绿锁

评 论
更换验证码