Fail2Ban

Fail2Ban 是一个“幕后英雄”:通常没有图形界面,主要通过命令行查看状态。 它通过监控系统服务日志(如 SSHNginxApachePostfix 等), 在检测到同一 IP 的短时间内多次失败后,调用防火墙规则封禁该 IP,以抑制暴力破解与滥用行为。

Fail2Ban 在哪查看?(常用命令)

Fail2Ban 安装后会在后台运行,使用 fail2ban-client 与其交互。

A. 查看整体状态(有哪些监狱在运行)


sudo fail2ban-client status

Status
|- Number of jail:      3
Jail list:           sshd, nginx-http-auth, apache-auth

这表示有 3 个防护规则(Jail)正在运行,分别保护 SSH、Nginx 和 Apache。

B. 查看具体服务的状态(最常用)

例如查看 SSH 的防护情况(默认监狱名通常是 sshd):


sudo fail2ban-client status sshd

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:    150
|  - File list:       /var/log/auth.log
Action
   |- Currently banned: 2

手动解封某个 IP:


sudo fail2ban-client set sshd unbanip 1.2.3.4
要点:Fail2Ban 本身不“生成密码”也不“拦截输入”,它只是读取日志,看到失败记录后再封禁 IP(事后处理)。

“多次密码错误”是指什么密码?哪里的密码?

Fail2Ban 监控的是服务自身产生的日志:当有人对某服务进行认证(口令或密钥等)失败时,服务会把失败事件写入日志。 Fail2Ban 发现同一 IP 在 findtime 内失败次数超过 maxretry,就会触发封禁 bantime

服务(Jail) 监控的“密码/认证”类型 日志文件(Ubuntu/Debian) 常见攻击场景
sshd (SSH) 服务器登录口令(或 SSH 密钥验证失败) /var/log/auth.log 脚本暴力尝试 root/123456、admin/password 等组合。
nginx-http-auth 目录访问认证(.htpasswd) /var/log/nginx/error.log 对受保护目录进行口令爆破。
apache-auth 目录访问认证 /var/log/apache2/error.log 同上,针对 Apache 的受保护资源。
postfix / dovecot 邮箱收发认证口令 /var/log/mail.log 爆破邮箱账号密码、尝试发垃圾邮件。
mysqld-auth 数据库登录口令 /var/log/mysql/error.log 远程连接数据库并爆破 root 或其他用户。
recidive Fail2Ban 自身综合判定 /var/log/fail2ban.log 同一 IP 多次被多个 jail 封禁后,升级为更长封禁(如 1 周)。

核心逻辑(简图)


攻击者 -> 请求 -> 你的服务(SSH/Web/DB)
你的服务 -> 认证失败 -> 写入日志(Authentication failure)
Fail2Ban -> 读取日志 -> 发现同IP短时间内失败N次
Fail2Ban -> 调用防火墙(iptables/ufw/nft) -> 封禁该IP

如何配置“多少次”算攻击?

默认配置在 /etc/fail2ban/jail.conf,不建议直接改(升级可能覆盖)。 通常做法是在 /etc/fail2ban/jail.local 中覆盖/新增配置。

示例:自定义 SSH 防护规则


sudo nano /etc/fail2ban/jail.local

[sshd]
enabled  = true
port     = 22222          # 如果你改了 SSH 端口,这里要对应修改
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3              # 允许失败几次(常见建议 3–5)
bantime  = 3600           # 封禁多久(秒),3600 = 1 小时
findtime = 600            # 统计窗口(秒),600 = 10 分钟
                          # 含义:10 分钟内失败 3 次 -> 封 1 小时

保存后重启生效:


sudo systemctl restart fail2ban
小提醒:如果你修改过 SSH 端口但没同步更新 jail 的 port,就会出现“看似启用了,但实际没按预期拦截”的错觉。

快速总结

  • 查看整体:sudo fail2ban-client status
  • 查看 SSH:sudo fail2ban-client status sshd
  • 它监控的是服务日志里的失败记录,不是“实时拦截密码输入”。
  • 可保护对象不仅是 SSH,也可以是网站目录认证、邮箱、数据库等(取决于 jail/filter 配置)。