注意:我使用的 OpenSSH 客户端都是7.2 版本,所以不可RemoteCommand
用。
假设以下设置:
- machine是一个跳转主机,并通过其
foo
提供对主机的访问bar
localhost:10022
bar
位于网络内部,我们可以在其中访问主机rdp
并访问其 RDP 端口(3389)。我实际上给出了我的命令行和配置内部的 IPrdp
,但我认为只要名称查找有效,使用它的名称是合法的。为简洁起见,我在rdp
这里使用。
rdp:3389
现在的目标是通过连接到bar
通过跳转主机获得访问权限,foo
并将其转发到localhost:33389
我正在调用的本地机器上ssh bar
。
[local:33389] --> {foo} --> {bar} --> [rdp:3389]
插曲
我以前用 PuTTY 解决了这个问题,如下所示:
- 创建连接
foo
并配置本地转发-L 33389:localhost:33389
,从而将本地机器绑定localhost:33389
到localhost:33389
onfoo
。 - 使用以下远程命令将端口转发传送到其所在的网络
bar
中ssh -L 33389:rdp:3389 -A bar
。 Host bar
在foo
内部配置.ssh/config
为连接到localhost:10022
并最终bar
通过跳转主机。
PuTTY 配置就像一个魅力,但它依赖于远程命令来执行。虽然 shell 别名是解决此问题的一种方法,但我想知道是否有办法将所有内容保存在ssh_config(5)
我的客户使用的内部,使用ProxyCommand
?
上述 PuTTY 配置的大致等价物是:
ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 -p 10022 localhost
或者,只要Host bar
配置为foo
通过:localhost:10022
foo
ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 bar
这似乎完成了工作。
但当然,这已经足够输入了,如果能够将所有这些都放入配置文件并ssh bar
在本地机器上简单地输入,那就更简洁了。
正如 OpenSSH 7.6 中介绍的那样, RemoteCommand
这似乎相当简单:
Host bar
HostName foo
RemoteCommand ssh -L 33389:rdp:3389 -A -p 10022 localhost
LocalForward 33389 localhost:33389
...这应该大致转换为ssh
上面显示的调用。但如前所述,我使用的是 OpenSSH 的旧(打包)版本,不支持该RemoteCommand
节。
这是似乎最接近我想要实现的尝试。
Host bar
HostName localhost
Port 10022
ProxyCommand ssh -L 33389:localhost:33389 -W %h:%p foo
LocalForward 33389 rdp:3389
这个想法是在本地机器上我将简单地调用ssh bar
. 事实上,它的工作原理是我最终出现在 的 shell 提示符下bar
,但端口转发根本不起作用。虽然sudo lsof -i|grep 3389
在本地机器上给了我:
ssh 15271 accden 6u IPv6 7933201 0t0 TCP localhost:33389 (LISTEN)
ssh 15271 accden 7u IPv4 7933202 0t0 TCP localhost:33389 (LISTEN)
在跳转主机上,我看不到任何包含3389
.
由于ProxyCommand
建立了与 的连接,foo
并且我提供了LocalForward
与 的连接bar
,因此我希望这可以正常工作。
我究竟做错了什么?
目标是用于ssh bar
连接bar
并同时rdp:3389
在本地机器上作为localhost:33389
. 调整ssh_config(5)
本地机器上的文件并被foo
允许。但是,传递远程命令不是一个有效的答案。
首先,根据您的设置,什么会起作用,无论如何都需要两个 ssh:
您真正需要的不是 RemoteCommand,而是 ProxyJump,真正简化了您的配置,只有通过以下方式才能达到目标:
或等效(仅)配置:
需要零中间端口。
不幸的是,ProxyJump 仅从 openssh 7.3 开始可用
但它很容易被
ProxyCommand
-W
您之前使用的/组合替换。或作为配置文件:
仍然有两个 ssh 正在运行:隐藏的一个是
ProxyCommand
仍在本地主机上运行的 as 参数,它使用一对带有主 ssh 的管道进行链接,而不是额外的 tcp 端口。试图让中间主机参与端口转发是不安全的或可能发生冲突(foo 的其他用户可以访问隧道或使用相同的端口),并且容易出错。如果可能,隧道末端应始终保留在客户端主机上,在那里可以完全控制。中间隧道不应该存在或指向下一个 ssh 入口点(这就是-W
's 在这里的用法)。