
核心要点(TL;DR)
- SSH 暴力破解可通过 fail2ban 自动封禁攻击 IP 有效缓解。
- 配置密钥登录并禁用密码认证是根治暴力破解的关键。
- 修改 SSH 配置后必须检查语法并保留一个活跃会话以防锁死。
- fail2ban 的 jail.local 中 maxretry 和 bantime 需根据业务调整。
凌晨三点,服务器 CPU 飙升,登录一看 /var/log/auth.log 里满是 Failed password for root——SSH 暴力破解又来了。放任不管不仅消耗资源,还可能被撞库成功。本文将手把手带你用 fail2ban 自动封禁攻击 IP,并切换到密钥登录彻底关闭密码入口,附完整命令与检查清单,照着做就能搞定。
为什么 SSH 暴力破解必须立即处理
SSH 暴露在公网时,每天会遭遇数万次密码尝试。攻击者利用自动化工具轮询常见用户名和弱口令,一旦得手即可植入挖矿、勒索软件或作为跳板。单纯改端口只是延缓,无法根治。fail2ban 能动态分析日志并封禁异常 IP,而密钥登录则从认证方式上杜绝密码猜测,两者结合是运维标配。
第一步:安装并配置 fail2ban
主流 Linux 发行版均可通过包管理器安装:
# Debian/Ubuntu apt update && apt install fail2ban -y # CentOS/RHEL yum install epel-release -y && yum install fail2ban -y
安装后不要直接修改 jail.conf,应创建 /etc/fail2ban/jail.local 覆盖默认值。以下是一个针对 SSH 的推荐配置:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600 ignoreip = 127.0.0.1/8
说明:maxretry=3 表示 10 分钟内失败 3 次即封禁 1 小时;ignoreip 加入本机避免误封。CentOS 的日志路径可能是 /var/log/secure,需对应修改。保存后重启服务:
systemctl restart fail2ban systemctl enable fail2ban
验证状态:fail2ban-client status sshd 应显示当前封禁 IP 列表。若未生效,检查日志 /var/log/fail2ban.log 排查过滤规则。
第二步:生成密钥并上传至服务器
在本地终端执行(不要用 root 直接生成,建议用普通用户):
ssh-keygen -t ed25519 -C "your_email@example.com"
按提示保存密钥(默认 ~/.ssh/id_ed25519),可设置密码短语增加安全性。然后上传公钥:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
若没有 ssh-copy-id,可手动复制公钥内容追加到服务器 ~/.ssh/authorized_keys,并确保权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
测试密钥登录:ssh -i ~/.ssh/id_ed25519 user@server_ip,成功进入后再进行下一步。
第三步:禁用密码登录并加固 SSH
关键安全步骤:在修改配置前,保持一个已登录的 SSH 会话不退出,以防配置错误导致无法连接。编辑 /etc/ssh/sshd_config,修改以下参数:
PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no PubkeyAuthentication yes PermitRootLogin prohibit-password
保存后先检查语法:sshd -t,无输出表示正常。然后重载配置:systemctl reload sshd。新开一个终端测试密钥登录,确认无误后再关闭旧会话。
检查清单与对比
完成配置后,逐项核对:
- fail2ban 服务已启动并开机自启
fail2ban-client status sshd显示正常- 密钥登录成功,密码登录被拒绝
- sshd_config 中
PasswordAuthentication no已生效 - 防火墙放行 SSH 端口(默认 22)
- 保留至少一个可用的密钥备份
| 防护措施 | 作用 | 推荐配置 |
|---|---|---|
| fail2ban | 自动封禁暴力破解 IP | maxretry=3, bantime=3600 |
| 密钥登录 | 杜绝密码猜测 | ed25519 密钥,禁用密码认证 |
| 修改端口 | 减少自动化扫描 | 非标准端口,如 2222 |
进阶防护与行动建议
对于高安全场景,可结合 AegisX 的入侵检测与实时封禁能力,自动联动防火墙阻断恶意 IP,减少人工干预。此外,定期更新系统补丁、限制 SSH 登录用户(AllowUsers)、启用双因素认证,能进一步收缩攻击面。现在就去检查你的 auth.log,按上述步骤配置 fail2ban 和密钥登录,今晚就能睡个安稳觉。
常见问题(FAQ)
fail2ban 安装后需要立即修改哪些配置?
安装后应创建 jail.local 文件覆盖默认设置,至少调整 maxretry(尝试次数)、bantime(封禁时长)和 findtime(时间窗口),并确保 sshd 日志路径正确。建议先启用 sshd 监狱并测试封禁效果。
如何生成 SSH 密钥并上传到服务器?
本地运行 ssh-keygen -t ed25519 生成密钥对,然后用 ssh-copy-id user@server 将公钥上传至服务器 ~/.ssh/authorized_keys。也可手动复制公钥内容追加到该文件,并确保权限为 600。
禁用密码登录后如何避免把自己锁在外面?
修改 sshd_config 前,保持一个已登录的 SSH 会话不退出,另开新会话测试密钥登录成功后再禁用密码。同时检查防火墙是否放行 SSH 端口,并确保密钥文件权限正确。
fail2ban 封禁的 IP 如何查看和解封?
使用 fail2ban-client status sshd 查看当前封禁列表。解封单个 IP 可执行 fail2ban-client set sshd unbanip 。如需永久解封,需调整 jail.local 中的 ignoreip 或白名单。
除了 fail2ban 和密钥登录,还有哪些 SSH 加固措施?
可修改默认 SSH 端口、限制登录用户、启用双因素认证、使用防火墙限制源 IP、定期更新 OpenSSH 版本,并监控日志异常。综合措施能显著降低攻击面。