fail2ban 是什么
fail2ban 是日志驱动的入侵防护框架,工作方式像一个自动化裁判:持续读认证日志,用正则统计某个来源 IP 的失败次数,超过阈值就调用防火墙把它临时封禁。它由三部分组成——jail 定义「监控什么服务、用什么阈值」,filter 提供匹配失败的正则,action 负责调用防火墙接口封禁。它不替代防火墙,而是给防火墙装上自动决策的脑。
基本信息
| 用途 | 按日志自动检测暴力破解并临时封禁来源 IP |
|---|---|
| 语法 | 配置在 /etc/fail2ban/{jail.conf,jail.d/,filter.d/,action.d/},管理用 fail2ban-client |
| 所属软件包 | fail2ban(多数发行版仓库自带,EPEL 里也有) |
| 权限要求 | 需要 root;读日志与操作防火墙都依赖提权 |
典型使用场景
- 公网 SSH 防护:把口令爆破的源 IP 自动封掉,减少密码尝试量与日志噪音
- Web 登录接口防护:对 401/403 频次过高的来源限速封禁
- 邮件服务防护:SMTP 认证失败、垃圾投递尝试的自动处置
- 安全合规要求:等保或审计项要求具备暴力破解检测与自动阻断能力
- 日志驱动排障:通过 jail 状态查看当前封禁名单与失败统计,掌握攻击来源分布
最小可用配置
最小可用配置
# /etc/fail2ban/jail.d/sshd.local(片段文件,优先级高于 jail.conf)
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 10.0.0.0/8
banaction = iptables-multiport管理命令
管理命令
systemctl enable --now fail2ban
fail2ban-client -t # 校验配置语法,改完先测再重启
fail2ban-client status # 列出已启用的 jail
fail2ban-client status sshd # 看该 jail 的失败与封禁统计
fail2ban-client set sshd unbanip 203.0.113.10 # 手工解封
journalctl -u fail2ban -n 50 --no-pager # 看服务自身日志关键参数含义
| 参数 | 作用 | 取值建议 |
|---|---|---|
| maxretry | 在统计窗口内允许的失败次数 | 公网 SSH 设 3 到 5 |
| findtime | 统计窗口长度 | 10 分钟是常见起点,太短对慢速爆破不敏感 |
| bantime | 封禁时长 | 1 小时起步,持续攻击可加长或启用累进封禁 |
| ignoreip | 永不封禁的地址或网段 | 本机、内网、堡垒机、监控来源必须列入 |
| banaction | 调用哪个防火墙动作 | 必须与本机实际防火墙匹配 |
| backend | 日志读取方式 | 有 journald 用 systemd,否则用 auto 读文件 |
日志后端要选对:Debian 系默认写 /var/log/auth.log,RHEL 系写 /var/log/secure,启用 systemd 日志的系统直接用 backend = systemd 更省事。选错后端会出现「jail 已启用但从不封禁」的现象。
白名单是第一道防呆:ignoreip 漏掉自己的办公网段或堡垒机,一次改密或自动化巡检就可能把运维人员自己封在门外。云主机还应叠加安全组限制,避免单点失效。