Fail2Ban
Fail2Ban 是一个“幕后英雄”:通常没有图形界面,主要通过命令行查看状态。 它通过监控系统服务日志(如 SSH、Nginx、Apache、Postfix 等), 在检测到同一 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 配置)。