通过远程服务器连接到本地虚拟机

通过远程服务器连接到本地虚拟机

我的目标是通过互联网公开访问在本地 VirtualBox 中运行的 Ubuntu 服务器(端口 22 上的 SSH 和端口 80 上的 HTTP)。

现在,我计划这样做:

  1. 我正常设置了本地 VirtualBox(以下称为“A”),并在其端口 22 上启动了一个 OpenSSH 服务器,同时还启动了一个在端口 80 上提供一些内容的 HTTP 服务器。
  2. 在 AWS 这样的云提供商处,我设置了另一个虚拟机实例(以下称为“B”),该实例当然会获得一个公共 IP 地址(例如“12.34.56.78”,以便 B 可以通过 SSH 在“12.34.56.78:22”上公开访问。
  3. 我现在想在 A 和 B 之间建立基于 SSH 的持久连接(隧道?),而这正是我目前遇到的问题。创建此隧道应由 A 发起。
  4. 当我通过 SSH 连接到例如“12.34.56.78:2222”时,B 的端口 2222 应通过步骤 3 中建立的隧道转发到 A 的端口 22,这样我就可以通过常规互联网从任何地方访问我的 VirtualBox A。同样,当访问“http://12.34.56.78”时,HTTP 内容应由运行在 A 的端口 80 上的服务器提供。

我如何实现步骤 3,即建立该隧道?

答案1

您正在寻找的是远程转发/隧道。您可以使用它通过 SSH 连接将本地端口“推送”到远程计算机。

您需要更改 sshd 选项以使其按您想要的方式工作。使用您选择的编辑器打开 /etc/ssh/sshd_config,找到以下行

#GatewayPorts no

并将其更改为

GatewayPorts yes

完成后重新启动 SSH 服务。如果不这样做,隧道将仅绑定到环回接口。

然后,为了实现您所描述的 SSH 部分,您需要打开从 VM A 到 VM B 的 SSH 连接,如下所示:

ssh -R 12.34.56.78:2222:127.0.0.1:22 [email protected]

之后-R,您还可以指定星号 (*) 来代替远程机器的地址,以监听所有接口。

HTTP 端稍微复杂一些,因为除非您以 root 身份登录,否则 OpenSSH 不会让您绑定到特权端口。要绕过此限制,您可以将远程隧道建立到非特权端口(例如 8080),并在 VM B 上运行诸如 socat 之类的程序或诸如 nginx 之类的反向代理来重定向请求(或者只是以 root 身份登录,但我不建议这样做)。您可以在此处找到有关此内容的更多信息:https://unix.stackexchange.com/questions/554141/ssh-remoteportforw-binding-privileged-port

要自动完成从 A 到 B 的连接,您可以创建一个运行此命令的脚本,并在网络可用时在 VM A 上将该脚本作为服务运行。您可能需要指定一些 SSH 选项以确保它不会尝试询问任何问题,例如StrictHostKeyChecking=noUserKnownHostsFile=/dev/null

附注:请确保您严格锁定 SSH,否则您的机器可能很快就会加入僵尸网络。禁用基于密码的身份验证并使用 SSH 密钥,设置 fail2ban 等。

相关内容