必须分层设防:连接级(MaxAuthTries 3 + LoginGraceTime 60)、用户级(pam_faillock,deny=3/15分钟/自动解锁)、IP级(fail2ban,2分钟3次封24小时),并根治禁用密码认证(PasswordAuthentication no)。

Linux 系统中限制 SSH 登录失败次数,不能只靠单一配置,必须分层设防:连接级、用户级、IP 级三者配合才真正有效。单纯改 sshd_config 中的 MaxAuthTries 只能防“一次连入狂试”,攻击者换连接就能绕过,实际防护意义有限。
1. 连接内尝试次数限制(轻量内置)
这是最基础的一道防线,无需额外服务,直接通过 OpenSSH 自身配置实现:
- 编辑
/etc/ssh/sshd_config,确保包含以下两行: -
MaxAuthTries 3:单次 TCP 连接内最多允许 3 次认证尝试(密码、密钥、键盘交互等总和) -
LoginGraceTime 60:连接建立后仅 60 秒登录窗口,超时自动断开 - 执行
sudo systemctl reload sshd生效
⚠️ 注意:该限制不跨连接,也不记录失败来源,仅作为辅助手段,必须与其他机制共用。
2. 用户级失败锁定(推荐用 pam_faillock)
新版系统(RHEL 8+/CentOS 8+/Ubuntu 20.04+)已弃用 pam_tally2,统一使用 pam_faillock。它按用户独立计数,支持自动解锁、时间窗口统计,更安全可靠:
- 编辑
/etc/pam.d/sshd,在auth段最开头插入两行(顺序不能错): auth [default=die] pam_faillock.so preauth silent deny=3 unlock_time=600 fail_interval=900auth [default=bad] pam_faillock.so authfail deny=3 unlock_time=600 fail_interval=900- 再编辑
/etc/pam.d/password-auth(不是system-auth),同样添加上述两行,确保图形界面、控制台等其他登录方式也生效 -
deny=3表示 15 分钟内(fail_interval=900)第 3 次失败即锁定;unlock_time=600表示 10 分钟后自动解锁 - 查看状态:
faillock --user username;手动解锁:faillock --user username --reset
3. IP 级自动封禁(核心防线:fail2ban)
这是对抗暴力破解最关键的环节——不依赖 PAM,直接解析日志、调用防火墙封禁源 IP:
- 安装:
apt install fail2ban(Debian/Ubuntu)或yum install fail2ban(RHEL/CentOS) - 复制配置:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local - 编辑
/etc/fail2ban/jail.local,确保[sshd]段启用并配置: enabled = truemaxretry = 3-
findtime = 120(2 分钟内达阈值,比默认更严) -
bantime = 86400(封禁 24 小时) -
logpath = /var/log/auth.log(Ubuntu/Debian)或/var/log/secure(RHEL/CentOS) - 启动服务:
sudo systemctl enable --now fail2ban - 验证:
sudo fail2ban-client status sshd,实时观察日志:sudo tail -f /var/log/fail2ban.log
4. 根治建议:禁用密码认证
所有失败锁定机制的前提是“密码还能输”。只要 PasswordAuthentication yes 还开着,攻击者就有可乘之机:
- 编辑
/etc/ssh/sshd_config,设为:PasswordAuthentication no - 确保已配置好 SSH 密钥登录,并测试无误后再重启服务
- 这样,暴力破解路径被彻底关闭,其余防护机制就真正成为“兜底”而非“主力”


















