fail2ban 使用详解
fail2ban 使用详解
Timmyfail2ban 是一款用 Python 编写的入侵防御软件。它通过扫描日志文件(如
/var/log/auth.log)识别多次认证失败的 IP,然后动态更新防火墙规则(如 iptables、nftables)来临时或永久封禁该 IP,有效对抗暴力破解和恶意扫描。当前版本 v1.1.x。
工作原理
fail2ban 由三个核心概念组成:
- Jail(监狱):一组规则单元,包含一个 Filter 和一个或多个 Action。
- Filter(过滤器):用正则表达式从日志中提取失败尝试和 IP 地址。
- Action(动作):定义封禁(ban)与解封(unban)时要执行的命令,如修改 iptables 规则或发送邮件告警。
工作流程:日志文件 → Filter 匹配 → 计数(findtime 内 maxretry 次) → Action 封禁(bantime 时长) → 到期后自动解封。
安装
fail2ban 已包含在大多数 Linux 发行版仓库中,按发行版选择对应命令:
1 | Debian / Ubuntu |
从源码安装(需要 Python 3.6+):
1 | git clone https://github.com/fail2ban/fail2ban.git |
注意:旧教程中的
python setup.py install在 Python 3.12+ 已被移除,请改用pip install .。生产环境建议优先使用发行版仓库版本,源码安装仅用于尝鲜新特性。
安装后验证:
1 | fail2ban-client -h |
Debian / Ubuntu 安装后会自动在 jail.d/ 下生成 debian.conf(或 ubuntu.conf),其中只启用了 sshd jail。若系统未安装 SSH 服务,需要手动跳过相关配置,否则服务可能启动失败。
配置文件结构
fail2ban 的配置文件位于 /etc/fail2ban/:
1 | /etc/fail2ban/ |
持久化数据库默认位于 /var/lib/fail2ban/fail2ban.sqlite3,用于保存封禁记录与日志读取位置。
重要原则:直接在 jail.conf 中修改会导致升级时被覆盖。推荐做法是在 jail.local 或 jail.d/*.local 中只写需要改动的配置项,其余继承自 .conf 文件。
配置文件的加载顺序(后面的覆盖前面的):
jail.confjail.d/*.conf(按字母序)jail.localjail.d/*.local(按字母序)
全局配置(fail2ban.conf)
/etc/fail2ban/fail2ban.conf 控制 fail2ban 守护进程自身行为:
1 | [Definition] |
loglevel:CRITICAL、ERROR、WARNING、NOTICE、INFO、DEBUG、TRACEDEBUG、HEAVYDEBUGdbpurgeage:数据库中的封禁记录保留时间(秒),默认 86400(24 小时)
创建监狱(Jail)
基础 SSH 保护
创建 /etc/fail2ban/jail.local:
1 | [DEFAULT] |
如果 SSH 端口不是默认的 22,需修改 port:
1 | [sshd] |
常用内置 jail
fail2ban 自带大量预配置 jail,在 jail.conf 中默认被 enabled = false,在 jail.local 中启用即可:
1 | [sshd] |
自定义 jail
1 | [my-custom-jail] |
常用命令(fail2ban-client)
1 | 启动 / 停止 / 重启服务 |
status sshd 的典型输出:
1 | Status for the jail: sshd |
其中 Currently failed 是当前统计窗口内的失败次数,Banned IP list 就是已封禁的 IP。
过滤器(Filter)
过滤器定义在 /etc/fail2ban/filter.d/ 中,用正则表达式识别日志中的失败尝试并提取 IP。
内置过滤器示例(sshd.conf)
1 | [Definition] |
关键标签:
<HOST>:匹配 IP 地址或主机名<ADDR>:匹配 IP 地址<F-USER>...</F-USER>:提取用户名<F-ID>...</F-ID>:提取标识符用于封禁(替代 IP)
测试过滤器
用 fail2ban-regex 工具测试正则表达式是否匹配日志:
1 | sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
或直接指定正则:
1 | sudo fail2ban-regex /var/log/auth.log "Authentication failure for .* from <HOST>" |
自定义过滤器
创建 /etc/fail2ban/filter.d/myapp.conf:
1 | [Definition] |
动作(Action)
动作定义在 /etc/fail2ban/action.d/ 中,指定封禁/解封时执行的命令。
常用内置动作
iptables-multiport:基于 iptables 的多端口封禁nftables-multiport:基于 nftables(新版防火墙)ufw:使用 UFW 封禁mail-whois:封禁时发送含 whois 信息的邮件firewallcmd-ipset:使用 firewalld + ipset
如何选择防火墙动作
先确认系统实际使用的防火墙,再选对应动作,否则封禁命令会失效:
1 | 判断当前防火墙类型 |
| 系统防火墙 | 推荐动作 |
|---|---|
| 原生 iptables | iptables-multiport 或 iptables-ipset-proto6 |
| nftables | nftables-multiport |
| Ubuntu/Debian + UFW | ufw |
| CentOS/RHEL + firewalld | firewallcmd-ipset |
新版 Ubuntu / Debian 已默认使用 nftables 后端,但 iptables 命令仍可通过兼容层工作,因此 iptables-multiport 通常仍可用。
动作配置示例
1 | [sshd] |
后台监控方式(Backend)
fail2ban 支持多种日志监控后端,通过 backend 配置:
pyinotify:Linux 内核 inotify 机制,实时高效(推荐 Linux)systemd:直接从 systemd journal 读取,不依赖日志文件polling:轮询方式,兼容性最好但效率最低auto:自动选择(默认)
systemd 后端示例:
1 | [sshd] |
journalmatch 语法与 journalctl 一致。
时间格式
fail2ban 配置中的时间值(bantime、findtime)接受易读格式:
1 | bantime = 1h # 1 小时 |
支持单位:y(年)、mo(月)、w(周)、d(天)、h(小时)、m(分钟)、s(秒)。用 fail2ban-client --str2sec 测试:
1 | fail2ban-client --str2sec 1d12h |
数据库持久化
fail2ban 默认使用 SQLite 数据库(/var/lib/fail2ban/fail2ban.sqlite3)持久化封禁记录和日志读取位置。重启服务后:
- 当前封禁自动恢复生效
- 日志文件从上次读取位置继续追踪
- 不重复处理已读过的内容
若需彻底清空所有状态:
1 | sudo systemctl stop fail2ban |
实践:保护 SSH 防暴力破解
完整配置示例(/etc/fail2ban/jail.local):
1 | [DEFAULT] |
sshd-ddos 是一个更严格的辅助 jail,在短时间内检测到 3 次失败就封禁 24 小时,可有效应对高频爆破。注意它并非所有发行版都内置(Debian/Ubuntu 的 jail.conf 中带有),如果启动时报 Found no accessible config files for 'filter.d/sshd-ddos',说明当前版本没有该 jail,需要自行在 jail.local 和 filter.d/ 中定义,或改用更长的 bantime 替代。
实践:封禁频繁扫描的 IP
1 | [nginx-botsearch] |
实践:自定义递归封禁(recidive)
recidive jail 用于封禁已被封禁过的屡犯 IP,设置更长的封禁时间:
1 | [recidive] |
安全建议
- 不要依赖 fail2ban 作为唯一安全措施,它只是暴力破解的减速带。
- 推荐使用 SSH 密钥认证或双因素认证作为主要手段。
- 定期检查 fail2ban 日志
/var/log/fail2ban.log关注封禁趋势。 - 将
maxretry设为合理值(3~5 次),过低可能导致误封正常用户。 - 使用
ignoreip排除信任 IP 段,避免把自己封在外面。 - 若 SSH 端口暴露在公网,考虑改用非标准端口 + fail2ban 双重防护。
- 启用
mail-whois动作,被封禁时收到邮件通知。 - 配置 logrotate 时注意不要误删 fail2ban 日志,或调整
logtarget路径。
故障排查
- fail2ban 未启动:检查
systemctl status fail2ban,查看日志/var/log/fail2ban.log。 - 日志不匹配:用
fail2ban-regex测试过滤正则是否匹配实际日志行。 - 封禁未生效:确认防火墙规则链存在(
iptables -L -n),或检查action配置是否正确。 - IP 未解封:检查数据库是否损坏,可尝试清空数据库后重启。
- 误封自己:确保
ignoreip包含自己的 IP 或所在网段。 - 日志文件轮转:fail2ban 自动处理 logrotate,若发现异常检查
logpath通配符是否匹配轮转后的文件。
总结
fail2ban 的配置遵循「Filter 匹配日志 → Action 执行封禁」的模型。多数场景只需在 jail.local 中启用内置 jail 并调整 bantime/findtime/maxretry 参数即可。配合 fail2ban-client 监控状态、fail2ban-regex 调试正则,就能高效地防御暴力破解攻击。更多细节参阅 man jail.conf 或 fail2ban 官方文档。

