核心是通过 ssh-agent 缓存本地私钥并逐跳启用 ForwardAgent,配合 ProxyJump 实现认证能力透传而非密钥复制;需配置客户端 ~/.ssh/config、服务端 sshd_config,并验证各跳 SSH_AUTH_SOCK 与 ssh-add -l。

核心是让本地私钥始终不离开本机内存,靠 ssh-agent 缓存解密后的密钥,并通过逐跳显式开启 ForwardAgent,配合 ProxyJump 实现自动穿透。不是复制密钥,而是透传认证能力。
启动并加载本地 ssh-agent
确保每次会话开始时 agent 已就位且密钥已加载:
- 执行 eval "$(ssh-agent -s)" 启动 agent(Bash/Zsh 推荐);
- 运行 ssh-add ~/.ssh/id_rsa_bastion1 和 ssh-add ~/.ssh/id_rsa_bastion2 分别加载不同跳板机对应的私钥(带密码的只输一次);
- 验证:执行 ssh-add -l 应列出全部密钥,echo $SSH_AUTH_SOCK 输出非空路径。
用 ~/.ssh/config 管理多跳转发链路
硬编码 -A 或 -J 容易遗漏、难维护,config 文件才是集中控制的关键:
- 为每台跳板机单独定义 Host 块,并显式设置 ForwardAgent yes;
- 内网目标服务器用 ProxyJump 指定上一跳,转发链自动延续;
- 若需从跳板机 B 再连第三层机器 C,必须在 B 对应的 Host 块中也加 ForwardAgent yes,否则中断。
示例配置:
Host bastion1
HostName 203.0.113.10
User admin
IdentityFile ~/.ssh/id_rsa_bastion1
ForwardAgent yes
Host bastion2
HostName 203.0.113.20
User ops
IdentityFile ~/.ssh/id_rsa_bastion2
ForwardAgent yes
Host db-server
HostName 10.20.30.100
User dbuser
ProxyJump bastion1
Host cache-server
HostName 172.16.5.50
User cacheadmin
ProxyJump bastion2
服务端必须配合的安全限制
仅客户端配置不够,跳板机本身要守住边界:
- 编辑 /etc/ssh/sshd_config,确认含 AllowAgentForwarding yes(默认开启,但加固模板常关闭);
- 强制禁用密码登录:PasswordAuthentication no;
- 禁止 root 登录:PermitRootLogin no;
- 检查用户目录和 ~/.ssh/authorized_keys 权限是否为 700 和 600,否则 SSH 拒绝读取;
- 防火墙只放行可信 IP 访问跳板机 SSH 端口,建议改非标端口(如 2222)。
验证转发是否真正抵达目标端
能登录不等于转发成功,要确认签名能力已到最末端:
- 登录 bastion1 后执行 echo $SSH_AUTH_SOCK,有输出才说明 agent 已透传至此;
- 从 bastion1 连 db-server 时加 -o LogLevel=DEBUG2,日志中出现 key: /home/user/.ssh/id_rsa (0x) 表示密钥已识别;
- 在 db-server 上运行 ssh-add -l,若列出密钥,说明整条链路完整生效。

















