为什么你的服务器总在被“敲门”?
如果你刚买了云服务器,装好系统,美滋滋地准备部署网站,登录后台一看日志——好家伙,满屏都是“Failed password for root”的记录。IP 地址来自天南海北,从俄罗斯到巴西,从凌晨两点到早上七点,一刻不停地在试探你的密码。
这就是互联网上最普遍的“暴力破解”攻击。黑客利用自动化脚本,拿着庞大的密码字典,对全球范围内暴露在公网上的 SSH 端口(默认 22)进行地毯式扫描。如果你的服务器还在使用传统的“用户名+密码”方式登录,那基本上等于把家门钥匙挂在门外,只等着哪个“幸运”的字典词条把它撞开。
密码登录不仅繁琐(每次都要输入一串复杂字符),而且天生存在被窃听、被撞库的风险。相比之下,SSH 密钥对登录就像是给你的服务器配了一把独一无二的生物锁——公钥放在服务器上,私钥牢牢掌握在你手里。没有私钥,哪怕黑客知道你的用户名,也只能在门外干瞪眼。
今天,我们就来手把手把这套安全机制搭起来。顺便提一句,在开始之前,如果你还没有一台靠谱的云服务器,腾讯云4核4G轻量服务器真实跑分:性能到底够不够用?我们实测给你看,选择一台性能足够的机器是安全的基础。
第一步:在你的本地电脑上生成密钥对
密钥对由两部分组成:私钥(private key)和公钥(public key)。私钥要像宝贝一样藏好,公钥则可以放心地放到任何你需要登录的服务器上。
Windows 用户(推荐使用 PowerShell 或 WSL)
新版 Windows 10/11 已经内置了 OpenSSH 客户端。按下 Win + R,输入 powershell,然后执行以下命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
这里我们选择 ed25519 算法,它比传统的 RSA 更安全、速度更快,而且生成的密钥更短。如果你需要兼容一些非常老旧的系统,也可以用 ssh-keygen -t rsa -b 4096。
命令执行后,系统会问你保存路径,默认保存在 C:\Users\你的用户名\.ssh\id_ed25519,直接回车即可。接着会让你设置一个私钥密码(passphrase),笔者强烈建议你设置一个!这相当于给私钥本身再加一道锁,就算私钥文件泄露,对方没有密码也白搭。
macOS / Linux 用户
打开终端,执行同样的命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
流程完全一样。生成后,你会在 ~/.ssh/ 目录下看到两个文件:id_ed25519(私钥)和 id_ed25519.pub(公钥)。
第二步:把公钥部署到云服务器上
这一步就是把你的“锁芯”装到服务器门上。假设你的服务器 IP 是 123.123.123.123,用户名是 root(建议之后禁用 root 直接登录,但初期先搞定密钥)。
方法一:一键部署(推荐)
在本地终端执行:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@123.123.123.123
这个命令会自动把你的公钥追加到服务器上 ~/.ssh/authorized_keys 文件中。如果提示你输入密码,输入服务器的 root 密码即可。
方法二:手动复制粘贴
如果 ssh-copy-id 用不了,可以手动操作:
- 在本地查看公钥内容:
cat ~/.ssh/id_ed25519.pub,复制输出的整段文本。 - SSH 登录到服务器(用密码),执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "这里粘贴你复制的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
注意,chmod 权限设置非常关键,如果权限不对,SSH 服务会直接忽略这个文件。
第三步:测试密钥登录,然后彻底禁用密码
现在,在本地尝试用密钥登录:
ssh root@123.123.123.123
如果一切正常,你应该直接登录进去,不再需要输入密码(除非你设置了私钥密码,那就只需要输入那个密码)。
确认密钥登录没问题后,最狠的一步来了:编辑 SSH 配置文件,彻底堵死密码登录这条路。
sudo vim /etc/ssh/sshd_config
找到并修改以下几行:
# 禁用 root 密码登录(强烈建议同时禁用 root 直接登录,用普通用户+sudo)
PermitRootLogin prohibit-password
# 关闭密码认证
PasswordAuthentication no
# 关闭空密码
PermitEmptyPasswords no
# 启用公钥认证(确保是 yes)
PubkeyAuthentication yes
保存退出后,重启 SSH 服务:
sudo systemctl restart sshd
现在,再试试用密码登录——系统会直接拒绝连接。至此,你的服务器已经对暴力破解说“不”了。
进阶加固:修改端口与二次验证
虽然密钥已经足够安全,但黑客的扫描脚本依然会孜孜不倦地尝试连接 22 端口。为了减少日志噪音,我们还可以把 SSH 端口改掉。
在 /etc/ssh/sshd_config 中找到 #Port 22,改成 Port 2222(或者其他 1024-65535 之间的端口)。记得在云服务商的安全组/防火墙规则中放行新端口,并关闭旧端口。关于防火墙的详细配置,可以参考我们之前写过的 别再裸奔了!Linux服务器安全加固与UFW防火墙配置,这些坑我替你踩过了,那里有更全面的安全策略。
如果你追求极致安全,还可以考虑配合 Fail2Ban 或 Google Authenticator 做二次验证。不过对于大多数个人站长来说,密钥登录 + 修改端口已经足够应对 99% 的扫描攻击。
常见翻车现场与修复
| 症状 | 原因 | 解决方案 |
|---|---|---|
| 登录时提示“Permission denied (publickey)” | 公钥未正确部署,或 authorized_keys 权限不对 |
检查 ~/.ssh 权限是否为 700,authorized_keys 是否为 600,并确认公钥内容准确 |
| 修改配置后无法登录 | 配置语法错误,或防火墙未放行新端口 | 使用云厂商的 VNC 控制台登录服务器,检查 /etc/ssh/sshd_config 语法,或者回退配置重启服务 |
| 提示“Bad owner or permissions on .ssh/config” | 本地 .ssh 目录或私钥文件权限过松 |
在本地执行 chmod 600 ~/.ssh/id_ed25519 和 chmod 700 ~/.ssh |
写在最后:安全是一套组合拳
配置好 SSH 密钥登录,只是服务器安全万里长征的第一步。接下来你还需要关注 Web 服务的安全、数据库的安全、以及定期备份。比如,当你搭建好网站后,可以参考 从裸机到HTTPS:Nginx反向代理配置与免费SSL证书签发,手把手教你搞定 给你的站点加上 HTTPS 加密。
如果你的网站是 WordPress 搭建的,别忘了用 网站慢如蜗牛?用Redis缓存加静态资源优化,让你的WordPress飞起来 提升性能。
最后,选一台靠谱的服务器是这一切的基础。如果你还在纠结配置,不妨看看 腾讯云4核4G轻量服务器性能深度实测:跑分、压测与真实项目部署全记录,了解真实性能表现再做决定。
从今天起,关掉密码,用密钥守护你的服务器。你会发现,世界清静了许多。