VPS 服务器直接暴露在公网环境中,每天都会面临大量的暴力破解尝试。如果你查看过系统的登录日志,就会发现有无数陌生 IP 在不停地尝试登录你的服务器。

常规的密码登录,即使密码再复杂,传统的登录方式仍存在被破解的风险。而 SSH 密钥采用公钥与私钥的加密机制,几乎无法被暴力破解,能够大幅提升 VPS 的整体安全性。

这篇教程会教你如何在 Linux VPS 上完整配置 SSH 密钥登录。我会详细讲解密钥的生成方法、上传步骤,以及如何禁用密码登录来加强安全防护。

生成 SSH 密钥对

在配置密钥登录之前,我们首先需要在本地电脑上生成一对 SSH 密钥。这对密钥包括公钥私钥两部分:私钥保存在你的电脑上,公钥则需要上传到 VPS 服务器。

简单来说,公钥就像一把锁,而私钥就是唯一配套的钥匙。只有掌握私钥的人才能打开公钥这把“锁”完成身份验证。由于采用了非对称加密机制,这种方式几乎无法被暴力破解。

打开命令行工具

Windows 系统:

按下 Win + R 键,输入 cmdpowershell,打开命令行窗口。如今在用的 Windows 10 和 Windows 11 已经内置了 SSH 客户端,可以直接使用。

如果你仍在使用 Win7 或精简版系统,缺少内置的 SSH 命令,可以有两种方式解决:一种是在 Linux VPS 上生成密钥,再将私钥下载到本地供 SSH 客户端使用;另一种是使用 PuTTY 等工具在本地直接生成密钥。

Mac 和 Linux 系统:

打开终端(Terminal)应用即可,系统自带 SSH 工具。

执行生成命令

不管你用的是哪个系统,生成密钥的命令都是一样的。在命令行中输入:

ssh-keygen -t rsa -b 4096

执行命令后,会依次出现以下提示:

  1. 选择保存路径:系统会询问你要把密钥保存在哪里,直接按回车键使用默认位置就行
  2. 设置密钥密码:这是给私钥加的额外保护。你可以输入一个密码提高安全性,也可以直接回车跳过。
  3. 确认密码:如果上一步设置了密码,这里需要再输入一次确认

生成完成后,你会看到类似这样的提示信息,表示密钥已经创建成功。此时会生成两个文件:

  • id_rsa - 这是私钥文件,千万不能泄露给别人
  • id_rsa.pub - 这是公钥文件,需要上传到服务器

关于密钥类型的说明

上面我们使用的是 RSA 算法,密钥长度为 4096 位。这是目前最常用且安全性很高的配置。如果你想使用更现代的算法,也可以选择 Ed25519:

ssh-keygen -t ed25519

Ed25519 密钥更短,但安全性同样出色,而且验证速度更快。不过需要注意,一些较老的系统可能不支持这种算法。对于大多数用户来说,使用 RSA 4096 位就完全够用了。

查看公钥内容

生成密钥后,你需要查看公钥的内容,后面要把它复制到服务器上。

Windows 系统:

密钥默认保存在 C:\Users\你的用户名\.ssh\ 目录下。使用以下命令查看公钥:

type %USERPROFILE%\.ssh\id_rsa.pub

Mac 和 Linux 系统:

密钥默认保存在 ~/.ssh/ 目录下。使用以下命令查看公钥:

cat ~/.ssh/id_rsa.pub

执行命令后,你会看到一长串字符,这就是公钥内容。它通常以 ssh-rsa 开头,以你的用户名和主机名结尾。

到这里,SSH 密钥对就生成完成了。接下来我们需要把公钥上传到 VPS 服务器上。

上传公钥到 VPS

生成密钥对之后,下一步就是把公钥上传到 VPS 服务器。公钥需要保存在服务器的特定位置,SSH 服务才能读取并验证你的身份。

方法一:使用命令快速上传(推荐)

这是最简单快捷的方法,只需一条命令,就能将默认位置的公钥上传到服务器并自动完成权限设置。

Mac 和 Linux 系统:

ssh-copy-id root@你的服务器IP

将命令中的 “你的服务器IP” 替换成实际的 IP 地址。例如:

