我有两台机器,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/config
A 中:
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 *
输入时,它可以简化输入,但我不能保证它在所有情况下都有效,因为我会根据不同情况的需要对其进行修改,因此任何选项都可能很脆弱甚至被破坏,但它可能会有所帮助。