目标
爆破之所以便宜,是因为失败免费:一个地址可以零成本地试几千个密码。fail2ban 反转这套经济学——盯着认证日志、把惯犯交给防火墙,让他们的下一个包根本到不了 sshd。递增封禁让再犯越来越贵,ignore 名单则保证机制永远不惩罚自己的运维人员。
步骤要点
- 配 sshd jail:10 分钟内失败 4 次封 1 小时,bantime.increment/factor 4 递增,运维网段进 ignoreip。
- backend=systemd 并用 journalmatch 指向 sshd.service,从 journald 直读失败、免疫日志轮转。
- fail2ban-client status sshd 观察失败计数在攀升,确认 jail 真的在解析日志。
- 故意用错误密码连 4 次触发封禁,确认地址出现在 banned 列表且新连接被防火墙丢弃。
- 等待 bantime 过期验证解封,再观察递增因子对再犯的加刑效果。
排错提示
有失败计数却不见封禁是 banaction 与防火墙不匹配,按主机实际用 nftables-multiport 或 iptables 对应动作;运维被误封说明 ignoreip 漏了网段,补上后立刻 fail2ban-client set sshd unbanip 解封;攻击者换址快于封禁时,配对“仅密钥认证”才是根治,封禁只是止血。记得盯 fail2ban 自身错误日志,升级导致日志格式变化会让它失明。
适用边界
封禁按地址计费,NAT 后合法用户与攻击者同址时无能为力,白名单必须精确到真实来源。
代码示例
[sshd]
enabled = true
maxretry = 4
findtime = 10m
bantime = 1h
bantime.increment = true
bantime.factor = 4
ignoreip = 127.0.0.1/8 203.0.113.0/24