当 ssh 需要现有的 ProxyCommand 才能工作时,如何通过 SOCKS 代理进行 ssh

当 ssh 需要现有的 ProxyCommand 才能工作时,如何通过 SOCKS 代理进行 ssh

我有一些主机,可以使用 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

相关内容