为什么 SSH 是攻击重点
公网服务器的 22 端口一旦开放,就会持续被扫描器尝试弱口令。这类攻击的特点是频率高、来自大量不同 IP、单个来源尝试次数有限。靠人工看日志封禁来不及,fail2ban 的作用就是自动统计失败次数并用防火墙规则拒绝这些来源。
安装与基本原理
用系统包管理器安装 fail2ban。它的工作方式是读取指定日志(如 /var/log/secure 或 auth.log),按正则匹配失败登录,超过阈值就调用防火墙插入拒绝规则。它不修改 SSH 服务本身,属于旁路防护,误伤风险相对可控。
配置 SSH jail
在 /etc/fail2ban/jail.local 中启用 sshd 相关配置。关键参数含义如下:
- enabled:开启该 jail
- port:SSH 端口,若改过端口需同步修改
- filter:匹配规则,sshd 是官方自带的
- logpath:认证日志路径,不同发行版路径不同
- maxretry:允许失败次数,通常 3-6
- bantime:封禁时长,初期建议 10 分钟到 1 小时,误封影响小
- findtime:统计窗口,表示在这个时间段内累计失败次数
避免把自己锁在外面
配置前先把你的固定 IP 加入 ignoreip 白名单,尤其是通过公司或家里固定网络管理服务器时。若你经常变换 IP,建议改用密钥登录并禁用密码登录,这样即使被封也能通过其他通道处理。同时建议先另开一个会话验证配置生效,再关闭当前连接,避免配置错误直接断送访问。
常见问题
| 现象 | 处理 |
|---|---|
| 自己被封 | 通过云控制台 VNC 登录,执行 fail2ban-client unban ip,或用白名单避免复发 |
| 没有封禁记录 | 检查 logpath 是否指向真实存在的日志文件 |
| 封禁未生效 | 确认防火墙后端(iptables/nftables/云安全组)与 fail2ban 兼容 |
| 误封正常用户 | 调大 maxretry 或缩短 bantime,先观察再收紧 |
进一步加固
fail2ban 只是第一层。更有效的做法是关闭密码登录、改用 SSH 密钥、限制来源 IP 段、禁用 root 直接登录。把这些做完之后,暴力破解基本失去意义,fail2ban 转而防御其他服务(如 FTP、邮件、后台登录)的爆破尝试。定期 fail2ban-client status 看看哪些 jail 活跃、封了多少 IP,能让你对服务器被攻击的状况心里有数。