最推荐直接使用 SSH 客户端的 -J 参数进行临时连接,若需长期维护则写入 ~/.ssh/config 配置文件,适用于需要通过堡垒机访问内网服务器的运维场景。
先说结论:ProxyJump 是 OpenSSH 7.3+ 内置的标准功能,无需额外安装工具,配置正确后可直接穿透跳板机。
- 适合:需要通过单一或多级跳板机访问内网目标机的场景
- 先看:本地 SSH 客户端版本是否支持 ProxyJump 指令(OpenSSH 7.3+)
- 建议:优先使用密钥认证,避免在跳板机层输入密码导致自动化中断
命令速用版
ssh -J [跳板机用户@跳板机 IP: 端口] -p [目标机端口] [目标机用户@目标机 IP]
例如:
ssh -J admin@192.168.1.100:22 -p 22 root@10.0.0.5
注意:目标主机端口应使用 -p 参数指定,而非直接拼接在 IP 后,否则部分客户端会解析失败。
为什么会这样
传统方式需要先用 SSH 登录跳板机,再从跳板机 SSH 登录目标机,操作繁琐且难以直接使用本地端口转发。ProxyJump 利用 SSH 协议的隧道能力,在本地客户端与目标机之间建立一条经过跳板机转发的加密通道,对使用者而言就像直接连接目标机一样。
分步处理
1. 检查客户端支持情况
在终端输入 ssh -V 查看版本,OpenSSH 7.3 及以上版本支持该功能。若版本过老,需考虑升级客户端或使用 ProxyCommand 替代。
2. 配置免密登录(可选但推荐)
确保本地公钥已添加到跳板机和目标机的 authorized_keys 中,否则每次连接可能需要输入两次密码。
3. 写入配置文件
编辑 ~/.ssh/config 文件,添加以下内容:
Host target-server
HostName 10.0.0.5
User root
ProxyJump admin@192.168.1.100
Port 22
配置完成后,只需执行 ssh target-server 即可自动经过跳板机连接。
怎么验证是否生效
1. verbose 模式观察
使用 ssh -v target-server 命令,观察日志中是否显示连接到跳板机 IP 的过程,以及后续连接到目标机 IP 的过程。
2. 确认主机身份
连接成功后,执行 hostname 或 ifconfig 命令,确认当前所在机器是目标内网机器而非跳板机。
常见坑
- 密钥代理转发:若需在目标机上操作 git 等需要密钥的服务,需在配置中添加 ForwardAgent yes,但需注意安全风险。
- 网络策略限制:部分公司网络禁止 SSH 隧道,若连接被重置,需确认网络安全组或防火墙是否允许该流量。
排查命令:telnet 192.168.1.100 22 或 nc -zv 192.168.1.100 22,若无法连通则说明网络策略拦截。 - 旧版本兼容:若连接报错 Unsupported option,说明客户端版本过低,不支持 ProxyJump 指令。
典型报错:debug1: Unsupported option "ProxyJump" 或 ssh: Unsupported option "ProxyJump"。 - 端口语法错误:目标主机端口不要写成 user@host:port 格式,应使用 -p 参数,否则可能报错 ssh: Could not resolve hostname。