ssh-copy-id root@192.168.1.15

执行命令后,会提示你输入服务器密码。输入正确的密码后,公钥就会自动上传到服务器的 ~/.ssh/authorized_keys 文件中,并且权限也会自动设置好。

如果在生成密钥时没有使用默认路径,而是指定了自定义的保存位置,需要在命令中加上 -i 参数指定公钥文件。例如,你把密钥保存在了 ~/my_keys/my_key.pub,命令应该是:

ssh-copy-id -i ~/my_keys/my_key.pub root@192.168.1.15

Windows 系统默认没有 ssh-copy-id 命令,但如果你安装了 Git for Windows 或使用 PowerShell 7 以上版本,也可以使用类似的命令。不过为了保证兼容性,Windows 用户建议使用下面的手动上传方法。

方法二:手动上传公钥

如果你的系统不支持 ssh-copy-id 命令,或者上面的方法执行失败,可以采用手动上传的方式。

第一步:复制公钥内容

首先查看并复制你的公钥内容。

Windows 系统:

type %USERPROFILE%\.ssh\id_rsa.pub

Mac 和 Linux 系统:

cat ~/.ssh/id_rsa.pub

把显示出来的全部内容复制下来,从 ssh-rsa 开头到最后的用户名都要复制完整。

第二步:登录 VPS 服务器

使用密码方式登录到你的 VPS:

ssh root@你的服务器IP

输入密码后登录成功。

第三步:创建 .ssh 目录

如果服务器上还没有 .ssh 目录,需要先创建:

mkdir -p ~/.ssh

这个命令会在用户主目录下创建 .ssh 文件夹,如果已存在则不会报错。

第四步:将公钥添加到 authorized_keys 文件

使用以下命令打开或创建 authorized_keys 文件:

nano ~/.ssh/authorized_keys

这会打开一个文本编辑器。把刚才复制的公钥内容粘贴进去,确保公钥占一整行,不要有多余的换行或空格。

粘贴完成后,按 Ctrl + O 保存文件,再按 Ctrl + X 退出编辑器。

如果你不习惯使用 nano 编辑器,也可以用 vi 或直接用命令追加:

echo "你的公钥内容" >> ~/.ssh/authorized_keys

记得把 “你的公钥内容” 替换成实际复制的公钥字符串。

第五步:设置正确的权限

这一步非常重要!SSH 对文件权限有严格要求,如果权限设置不对,密钥登录会失败。执行以下命令设置权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

这两条命令的作用是:

  • chmod 700.ssh 目录只有所有者可以读写和执行
  • chmod 600authorized_keys 文件只有所有者可以读写

权限设置完成后,公钥就成功上传到服务器了。

验证密钥配置是否成功

不要着急退出服务器,我们先测试一下密钥登录是否正常工作。

保持当前 SSH 连接不断开,另外再打开一个新的命令行窗口 ,尝试使用密钥方式登录服务器。如果你使用的是图形化 SSH 客户端,只需在配置中选择你的私钥文件即可(公钥通常与私钥保存在同一目录)。

ssh root@你的服务器IP

如果配置正确,这次登录应该不需要输入密码(如果你给私钥设置了密码,则需要输入私钥密码)。

如果能够成功登录,说明密钥配置已经生效。如果登录失败,仍然提示输入密码,可以检查以下几点:

  • 公钥内容是否完整复制到 authorized_keys 文件
  • 文件和目录权限是否设置正确
  • 公钥内容是否占用一整行,中间没有多余换行

确认密钥登录正常后,我们就可以进行下一步的安全加固设置了。

禁用密码登录,加固服务器安全

确认密钥登录可以正常使用后,我们需要完成最重要的一步:禁用密码登录 。只要密码登录还开着,攻击者就有可能通过暴力破解的方式进入你的服务器。

为什么要禁用密码登录

虽然你已经配置了密钥登录,但如果不关闭密码登录功能,服务器仍然会接受密码验证。这意味着:

  • 攻击者可以继续尝试暴力破解你的密码
  • 你的服务器日志还会被大量失败登录记录填满
  • 服务器的安全风险并没有真正降低

只有彻底禁用密码登录,才能让密钥成为唯一的登录方式,从根本上杜绝暴力破解的可能。

