一、暴力破解为何屡禁不止
只要你的服务器开放了 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 登录页开始。



