按日志计数,自动封禁来源
fail2ban 读取服务日志,按正则匹配失败记录(如 SSH 登录失败),在时间窗口内累计到阈值后调用防火墙后端封禁来源地址。对持续爆破的场景,它能在不依赖边界设备的情况下自动降低噪声与尝试次数。生效的前提有两个:日志后端能读到正确的日志源,以及 banaction 与本机实际防火墙匹配。前者不配置就静默失效,后者不匹配会出现“封了但没效果”。
基本信息
| 加固项 | 自动封禁缓解爆破 |
|---|---|
| 适用平台 | Linux(fail2ban 0.10 及以上、1.x) |
| 权限要求 | root |
| 达标判据 | SSH 等关键服务的 jail 启用,封禁计数在增长 |
| 关键项 | backend、logpath、banaction、ignoreip |
典型使用场景
- 公网 SSH 持续遭遇爆破的自动缓解
- Web 登录接口暴力尝试的封禁
- 减少日志噪声,让真实异常更容易被发现
- 与云安全组配合减轻带宽与连接数压力
- 配合限源规则降低未授权访问尝试的频率
最小配置(/etc/fail2ban/jail.local)
最小配置(/etc/fail2ban/jail.local)
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 600
bantime = 3600
# 先写白名单再启用,避免把办公网或堡垒机封掉
ignoreip = 127.0.0.1/8 10.0.8.0/24运行与解封
运行与解封
fail2ban-client status # 看有哪些 jail 生效
fail2ban-client status sshd # 看当前封禁数量与已封 IP
fail2ban-client set sshd unbanip 203.0.113.10 # 解封指定地址
fail2ban-client -d 2>/dev/null | grep -E 'banaction|logpath' | head # 确认后端与日志路径
# firewalld 环境:banaction 指向 firewallcmd-ipset 或 firewallcmd-rich-rules 系列关键参数
| 参数 | 含义 | 配置建议 |
|---|---|---|
| enabled | 是否启用该 jail | 先配 ignoreip 再置 true |
| maxretry | 窗口内允许的失败次数 | 常见 5 次,过低容易误封 |
| findtime | 计数窗口(秒) | 600 秒是常用起点 |
| bantime | 封禁时长(秒) | 3600 起,持续攻击可加大或递增 |
| ignoreip | 永封白名单 | 办公网、堡垒机、监控来源必须列入 |
| banaction | 封禁动作与防火墙后端 | 须与本机实际防火墙匹配 |
把自己或办公网封掉是这类方案的经典事故:启用前务必先配置 ignoreip,把办公网段、堡垒机与监控来源列入白名单。另一个常见问题是后端不匹配——机器上跑的是 firewalld 而 banaction 仍指向 iptables,配置看起来生效,实际封禁没有落地,验证时应对照防火墙规则确认封禁条目真的存在。
日志后端的选择会影响可靠性:auto 模式可能选错(journal 与文件日志之间),后端不可用时 jail 会静默失效。验证方法是观察“已封禁数量”是否随攻击增长,或用一次自测触发失败尝试看是否被计数,而不仅仅看服务是否 active。