ssh代理转发实现多跳访问的核心是本地一次命令直达最内层服务器,全程加密、私钥不离本机、无需手动中转;需满足openssh≥7.3、逐层网络连通、密钥权限600及跳板机allowtcpforwarding yes三要素,并通过~/.ssh/config中proxyjump链式配置(如host final proxyjump jump2)实现ssh final一键连接,同时兼容scp、sftp、vs code等工具。

用 SSH 代理转发实现多跳访问,核心是让本地一次命令直达最内层服务器,全程加密、不暴露私钥、不手动中转。关键不在“连得上”,而在链路稳、权限严、配置可维护。
确认基础前提:三要素缺一不可
版本、连通性、密钥权限必须全部就位,否则连接直接失败:
- 本地和所有跳板机的 OpenSSH ≥ 7.3(运行 ssh -V 和 sshd -V 2>&1 | head -1 验证);
- 逐层网络连通:本地能直连 jump1,jump1 能通 jump2,jump2 能通目标(建议用 ssh -o ConnectTimeout=5 user@ip exit 逐段测试);
- 每段连接的私钥已就位,且权限严格设为 600(chmod 600 ~/.ssh/id_rsa_jump1),否则报 “Permissions are too open”;
- 所有跳板机的 /etc/ssh/sshd_config 中启用 AllowTcpForwarding yes(默认开启,但隔离环境常被关闭)。
推荐配置方式:~/.ssh/config 文件集中管理
比命令行更清晰、可复用、易协作。以三层链路为例(本地 → jump1 → jump2 → final):
在 ~/.ssh/config 中写入:
Host jump1 HostName 203.0.113.10 User juser1 Port 2222 IdentityFile ~/.ssh/id_rsa_jump1 Host jump2 HostName 10.1.1.20 User juser2 Port 22 IdentityFile ~/.ssh/id_rsa_jump2 ProxyJump jump1 Host final HostName 172.16.5.100 User dbadmin Port 2201 IdentityFile ~/.ssh/id_rsa_final ProxyJump jump2
保存后执行 chmod 600 ~/.ssh/config。之后只需运行 ssh final,SSH 自动串联三层加密通道。
支持全工具链:scp、sftp、VS Code、Jupyter 等无缝接入
ProxyJump 不仅适用于 ssh 登录,也原生兼容其他基于 SSH 的工具:
- 上传文件:scp -o ProxyJump=jump2 model.pth dbadmin@final:/data/;
- 远程同步目录:rsync -avz -e "ssh -o ProxyJump=jump2" ./local/ dbadmin@final:/remote/;
- VS Code Remote-SSH 插件中直接填写 final 主机名,自动走完整链路;
- 映射 Jupyter 端口:ssh -L 8888:localhost:8888 -o ProxyJump=jump2 dbadmin@final,本地浏览器访问 http://localhost:8888 即可。
需要全局代理时:建立 SOCKS5 动态隧道
当浏览器、curl、apt 等非 SSH 工具也要走跳板链时,需启动动态端口转发:
- 在本地执行:ssh -f -N -D 1080 -J juser2@10.1.1.20,juser1@203.0.113.10 dbadmin@172.16.5.100(注意逗号分隔,顺序由近到远);
- 设置环境变量:export ALL_PROXY="socks5h://127.0.0.1:1080"(必须用 socks5h,确保 DNS 由 final 主机解析);
- 验证:curl --proxysocks5h://127.0.0.1:1080 https://ifconfig.me 应返回 final 主机的出口 IP。











