使用 ProxyCommand 通过多个主机的 SSH?

Gra*_*ham 16 ssh proxy

我在家里的电脑上的 ~/.ssh/config 中有一个条目,如下所示:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22
Run Code Online (Sandbox Code Playgroud)

gateway.example.com连接到公共 Internet 和内部网络的工作服务器在哪里。网关框使用 /etc/hosts 中的条目解析 foo 和 bar。

我的问题是我需要到达foo. 我们称之为“巴兹”。“baz”主机位于 foo 连接到的另一个专用网络上,但不是“网关”连接到的那个。

我试过用这个:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我有点超出我的深度。我该怎么做呢?

我认为这不重要,但我在 Ubuntu 10 中这样做。

gho*_*oti 17

简单。

假设以下网络设置:

示例网络设置

你应该能够使用一个看起来像这样的 ~/.ssh/config 文件:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22
Run Code Online (Sandbox Code Playgroud)

这里的想法是您的 SSH确实知道如何访问“foo”,因此那里的 SSH 会成功。从那里,您可以“nc”到 baz。如果在“baz”旁边的内部专用网络上还有其他主机,您可以将它们添加到“host baz”行中。

在比 5.4 更新的 OpenSSH 版本中(此时应该是所有版本),您可以使用该-W命令而不是外部nc命令的 exec ,当然您可以将选项打包在一起:

host foo bar
    ProxyCommand ssh -xaqW%h:22 gateway.example.com

host baz
    ProxyCommand ssh -xaqW%h:22 foo
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,这将主机“foo”视为“baz”的网关,就像“gateway”是“foo”的网关一样。

清除?


Ric*_*man 15

关于ghti的回答:"ssh ... nc %h 22"从OpenSSH 5.4开始,您可以直接使用:而不是使用netcat()"ssh -W %h:22 ..."。这样,您就不必担心 netcat 是否安装在正确的位置。