一句话总结:唯一能稳定实现多级SSH跳转,并完美支持scp、sftp及ssh-agent透传功能的方案,只有ProxyJump。但要成功配置,必须满足三个硬性条件:所有节点的OpenSSH均需≥7.3、配置文件格式零差错(Host顶格、空格缩进、权限600)、以及逐跳验证网络连通性。

ProxyJump是必选项,不建议用ProxyCommand或嵌套ssh
说真的,市面上能实现多级跳转的方案就那么几种,但真正经受住生产环境考验的只有ProxyJump。为什么?因为它原生支持scp、sftp和ssh-agent透传——这几个功能在实际运维中几乎每天都要用到。有些人喜欢用ProxyCommand ssh -W %h:%p jump1,或者手勤快一点:ssh jump1 && ssh target。乍一看也能通,但用不了多久就会踩坑:中间节点脱离首层审计、scp执行到一半卡死、ssh-add -l在目标机上死活看不到密钥……这些不是配置没调好,而是设计层面就没打算支持。
常见的翻车现场包括:
- 执行
scp file.txt target:命令后一直卡住,加-v一看,只连了跳板机,根本没走第二跳 - 用
ssh target登录成功,但运行git clone时报“Permission denied (publickey)”——原因是agent没透传过去 - 日志里找不到
debug1: Setting implicit ProxyJump,说明跳板逻辑压根没被启用
所有节点(本地及每台跳板机)均需OpenSSH 7.3或更高版本
光本地升级到新版本还不够——跳板机上的sshd服务端也必须至少7.3。如果跳板机版本低于这个门槛,ProxyJump配置会被直接忽略,而且不会报错。你会看到“连接超时”或“Connection refused”,实际上它已经静默退化为直连,绕过了跳板。
验证方法很简单:
- 本地:跑
ssh -V,输出里要有OpenSSH_7.3p1或更高 - 每台跳板机:登录后执行
sshd -V 2>&1 | head -1(注意不是ssh -V,很多人在这一步搞混) - Ubuntu/Debian升级命令:
sudo apt update && sudo apt install openssh-client openssh-server - RHEL/CentOS 7+升级命令:
sudo yum update openssh*或sudo dnf upgrade openssh*
~/.ssh/config文件格式瑕疵会导致策略静默失效
ProxyJump对配置格式的敏感程度远超想象。多一个空格、混入Tab键、权限不对,SSH会直接跳过整段配置,连个提示都不给你。就像把钥匙插错锁孔,门不开,还不告诉你钥匙插错了。
需要特别注意的几点:
Host行必须顶格写,HostName、User等字段必须缩进(只用空格,禁用Tab)ProxyJump的值只能是一个Host别名,比如ProxyJump jump1✅,ProxyJump = jump1❌,ProxyJump jump1,jump2❌- 每个私钥路径要单独指定:
IdentityFile ~/.ssh/id_ed25519_jump1和IdentityFile ~/.ssh/id_ed25519_target不能重复用同一个文件 - 权限必须严格设为
600:chmod 600 ~/.ssh/config ~/.ssh/id_*.pub ~/.ssh/id_*
下面是一个正确的配置示例:
Host jump1 HostName 203.0.113.10 User juser1 IdentityFile ~/.ssh/id_ed25519_jump1 Host jump2 HostName 10.1.1.20 User juser2 IdentityFile ~/.ssh/id_ed25519_jump2 ProxyJump jump1 Host target HostName 172.16.5.100 User appadmin IdentityFile ~/.ssh/id_ed25519_target ProxyJump jump2
网络连通性需要逐跳逐一验证
配置文件写得再漂亮,网络不通一切白搭。跳板链是线性的:本地 → jump1 → jump2 → target,中间任何一段断掉,整条链就卡在那。很多人只验证了本地到jump1,忽略了后面两跳。
建议按这个顺序依次检查:
- 本地能不能
ssh jump1? - 从jump1能不能
ssh jump2?(这里要注意:jump2的IP通常是内网地址,jump1必须能直连它) - 从jump2能不能
ssh target?(同理,target的IP对jump2必须可达) - 所有跳板机的防火墙都要放行对应端口(默认22),云平台的安全组也得同步开放
最容易踩坑的是jump2到target这一段——它不在本地网络里,没法直接用ping测试,只能登录jump2后手动ssh过去看看。
