在远程主机上实现 SSH 重定向

在远程主机上实现 SSH 重定向

我的问题与描述的类似这里。我有三个主机 A、B 和 C。

A是我家里的电脑。

B 是我们在大学拥有的一台连接到互联网的服务器。

C是大学办公室的一台计算机。与服务器连接在同一本地网络中。所以我可以从 A -> B 和 B -> C 进行 SSH,但不能从 A -> C。我想要从 A 到 C 的直接连接。

有一个很好的解决方案描述这里

但我的问题是,该解决方案应用于 A 主机,而我更喜欢可以在主机 B 上部署的解决方案,因为我想让其他需要相同连接的用户能够轻松使用。我在这里注意到,大多数用户是没有计算机技能的教师。请提供任何帮助。

答案1

首先,这里的解决方案比问题中提供的链接中给出的解决方案更好,因为这个新解决方案不依赖于外部工具,例如netcat

Host C
  ProxyCommand ssh -W %h:%p B

在主机 A 中.ssh/config。用户不需要具备特定的计算机技能,他们只需要被告知即可。任何人都可以在一个文件中放入 2 行。

如果这确实是一个问题,可以将特定命令添加到.ssh/authorized_keys主机 B 上的文件中:

command="ssh C" ssh-rsa <key_of_the_user_of_host_A>

因此,当用户这样做时ssh B,主机 B 上的 SSH 服务器将自动运行,而不是在主机 B 上启动交互式 shell ssh C(请参阅 sshd(8) 手册页)。但是,这将阻止主机 B 上的任何直接登录,并且任何其他 SSH 命令(例如/bin/bash -lin ssh -t B /bin/bash -l)将被忽略。正如手册页所说:

客户端最初提供的命令可在 SSH_ORIGINAL_COMMAND 环境变量中找到。

因此,可能还有一些改进的空间,要么在主机 C 上运行提供的命令,要么在某些条件下在主机 B 上运行它(如果考虑到此环境变量,则在引用时也要小心)。一个例子是:

command="ssh ${TTY:+-t} C ${SSH_ORIGINAL_COMMAND-$SHELL}" ssh-rsa <key>

如果有的话,它将在主机 C 上运行提供的命令(如果没有的话,将照常启动交互式 shell)。这样,scp可能可以工作,但在我的机器上它会失败并出现“权限被拒绝”错误。但效果很好,如果您有问题,rsync可以用作替代品。scp

重要的。不要选择在主机 B 上打开(必然是非特权)端口的解决方案。这要么不起作用,因为到此类端口的连接被大学的防火墙阻止,要么这将引入安全问题,因为这将允许用户通过端口 22 上的 SSH 服务器绕过主机 B 上的身份验证(使用跟踪等功能)。

答案2

在主机 B 上:

B$ ssh localhost -L 2222:C:22 -g

运行时每个人都可以通过 B:2222(tcp 端口 2222)连接到主机 C

对于永久解决方案,您可以screen在主机 B 上运行 ssh 命令,并将 ssh 命令保留在后台。

(您可以使用比 ssh 到本地主机更简单的 tcp 重定向软件:例如 redir )

答案3

一种不需要在 B 上打开端口,但在 A 上打开一个端口的交互式转发解决方案如下:

在A上:

ssh -fNL 2222:C:22 B

ssh -p 2222 localhost

除了 @vinc17 提到的配置代理选项(以类似的方式工作)之外,了解这一点可能会很有用。

相关内容