求助:通过两台跳转主机的SSH单行命令连接链无法正常工作
解决SSH多节点跳转(PC→Jumphost→Bastion→应用X)的连接问题
我帮你梳理下这个多节点SSH跳转的问题,你的场景是PC→Jumphost(用私钥A、端口24)→Bastion(用私钥B、端口22)→应用X(和Bastion同子网、用私钥B),原命令主要栽在嵌套ProxyCommand的引号转义混乱,以及密钥没对应到正确节点上了,给你两种靠谱的解决方案:
一、先理清楚各节点的认证规则
- Jumphost:端口24,用私钥A(
/path_to_key_jump/id_rsa),用户名jumphostuser,地址jumphostdomain - Bastion:端口22,用私钥B(
/path_to_bastion_key/id_rsa),用户名bastionuser,地址ip_to_bastion - 应用X:和Bastion同子网,用私钥B(
/path_to_priv_key_for_X/id_rsa,如果和Bastion的私钥是同一个,直接复用就行),用户名myappuser,地址subnet_ip
二、修正后的单行命令
我调整了引号的使用逻辑(用单引号避免内层转义混乱),同时把密钥绑定到了对应的跳转环节,你可以直接用:
ssh -i /path_to_priv_key_for_X/id_rsa -o StrictHostKeyChecking=no \ -o ProxyCommand="ssh -i /path_to_bastion_key/id_rsa -W %h:%p bastionuser@ip_to_bastion -o ProxyCommand='ssh -p 24 -i /path_to_key_jump/id_rsa -W %h:%p jumphostuser@jumphostdomain'" \ myappuser@subnet_ip
简单解释下:
- 最外层
ssh负责连接应用X,用私钥B - 第一层
ProxyCommand负责连接Bastion,用私钥B,同时指定连接Bastion需要先跳Jumphost - 第二层
ProxyCommand负责连接Jumphost,用私钥A,端口24
三、更推荐的方式:配置~/.ssh/config
单行命令太容易写错,而且每次输这么长也麻烦,我强烈建议你把跳转规则写到~/.ssh/config里,以后连应用X直接敲ssh appX就行:
打开~/.ssh/config(没有的话直接创建),添加以下内容:
# 配置Jumphost节点 Host jumphost HostName jumphostdomain User jumphostuser Port 24 IdentityFile /path_to_key_jump/id_rsa StrictHostKeyChecking no # 配置Bastion节点,通过Jumphost跳转 Host bastion HostName ip_to_bastion User bastionuser Port 22 IdentityFile /path_to_bastion_key/id_rsa ProxyCommand ssh -W %h:%p jumphost StrictHostKeyChecking no # 配置应用X节点,通过Bastion跳转 Host appX HostName subnet_ip User myappuser IdentityFile /path_to_priv_key_for_X/id_rsa ProxyCommand ssh -W %h:%p bastion StrictHostKeyChecking no
配置好后,只需要执行这条简单的命令就能连接应用X:
ssh appX
这种方式不仅简洁,后续修改节点信息(比如换端口、换密钥)也更方便,还能彻底避免引号转义的坑。
额外注意事项
- 所有私钥文件的权限必须是
600,不然SSH会拒绝使用:执行chmod 600 /path_to_your_keys/id_rsa - 如果Bastion和应用X用的是同一个私钥B,可以把应用X的
IdentityFile指向Bastion的私钥路径,减少重复配置 - 如果还是连不上,可以逐步排查:先单独测试
ssh jumphost,再测试ssh bastion,最后测试ssh appX,看哪个环节出问题
内容的提问来源于stack exchange,提问作者Mika Koskimaki
相关产品推荐
相关产品推荐

