我有一些主机,可以使用 ssh 配置文件中的 ProxyCommand 来 ssh 连接它们。例如:
Host vm1
ProxyCommand ssh -q -l owl -W vm1:22 gateway.example.com
User owl
Host gateway.example.com
HostName gateway.example.com
User owl
Controlmaster auto
我设置它已经有一段时间了,所以我不记得为什么我需要第二个条目,或者实际上是否需要它用于这个目的或其他目的。
在我的远程机器上,我通常输入以下命令ssh vm1
,它会通过机器连接到主机 vm1 gateway.example.com
(因为 vm1 位于网关的防火墙后面,否则不可见)。实际上情况比这更复杂一些,因为除此之外,由于从 vm1 建立了另一个连接,以便于通过 RDP 本地连接到第二个 VM,因此本地命令如下所示:
ssh -N -f -M -S /tmp/rdp-vm2.sock -L4001:vm2:3389 vm1
然后本地 RDP 客户端连接到 127.0.0.1:4001。之所以使用套接字,是因为这是脚本的一部分,该脚本会自动启动 RDP 客户端,并在 RDP 连接关闭时终止连接。
但是,当我在本地使用 SOCKS 代理时,我需要此功能才能正常工作。(这是 192.168.1.1 端口 8000。)我能够通过在ssh 配置文件的部分ssh gateway.example.com
中添加以下行来本地连接到网关(例如) :gateway.example.com
ProxyCommand nc -X 5 -x 192.168.1.1:8000 %h %p
但测试下一跳(ssh vm1
)失败:
ssh_exchange_identification: Connection closed by remote host
我读到过,使用 nc 对于正常代理来说已经过时了,我假设我只需要用gateway.example.com
带有选项的 ssh 替换我的 ProxyCommand -W
,但是当我专门使用 SOCKS 代理时,我不清楚用什么来替换它。
答案1
的顺序ProxyCommand
很重要。它需要作为主机下的第一行添加gateway.example.com
,而不是最后一行。
因此将其改为如下所示:
Host gateway.example.com
ProxyCommand nc -X 5 -x 192.168.1.1:8000 %h %p
HostName gateway.example.com
User owl
Controlmaster auto