一、环境说明
本次实验基于两台 Linux 服务器,实现双向 SSH 免密互通,环境信息如下:
| 主机名 | IP 地址 | 子网 |
|---|---|---|
| node1 | 172.25.254.141 | /24 |
| node2 | 172.25.254.143 | /24 |
最终实现效果:
-
node1无需密码直接 SSH 连接node2 -
node2无需密码直接 SSH 连接node1
二、前置条件
-
两台服务器网络三层互通,可正常 Ping 通;
-
服务器防火墙已放行 SSH 服务(22 端口),无端口拦截;
-
两台节点
sshd服务正常运行; -
知晓对方节点 root 管理员密码(首次下发密钥需验证);
-
主机名与 IP 解析正常,支持使用主机名直接连接。
三、免密登录核心原理
SSH 免密登录基于非对称密钥认证实现,核心分为私钥、公钥两组密钥:
-
本地通过
ssh-keygen生成 私钥 + 公钥 密钥对; -
私钥:留存于本地服务器,相当于「身份钥匙」,严禁泄露;
-
公钥:分发至目标服务器,相当于「身份锁孔」,可安全分发;
-
目标服务器将客户端公钥写入授权文件
/root/.ssh/authorized_keys; -
后续建立 SSH 连接时,本地自动使用私钥签名,目标端通过公钥校验;
-
密钥配对验证通过后,无需输入账号密码,直接完成登录。
四、单向免密配置:node1 → node2
1、客户端生成SSH密钥对

在node1节点执行密钥生成命令:
ssh-keygen -t rsa -b 4096
命令参数解析:
| 部分 | 含义 |
|---|---|
ssh-keygen |
SSH密钥生成工具 |
-t rsa |
生成RSA类型的密钥(最常用) |
-b 4096 |
设定密钥长度4096位(越长越安全) |
交互过程详解(全程回车):
Enter file in which to save the key (/root/.ssh/id_rsa):
-
默认密钥存储路径,直接回车,使用默认目录:
/root/.ssh/;Enter passphrase (empty for no passphrase):
-
私钥无需设置密码,直接回车(设置密码则无法纯免密登录);
Enter same passphrase again:
-
二次确认密码,继续回车,完成密钥创建。
密钥文件说明:
| 文件类型 | 文件路径 | 核心作用 | 安全等级 |
|---|---|---|---|
| 私钥 | /root/.ssh/id_rsa | 本地身份凭证,用于加密签名 | 极高,禁止外泄 |
| 公钥 | /root/.ssh/id_rsa.pub | 对外分发,服务端用于身份校验 | 可公开,无安全风险 |
输出解释:
Your identification has been saved in /root/.ssh/id_rsa
私钥文件生成完成
Your public key has been saved in /root/.ssh/id_rsa.pub
公钥文件生成完成
The key fingerprint is:
SHA256:foEKb8FYbVx74w7qGa0HmMyIczZy+RsE89PzOXcFHQA root@node1
-
指纹:密钥的唯一标识(像身份证号)
-
用于验证密钥是否被篡改
The key's randomart image is:
+---[RSA 4096]----+
| .E.... |
| o . . ..|
| o . + . o . .|
| B o . o . . |
| .o=oS o . .|
| + B+==.= = . |
| * o= +. o . |
| ..o =.o . |
| ..+. |
+----[SHA256]-----+ -
随机艺术图:密钥的可视化表示,可忽略
2、推送本地公钥至目标节点

在 node1 执行公钥分发命令,将本地公钥写入 node2 授权文件:
ssh-copy-id root@node2
命令执行逻辑
-
读取本地公钥文件:
/root/.ssh/id_rsa.pub; -
通过账号密码临时 SSH 连接目标节点 node2;
-
自动创建
.ssh隐藏目录(目录不存在时); -
将本地公钥内容追加至目标端授权文件
authorized_keys; -
自动配置目录与文件权限,保障 SSH 安全策略校验。
交互操作
-
首次连接输入
yes确认主机指纹信任; -
输入 node2 节点 root 密码,完成密钥下发;
-
输出
Number of key(s) added: 1即为公钥推送成功。
在目标节点node2上发生了什么:
node2上的文件变化:
1. 创建了目录(如果不存在)
/root/.ssh/
2. 创建或修改了授权文件
/root/.ssh/authorized_keys
3. 文件内容类似:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD... root@node1
3、测试免密登录

连接流程
-
node1 调用本地私钥
id_rsa生成身份签名; -
签名信息发送至 node2 服务端;
-
node2 读取
authorized_keys内的公钥进行算法校验; -
校验匹配无误,直接放行,无需手动输入密码。
若直接进入 node2 命令行界面,无密码输入环节,代表单向免密配置成功。
五、反向免密配置:node2 → node1
如需实现双向免密互通 ,在 node2 节点重复上述全套操作即可:

1、生成密钥对
ssh-keygen -t rsa -b 4096
全程三次回车,生成 node2 本地密钥;
2、推送公钥至 node1
ssh-copy-id root@node1
输入 node1 的 root 密码,完成公钥授权;
3、反向连接测试
ssh root@node1
无需输入密码,直接登录即为配置生效。
现在的状态:
| 方向 | 是否免密 | 说明 |
|---|---|---|
| node1 → node2 | 是 | node1的公钥在node2的authorized_keys里 |
| node2 → node1 | 是 | node2的公钥在node1的authorized_keys里 |
六、双向验证:
在node1上测试:
ssh root@node2
# 应该直接输出:node2
在node2上测试:
ssh root@node1
# 应该直接输出:node1
两台节点执行远程命令无卡顿、无密码输入,说明双向 SSH 免密登录完全生效。
七、核心关键文件总结
-
密钥存储目录:
/root/.ssh/(所有 SSH 密钥、授权文件统一存放); -
本地私钥文件:
id_rsa,核心机密,权限严格管控; -
本地公钥文件:
id_rsa.pub,对外授权文件; -
远程授权文件:
authorized_keys,存放所有允许免密登录的客户端公钥。