
只要服务器开着 SSH 暴露在公网,日志里就会出现持续的密码爆破尝试——这是所有 Linux 运维的日常。fail2ban 的作用就是把这个"人工盯日志"的过程自动化:日志里谁反复失败,就自动把谁的 IP 封掉一段时间。
而整个自动化的核心开关,就是今天的主角——maxretry(最大重试次数):它在问一个简单的问题:"同一个 IP,失败多少次之后,我就不该再给它机会了?"
这个数字设太大,爆破者多拿几次机会;设太小,输错密码的自己人先被封。本文讲清楚它的准确定义、与另外两个参数的联动关系、各场景的推荐值,以及最容易踩的坑。
监控日志(jail 指定日志源) → filter 正则匹配"失败"记录(如 SSH 登录失败) → 同一 IP 的失败在 findtime 时间窗口内计数 → 达到 maxretry 次 → 触发封禁 → 封禁时长 = bantime(防火墙规则拦截该 IP) → bantime 到期解封(或用 recidive 策略对惯犯加重)
三个核心参数由此形成"铁三角":
maxretry触发封禁的失败次数阈值,常见默认 3 或 5(因版本而异)三者的联动关系用一个例子说清:maxretry=5, findtime=10m, bantime=1h 意思是——同一 IP 在 10 分钟内失败 5 次,即被封禁 1 小时。
两个容易忽略的细节:
这是最常见的理解偏差。maxretry 计数的是filter 正则在日志里匹配到的行数。也就是说:
不要直接改 jail.conf(升级会被覆盖),规范做法是写 jail.local 或 jail.d/ 下的独立文件:
# /etc/fail2ban/jail.local [DEFAULT] bantime = 1h findtime = 10m maxretry = 3 ignoreip = 127.0.0.1/8 你的管理IP [sshd] enabled = true maxretry = 3
优先级:jail.d/*.local > jail.local > jail.conf。改完记得 systemctl reload fail2ban(或 restart)。
# 查看某个 jail 的状态:当前封禁列表、累计失败总数 fail2ban-client status sshd # 测试 filter 正则能否匹配你的真实日志(调 maxretry 前必做) fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf # 查看某个 jail 实际生效的 maxretry 值 fail2ban-client get sshd maxretry
第三条尤其有用:它返回的是实际生效值,能立刻发现"改了 jail.local 但没生效"的问题。
| 场景 | maxretry | findtime | bantime | 说明 |
|---|---|---|---|---|
| SSH(密码登录) | 3 | 10m | 1h | 最常被爆破,从紧;更优解是改用密钥登录后禁用密码 |
| Web 登录页(nginx/后端日志) | 5–10 | 10m | 30m | 用户真的会输错密码,从宽,误封代价高 |
| 邮件服务(dovecot/postfix) | 3–5 | 10m | 1h | 爆破高频,从紧 |
| FTP / SFTP | 3 | 10m | 1h | 协议老旧,只该有专用账号 |
| 数据库 / 管理面板 | 3 | 5m | 24h | 不该对公网暴露,一旦暴露从严 |
三条配套原则,比 maxretry 的数字本身更重要:
recidive jail:在固定窗口内被封多次的 IP,处以天级/周级长封;误区一:改了配置没生效。原因通常是写在 jail.conf 里被覆盖、或忘记 reload。用 fail2ban-client get <jail> maxretry 核对实际生效值。
误区二:maxretry=1,结果自己被封。一次失败就封会把输错密码的管理员、正常的认证抖动都拦下。除非服务只允许密钥认证,否则不建议低于 3。
误区三:只防了 IPv4。爆破越来越多来自 IPv6,检查 jail 的日志源与 backend 是否覆盖 v6 记录。
误区四:backend 与日志源不匹配。新版系统日志进了 journal,jail 还在追旧文件路径——什么都匹配不到,maxretry 永远达不到。
误区五:误封后不知道怎么解。应急解封:fail2ban-client set sshd unbanip <IP>;长期方案是加入 ignoreip。这两条命令应写进团队运维手册。
fail2ban-client status 确认服务在运行、关键 jail 已启用fail2ban-client get <jail> maxretry 核对各 jail 实际生效值ignoreip 已加:本机回环、运维出口 IP、监控探测源fail2ban-regex 对真实日志验证过(能匹配、不误匹配)recidive jail 已启用,惯犯长封策略生效fail2ban-client get <jail> maxretry 查你系统的实际生效值。fail2ban-client set <jail> unbanip <你的IP>;然后把 IP 加入 ignoreip 并 reload,避免复发。如果连 SSH 都进不去了,需要通过服务商控制台/VNC 处理——这就是为什么白名单必须先配。
-->