← 中文资源

简体中文版本

用 fail2ban 阻断 SSH 爆破

用 jail 匹配认证失败、经 nftables 封禁惯犯、白名单自家网段,并用一次测试封禁验证整条链路。

阅读英文原文

目标

爆破之所以便宜,是因为失败免费:一个地址可以零成本地试几千个密码。fail2ban 反转这套经济学——盯着认证日志、把惯犯交给防火墙,让他们的下一个包根本到不了 sshd。递增封禁让再犯越来越贵,ignore 名单则保证机制永远不惩罚自己的运维人员。

步骤要点

  1. 配 sshd jail:10 分钟内失败 4 次封 1 小时,bantime.increment/factor 4 递增,运维网段进 ignoreip。
  2. backend=systemd 并用 journalmatch 指向 sshd.service,从 journald 直读失败、免疫日志轮转。
  3. fail2ban-client status sshd 观察失败计数在攀升,确认 jail 真的在解析日志。
  4. 故意用错误密码连 4 次触发封禁,确认地址出现在 banned 列表且新连接被防火墙丢弃。
  5. 等待 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