fail2ban防暴力破解实战:SSH与Web后台自动化封禁配置指南


一、暴力破解为何屡禁不止

只要你的服务器开放了 SSH、MySQL、Web 后台等服务对公网,就一定会被互联网上的扫描器反复试探。它们用默认字典、撞库拿到账号,再用海量密码组合穷举。很多管理员以为"改了默认密码就没事",殊不知弱口令 + 无限制的登录重试,迟早会被撞出密码——尤其 SSH root 直连、默认 порт 22 的情况下,暴力破解的日志几乎天天刷屏。fail2ban 就是针对这类攻击的利器:它监控日志文件,发现可疑的连续失败尝试后,动态调用防火墙封禁对应 IP,实现自动化"自动防御"。

二、fail2ban 的工作原理

fail2ban 的核心是一个经典的"读取日志 → 正则匹配 → 计数超阈 → 封禁 IP"的闭环:

日志文件(auth.log) --> filter(正则) -->jail(规则) --> action(iptables 封禁)

它内置了针对 SSH、vsftpd、nginx、apache、exim 等常见服务的 filter,管理员只需在 jail 配置里把服务"接入"并设定封禁阈值,就能复用现成的日志匹配规则,不必自己手写正则,上手成本极低。

三、安装与基础配置

Debian/Ubuntu 安装:

sudo apt update
sudo apt install -y fail2ban

RHEL/CentOS/Rocky/AlmaLinux 安装:

sudo dnf install -y fail2ban

主配置文件是 /etc/fail2ban/jail.conf,但它会被升级覆盖,所以自定义内容应写到 /etc/fail2ban/jail.local(同目录下优先级更高),用 include 加载也可。先看核心默认行为:

# jail.local
[DEFAULT]
bantime  = 10m          # 封禁时长,单位可选 s/m/h/d
findtime = 10m          # 在 findtime 窗口内统计失败次数
maxretry = 3            # 超过该次数即封禁
backend  = auto

四、启用 SSH 防护(最常用)

打开 SSH 的 jail,开头的 enabled = true 不能省略,否则默认是关闭的:

[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log   # Debian/Ubuntu
# RHEL 系列一般用 /var/log/secure

生效并查看状态:

sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

fail2ban-client status sshd 会列出被封禁的 IP 列表和当前匹配计数,方便确认防护是否在起作用。日志里只要出现 3 次 SSH 认证失败,对应 IP 就会被加入防火墙封禁清单。

五、防护 Nginx / Apache 的 Web 暴力试探

Web 后台(如 wp-login.php、/admin)同样易被刷。fail2ban 内置了 nginx 相关 filter,可针对"登录页连续失败响应"封禁源 IP:

# 监控 nginx 错误日志,匹配 401/403 连续出现
[nginx-http-auth]
enabled = true
port    = http,https
filter  = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime  = 1h

若要精准封禁特定路径(如 wp-login.php 的 POST),可以自定义 filter 文件 /etc/fail2ban/filter.d/nginx-wplogin.local:

[Definition]
failregex = ^<HOST> .*"POST /wp-login\.php HTTP/1\..*" 200
ignoreregex =

写完再在 jail.local 里定义 [nginx-wplogin],指向该 filter 和 logpath。这里 <HOST> 是 fail2ban 的内置占位符,会自动提取 IP。

六、封禁动作与白名单

fail2ban 默认动作是调用 iptables/NFTables 拒绝入站。也可以通过恶意的反复报警机制,把攻击 IP 计入黑名单后静默丢弃。担心误封自己时,一定记得加白名单 ignoreip:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 1.2.3.4   # 后台/家中固定 IP 千万别封

查单个 IP 是否被封:fail2ban-client status sshd | grep 封禁与否;手动解封:fail2ban-client set sshd unbanip 1.2.3.4;查看整体防火墙规则:sudo iptables -L -n | grep f2b(能看到 fail2ban 建的 f2b-sshd 链)。

七、排错与避坑建议

最常见的三个问题:

  • logpath 路径不对:Debian 用 /var/log/auth.log,RHEL 用 /var/log/secure,写错则读不到日志永不封禁。
  • 正则没匹配上:可用 fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf 离线测试 filter,先确认能匹配到样例行。
  • 封禁后仍被访问:确认动作链已挂载(iptables -L -n),以及服务器是否有防火墙前端(firewalld 需用 banaction=firewallcmd-ipset)。

进阶建议:

# 看 fail2ban 有没有报错
sudo fail2ban-client logtarget /var/log/fail2ban.log
sudo journalctl -u fail2ban -n 50

写在最后

fail2ban 用极低的资源成本,堵住了绝大多数来自公网的暴力尝试。但请记住它是"事后防御"——真正的高价值账号仍然要靠强密码、SSH 密钥登录、禁用 root 直接登录、修改默认端口、以及在云厂商防火墙层再加一道白名单。把 fail2ban 当成自动化守门员,配合前面讲过的 SSH 密钥与限流,你的服务器才能从"裸露的公网靶子"变成"加了锁的门"。配置不要贪多,先从小而稳的 SSH + Web 登录页开始。


手机扫码阅读

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

Docker容器化部署实战:Dockerfile编写与docker-compose多服务编排

systemd服务管理从入门到实战:unit文件编写、日志排查与资源限制

评 论
更换验证码