一、前言与实验环境
SSH 免密登录是管理 Linux 服务器的必备技能。本文采用 VMware 虚拟机,以 Rocky 10(客户端) 和 Ubuntu 24.04(服务端) 为例,一步步带你完成配置。文章末尾附有高频错误排查清单,即使出现意外也能快速解决。
| 角色 | 操作系统 | 主机名 | IP 地址 |
|---|---|---|---|
| 客户端 | Rocky 10 | rocky10 | 10.0.0.12 |
| 服务端 | Ubuntu 24.04 | ubuntu24 | 10.0.0.13 |
说明:你的 IP 可能不同,请用
ip a查看实际地址,并确保两台虚拟机能够互相ping通。
二、第一步:关闭干扰服务(两台都要做)
为避免防火墙和安全模块干扰 SSH 连接,实验阶段先临时关闭它们。
Rocky 10 上执行:
sudo systemctl stop firewalld # 关闭防火墙
sudo setenforce 0 # 临时关闭 SELinux
Ubuntu 24.04 上执行:
sudo ufw disable # 关闭 UFW 防火墙
sudo systemctl stop apparmor # 关闭 AppArmor
sudo systemctl disable apparmor # 防止重启后自动开启
📌 易错点:
- 命令
setenforce 0只是临时关闭 SELinux,重启后会恢复。实验够用,生产环境请配置策略。 - AppArmor 拼写容易错,注意是
apparmor,不是appror。
三、第二步:检查 .ssh 目录
分别在两台机器上执行:
ls -la ~/.ssh
- Rocky 10 默认可能没有
.ssh目录,或目录为空。 - Ubuntu 24.04 一般存在
.ssh目录,且会有一个内容为空的authorized_keys文件。
如果目录不存在,无需手动创建,后续 ssh-keygen 或 ssh-copy-id 会自动处理。
📌 易错点:
- 命令是
ls -la(显示隐藏文件及详细信息),不是ls -a后再ls .ssh/。一步到位更清晰。 authorized_keys文件即使存在,权限必须为 600,目录权限必须为 700,否则 SSH 拒绝认证。我们后面会提到。
四、第三步:在客户端(Rocky 10)生成密钥对
在 Rocky 10 终端执行:
ssh-keygen -t ed25519

-t ed25519指定使用 Ed25519 算法(比 RSA 更快更安全,默认就生成此类型)。- 出现三次询问:
Enter file in which to save the key→ 直接回车,使用默认路径~/.ssh/id_ed25519Enter passphrase→ 直接回车,不设密码(实验方便,生产建议设置)Enter same passphrase again→ 再次回车确认
完成后会在 ~/.ssh/ 下生成:
id_ed25519:私钥(自己保管,不可外传)id_ed25519.pub:公钥(需要放到服务端)
📌 易错点:
- 如果你希望生成 RSA 密钥,可以用
-t rsa -b 4096,但 Ed25519 是当前推荐算法。 - 私钥权限必须是 600,否则 SSH 客户端会拒绝使用。如果后续连不上,可以执行
chmod 600 ~/.ssh/id_ed25519修复。
五、第四步:将公钥复制到 Ubuntu 服务端
在 Rocky 10 上执行:
ssh-copy-id root@10.0.0.13

系统交互:
- 提示
Are you sure you want to continue connecting (yes/no)?→ 输入yes(首次连接需确认主机指纹)。 - 输入 Ubuntu 服务器
root用户的密码。
成功后,公钥会自动追加到 Ubuntu 的 ~/.ssh/authorized_keys 文件末尾。
验证公钥已送达:在 Ubuntu 上执行:
cat ~/.ssh/authorized_keys

你会看到一行以 ssh-ed25519 开头的字符串,那就是 Rocky 的公钥。
📌 易错点(非常关键):
- Ubuntu 默认禁止 root 通过 SSH 密码登录!
如果你在第四步输入 root 密码后提示Permission denied,说明 root 登录未开放。解决办法(二选一):- 方法 A(推荐新手):改用普通用户传输密钥。
先在 Ubuntu 上创建一个普通用户(如user),然后在 Rocky 上执行ssh-copy-id user@10.0.0.13,最后用ssh user@10.0.0.13验证。 - 方法 B:临时开启 root 密码登录。
编辑 Ubuntu 的/etc/ssh/sshd_config,找到PermitRootLogin改为yes(若为prohibit-password需改成yes),然后sudo systemctl restart sshd。实验后建议改回。
- 方法 A(推荐新手):改用普通用户传输密钥。
ssh-copy-id后仍然需要密码:
检查服务端.ssh目录权限(700)和authorized_keys文件权限(600)。修复命令:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys- 主机名解析问题:尽量使用 IP 地址避免 DNS 解析错误。如果提示
Could not resolve hostname,请检查 IP 是否写错。
六、第五步:验证免密登录
回到 Rocky 10 终端,输入:
ssh root@10.0.0.13
(如果使用了普通用户,则改为 ssh user@10.0.0.13)

若直接进入 Ubuntu 的 Shell 且未提示输入密码,恭喜,免密登录配置成功!
退出登录输入 exit 即可。
七、高频错误排查清单
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
ssh: connect to host port 22: Connection refused | 服务端 SSH 服务未启动 | Ubuntu: sudo systemctl start ssh ; Rocky: sudo systemctl start sshd |
| 仍然提示输入密码 | 公钥未正确复制或权限错误 | 重新执行 ssh-copy-id,并检查权限 |
Permission denied (publickey) | 私钥未加载或权限过宽 | 客户端执行 chmod 600 ~/.ssh/id_ed25519 |
Host key verification failed | 服务端重装系统后指纹变化 | 客户端执行 ssh-keygen -R 10.0.0.13 清除旧指纹 |
| 连接超时或 ping 不通 | 虚拟机网络设置错误 | 确认两台虚机网络适配器同为 NAT 或同为桥接模式,并处于同一网段 |
Rocky 端提示 firewall-cmd: command not found | 未安装 firewalld | 已执行 systemctl stop firewalld 即可,无需安装 |
八、拓展练习:双向免密登录
此时只是 Rocky 可以免密连接 Ubuntu。若想让 Ubuntu 也能免密连接 Rocky,只需将角色互换:
- 在 Ubuntu 上生成密钥对:
ssh-keygen -t ed25519 - 将公钥发给 Rocky:
ssh-copy-id rocky用户名@10.0.0.12 - 验证:
ssh rocky用户名@10.0.0.12
九、总结
就此我们学会了
- 临时关闭防火墙、SELinux/AppArmor 以排除干扰;
- 使用
ssh-keygen生成 Ed25519 密钥对; - 通过
ssh-copy-id安全地部署公钥; - 独立解决因权限、root 登录限制、网络等因素导致的登录失败问题。
动手实验一次,以后配置集群、使用自动化工具就能轻车熟路。如果有帮助,欢迎点赞收藏,遇到问题可以在评论区交流。
445

被折叠的 条评论
为什么被折叠?



