在防火墙后面的机器之间建立 SSH 连接

在防火墙后面的机器之间建立 SSH 连接

我有两台机器,A 和 C,每台机器都在防火墙后面,因此它们无法接受端口 22 上的传入 SSH 请求。我有第三台机器 B,位于两台防火墙之外,我想使用 B 从 A 到 C 进行 SSH 连接。我可以执行我认为的从 C 到 B 的 SSH 隧道,如下所示

ssh -fNR 10000:localhost:22 -i key_file_for_B_on_C user_on_B@B

以下内容看起来几乎是我想要的关于这个问题我现在尝试以下命令:

ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p user_on_B@B" -p 10000 B

这似乎不起作用,我收到错误:

channel 0: open failed: connect failed: Connection timed out

这是正确的方法吗?我可能做错了什么?

答案1

我认为你的例子的问题在于最后的论点;你正在ssh讨论 B,而你应该列出“最终目的地”,虽然端口转发的主机/端口是 10000 端口,但应该是localhost,而不是B,因为B从 的角度来看已经解决了A,并且 10000 端口B可能未打开外部。例如,更正:

ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p user_on_B@B" -p 10000 localhost

为了向自己证明这一点,我设置了相同的实验,尽管稍微简单一些,因为我的用户名在所有主机上都是相同的,并且我正在使用代理转发;请注意,我的hophost(你的B)在非标准端口 2222 上接受 ssh。

在 C 上:

ssh -fNAR 12345:localhost:22 hophost -p 2222

然后在 A:

ssh -A localhost -p 12345 -o "ProxyCommand ssh -A hophost -p 2222 nc %h %p"

或者,你可以将其中的一部分编码到你的.ssh/configA 中:

Host C
  HostName localhost
  Port 12345
  ForwardAgent yes
  #ProxyCommand ssh -A hophost -p 2222 nc %h %p
  ProxyCommand ssh -A hophost -p 2222 -W %h:%p
  #ProxyCommand $HOME/.ssh/proxy -w 2 -h hophost:2222 %h %p

那么你在 A 上的命令很简单

ssh C

注意,我还提供了两个备选ProxyCommand版本。第一个版本用于当选项被添加时nc您的ssh版本早于 5.3 的情况-W。另一个版本使用我长期使用的代理脚本,既可以跳过某些主机(如本例所示),也可以用于corkscrew从阻止出站的防火墙中逃脱ssh。您可以ssh-proxy在我的 github 上看到该脚本。~/.ssh/config当您想要使用代理进行Host *输入时,它可以简化输入,但我不能保证它在所有情况下都有效,因为我会根据不同情况的需要对其进行修改,因此任何选项都可能很脆弱甚至被破坏,但它可能会有所帮助。

相关内容