修改 SSH 配置文件

第一步:备份配置文件

在修改任何系统配置之前,养成备份的习惯总是好的。先登录到 VPS 服务器,然后执行:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

这样如果修改出现问题,你还可以恢复到原来的配置。

第二步:编辑 SSH 配置

使用文本编辑器打开 SSH 配置文件:

sudo nano /etc/ssh/sshd_config

在配置文件中,找到以下几个关键配置项并进行修改。找到 PasswordAuthentication 这一行,修改为:

PasswordAuthentication no

如果这一行前面有 # 符号,需要把 # 删掉。# 表示注释,带有 # 的配置不会生效。

如果你想进一步提升安全性,可以禁用 root 的密码登录(可选但推荐) 。找到 PermitRootLogin 这一行,将其修改为相应的禁用配置。

PermitRootLogin prohibit-password

目前这个设置表示 root 用户只能通过密钥登录,不能使用密码。如果你想完全禁止 root 登录,可以设置为 no,但需要注意,在禁用 root 登录前务必确保你已经拥有可正常使用的其他登录账号。

第三步:保存配置

修改完成后,按 Ctrl + O 保存文件,再按 Ctrl + X 退出编辑器。

重启 SSH 服务

配置文件修改后,需要重启 SSH 服务才能让新配置生效。

Ubuntu/Debian 系统:

sudo systemctl restart sshd

或者:

sudo service ssh restart

CentOS/RHEL 系统:

sudo systemctl restart sshd

执行重启命令后,SSH 服务会在几秒钟内重新启动。注意,重启 SSH 服务不会断开你当前的连接,所以不用担心被"锁在门外"。

测试新配置

重启 SSH 服务后,务必进行测试,确保一切正常。

保持当前连接不要断开 ,打开一个新的命令行窗口,尝试使用密钥登录:

ssh root@你的服务器IP

如果能够正常登录,说明密钥登录工作正常。

接下来测试密码登录是否已经被禁用。你可以尝试用密码登录,系统应该会拒绝并提示"Permission denied"。

常见问题解答

在配置 SSH 密钥登录的过程中,你可能会遇到一些问题。这里整理了最常见的几个疑问和解决方法。

1. 提示 “Permission denied (publickey)” 无法登录怎么办?

这个错误通常有三个原因:

权限设置不正确: 这是最常见的问题。执行以下命令重新设置权限。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

公钥内容有问题: 检查 authorized_keys 文件,确保公钥占据完整的一行,没有多余的换行或空格。

公钥认证未开启: 确认服务器 SSH 配置中 PubkeyAuthentication yes 是开启状态,修改后要重启 SSH。

2. 可以在多台电脑上使用同一个密钥吗?

技术上可以,但不建议 。如果其中一台电脑丢失或被入侵,所有服务器都会面临风险。

更好的做法是: 为每台电脑生成独立的密钥对,然后把所有公钥都添加到服务器的 authorized_keys 文件中(每行一个公钥)。这样既方便管理,又能保证安全性。

3. 私钥文件丢了怎么办?

私钥丢失后无法恢复,这个密钥就作废了。

如果你还能通过其他方式登录服务器(密码登录或 VNC 控制台),立即生成新的密钥对并上传新公钥。如果完全无法登录,只能联系服务商重置。

预防措施: 定期备份私钥到安全的地方,或者为服务器配置多个密钥作为备用。

4. 密钥登录速度很慢怎么解决?

通常是 DNS 反向解析导致的。编辑服务器的 SSH 配置文件:

sudo nano /etc/ssh/sshd_config

添加或修改:

UseDNS no

保存后重启 SSH 服务即可:

sudo systemctl restart sshd

5. 如何在一台电脑上管理多个密钥?

可以通过 SSH 配置文件来管理。编辑本地的 ~/.ssh/config 文件:

Host server1
    HostName 192.168.1.100
    User root
    IdentityFile ~/.ssh/id_rsa_server1

Host server2
    HostName 192.168.1.101
    User root
    IdentityFile ~/.ssh/id_rsa_server2

配置好后,直接用 ssh server1ssh server2 就能登录,系统会自动使用对应的密钥。