
核心要点(TL;DR)
- 改 SSH 端口可减少 90% 自动化扫描,但需同步更新防火墙规则。
- 密钥登录比密码更安全,禁用密码认证前务必测试密钥生效。
- fail2ban 自动封禁暴力破解 IP,配置时注意日志路径与封禁策略。
- 综合使用改端口、密钥登录和 fail2ban 可显著提升 SSH 安全性。
凌晨三点,服务器 CPU 飙升,登录一看 /var/log/secure 里满屏的 Failed password——SSH 又被暴力破解了。这是很多运维和站长都遇到过的场景。默认的 22 端口每天会遭受数万次自动化扫描,弱密码分分钟被攻破。本文提供一套经过验证的实战方案:改端口、密钥登录、fail2ban 三步走,附带具体命令和检查清单,帮你彻底摆脱 SSH 爆破困扰。
一、为什么 SSH 总被暴力破解?
SSH 是 Linux 服务器的远程管理入口,默认监听 22 端口,且允许密码认证。攻击者利用自动化工具(如 Hydra、Medusa)对全网 IP 进行扫描,尝试常见用户名(root、admin)和弱密码。一旦得手,服务器可能被植入挖矿木马、勒索软件或成为跳板机。根据经验,暴露在公网的 22 端口每天会收到数千到数万次尝试,root 账户尤其高危。
二、第一步:修改 SSH 默认端口
改端口不能根治,但能避开 90% 以上的自动化扫描,显著降低日志噪音。操作如下:
- 编辑
/etc/ssh/sshd_config,找到#Port 22,改为Port 2222(建议选 1024-65535 之间未占用的端口)。 - 如果启用了 SELinux,需添加新端口:
semanage port -a -t ssh_port_t -p tcp 2222。 - 更新防火墙规则:
firewall-cmd --permanent --add-port=2222/tcp && firewall-cmd --reload(CentOS)或ufw allow 2222/tcp(Ubuntu)。 - 云服务器还需在安全组中放行新端口。
- 重启 SSH 服务:
systemctl restart sshd。
关键检查:不要关闭当前 SSH 会话,另开一个新终端用新端口连接测试:ssh -p 2222 user@server。确认成功后再关闭旧会话,避免把自己锁在外面。
三、第二步:配置密钥登录并禁用密码认证
密钥登录使用非对称加密,几乎无法暴力破解,是比密码更安全的认证方式。
1. 生成密钥对(本地操作)
ssh-keygen -t ed25519 -C "your_email@example.com"按提示保存密钥(默认 ~/.ssh/id_ed25519),可设置密钥密码增加保护。
2. 上传公钥到服务器
ssh-copy-id -p 2222 user@server或手动将公钥内容追加到服务器 ~/.ssh/authorized_keys,并确保权限:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys。
3. 修改 sshd 配置
编辑 /etc/ssh/sshd_config,确保以下配置:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes重启 SSH 服务:systemctl restart sshd。
关键检查:在禁用密码前,务必用新终端测试密钥登录成功。保留一个已连接的会话,以防配置错误。如需临时启用密码,可注释掉 PasswordAuthentication no 并重启。
四、第三步:部署 fail2ban 自动封禁
fail2ban 监控日志,自动封禁多次登录失败的 IP,是动态防御利器。
1. 安装 fail2ban
# CentOS/RHEL
yum install epel-release -y && yum install fail2ban -y
# Ubuntu/Debian
apt update && apt install fail2ban -y2. 配置 jail.local
创建 /etc/fail2ban/jail.local,内容如下:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log # CentOS 改为 /var/log/secure
maxretry = 3
bantime = 3600
findtime = 600参数说明:maxretry 为最大失败次数,bantime 为封禁时长(秒),findtime 为检测时间窗口。
3. 启动并验证
systemctl enable fail2ban && systemctl start fail2ban
fail2ban-client status sshd输出会显示当前封禁的 IP 列表。也可手动测试:fail2ban-client set sshd banip 1.2.3.4。
五、完整检查清单与对比
| 措施 | 作用 | 操作复杂度 | 推荐指数 |
|---|---|---|---|
| 改端口 | 避开自动化扫描 | 低 | ★★★★ |
| 密钥登录 | 杜绝密码爆破 | 中 | ★★★★★ |
| fail2ban | 自动封禁恶意 IP | 中 | ★★★★ |
检查清单:
- 新端口已放行防火墙和安全组
- 密钥登录测试成功
- 密码认证已禁用
- fail2ban 服务运行中,jail 状态正常
- 日志中不再出现大量失败记录
完成以上三步后,你的 SSH 安全性将大幅提升。对于更高要求的环境,可结合 AegisX 的入侵检测与动态防火墙能力,实现基于威胁情报的自动封禁和异常行为分析,让防护更智能。
六、行动建议
不要等到被入侵才行动。建议立即:1)备份 sshd_config;2)按顺序实施改端口、密钥登录、fail2ban;3)每步测试后再继续;4)定期检查日志和 fail2ban 状态。安全是一个持续过程,从加固 SSH 开始,迈出服务器防护的第一步。
常见问题(FAQ)
改 SSH 端口后连接不上怎么办?
首先检查防火墙是否放行新端口,云服务器还需检查安全组规则。然后确认 sshd 配置文件中 Port 指令已修改并重启服务。若仍无法连接,可通过 VNC 或救援模式登录,检查 /var/log/secure 或 auth.log 中的错误信息,并临时恢复原端口配置。
密钥登录配置后如何禁用密码登录?
在 sshd_config 中设置 PasswordAuthentication no,然后重启 sshd 服务。务必在禁用密码前,用新终端测试密钥登录成功,并保留一个已连接的会话以防万一。禁用后,所有用户必须使用密钥认证,可有效防止密码暴力破解。
fail2ban 如何配置针对 SSH 的封禁规则?
安装 fail2ban 后,在 jail.local 中启用 [sshd] 段,设置 enabled = true、port = ssh、logpath = /var/log/auth.log(或 /var/log/secure)、maxretry = 3、bantime = 3600。保存后重启 fail2ban 服务,使用 fail2ban-client status sshd 查看封禁情况。
如何查看 SSH 暴力破解的尝试记录?
使用命令 grep 'Failed password' /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL)查看失败记录。也可用 lastb 查看失败登录用户列表,或使用 journalctl -u sshd 查看 systemd 日志。定期分析这些日志有助于识别攻击模式。
除了改端口、密钥和 fail2ban,还有哪些 SSH 加固措施?
可限制 SSH 监听地址、使用 AllowUsers 白名单、禁用 root 直接登录、设置登录时间限制、启用双因素认证(2FA),并保持 SSH 版本更新。结合 AegisX 的入侵检测与防火墙联动能力,可进一步实现动态防护。