访问 NAT 后面的远程多台服务器

Sag*_*ada 4 server ssh networking remote-access teamviewer

我有一种情况,我们的 Ubuntu 服务器部署在多个远程位置。这些服务器位于运营商级 NAT 和内部 NAT 之后。现在我想从一个中心位置随时访问它,但我也支持类似于这些服务器的 NAT。

在此处输入图片说明

当这些服务器在线时,我想访问它(通过 SSH 或 SSH 隧道)。我知道我无法访问具有公共 IP 的服务器,但也许我可以通过 TeamViewer 的工作原理以某种方式访问​​它。对于这种方法,如果我需要另一台公共服务器,我可以在 Google Compute Engine 中管理它。

pa4*_*080 5

如果我们可以访问具有公共 IP 地址的服务器,那么我们可以将其用作网关。我们可以通过反向 SSH 端口转发连接来实现这一点。假设我们有三个实例:

  • 公共服务器:这里我们有一个可操作的 SSH 服务器和公共 IP 地址(和/或域名)。我们可以使用不受密码保护的公钥-私钥对连接到此服务器(设置参考)。

  • 私人服务器:这里我们有一个可操作的 SSH 服务器。它位于防火墙(NAT、ISP 等)后面,没有公共 IP 地址,但我们能够建立从它到公共服务器的 SSH 连接,因此这里我们也有 SSH 客户端。

  • 客户端机器:这里我们(需要)只有 SSH 客户端。我们能够建立到公共服务器的 SSH 连接。我们想建立一个从这个实例到私有服务器的 SSH 连接。


校长级

在委托人层面,我们至少可以应用两种场景。

场景 1.我们不想在公共服务器的防火墙中打开额外的端口:

  1. 使用端口转发从私有服务器到公共服务器建立 SSH 连接。
  2. 使用端口转发从客户端计算机到公共服务器建立 SSH 连接。
  3. 通过转发端口(通过其自身)从客户端计算机连接到专用服务器。

场景 2.我们倾向于在公共服务器的防火墙中打开一个额外的端口:

  1. 使用端口转发从私有服务器到公共服务器建立 SSH 连接。
  2. 从客户端计算机通过公共服务器连接到专用服务器。

场景 1 的主要优点是我们不需要考虑我们的私有服务器有多安全。场景 2 的主要优点是我们省略了一步,但在这种情况下,我们应该考虑 Private Server 的安全性,因为它可以通过转发端口公开访问。此外,这些场景可以应用于不同的端口和服务,不仅仅是 SSH,例如 HTTP。


如何在 Ubuntu 中应用场景 1

使用端口转发从私有服务器到公共服务器建立 SSH 连接

我们可以通过以下命令做到这一点:

ssh user-of-the-public-server@public-server -p 22 -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa
Run Code Online (Sandbox Code Playgroud)
  • -p 22 提供公共服务器的 SSH 端口(非强制)。

  • -i ~/.ssh/pass-less/id_rsa 提供身份验证密钥文件。

  • -R 2222:127.0.0.1:22意味着2222(远程)公共服务器上的端口将被转发到(本地)私人服务器的 SSH 端口,在这种情况下,是22.

我们可以通过添加选项-fTN(OpenSSH 客户端 -参考)将此连接推入后台。我们还可以使用该工具autossh来确保连接长时间保持活动状态(参考):

autossh user-of-the-public-server@public-server -p 22 -fTN -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa
Run Code Online (Sandbox Code Playgroud)

我们可以通过在我们的~/.ssh/config文件中实现以下几行来简化上述命令:

ssh user-of-the-public-server@public-server -p 22 -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa
Run Code Online (Sandbox Code Playgroud)

在这种情况下,上述命令将变为:

autossh user-of-the-public-server@public-server -p 22 -fTN -R 2222:127.0.0.1:22 -i ~/.ssh/pass-less/id_rsa
Run Code Online (Sandbox Code Playgroud)

我们可以通过下一个 Cron 作业轻松地在系统重启时自动执行此任务(或者我们可以创建应该是更好方法的服务):

Host public-server-reverse
    HostName 100.100.100.100  # this is the IP address or the domain name of the Public Server
    IdentityFile ~/.ssh/pass-less/id_rsa
    User user-of-the-public-server
    Port 22
    RemoteForward 2222 localhost:22
Run Code Online (Sandbox Code Playgroud)

建立此连接后,我们可以通过以下命令从公共服务器通过反向隧道连接到专用服务器:

autossh public-server-reverse -fTN
Run Code Online (Sandbox Code Playgroud)

使用端口转发从客户端机器到公共服务器建立 SSH 连接

我们可以通过以下命令做到这一点:

@reboot sleep 45 && autossh public-server-reverse -fTN
Run Code Online (Sandbox Code Playgroud)
  • -L 1111:127.0.0.1:2222 意味着1111(本地)客户端机器上的端口将被转发到(远程)公共服务器的端口2222(即转发到专用服务器的 SSH 端口)。请注意,我们可以使用-L 2222:127.0.0.1:2222.

  • -fTN 如上所述,这些选项会将连接推入后台。

  • 我们也可以使用指令或文件来实现autossh~/.ssh/config文件。 RemoteForwardLocalForward


从客户端机器通过自身连接到私有服务器

完成以上两步后,我们就可以通过以下命令从Client端连接到Public Server了:

ssh user-of-the-private-server@localhost -p 2222    # provide an additional authentication data (for the Private Server) if it is needed…
Run Code Online (Sandbox Code Playgroud)

如何在 Ubuntu 中应用场景 2

使用端口转发从私有服务器到公共服务器建立 SSH 连接

此步骤与场景 1 中的第一个步骤相同,但应该做一些额外的事情。

打开2222公共服务器防火墙上的转发端口- 这超出了本答案的范围。

修改/etc/ssh/sshd_config公共服务器并添加下一个指令,这将允许向公共开放我们的 SSH 隧道(不要忘记重新启动服务器:)sudo systemctl restart sshd.service

ssh user-of-the-public-server@public-server -p 22 -fTN -L 1111:127.0.0.1:2222 -i ~/.ssh/pass-less/id_rsa
Run Code Online (Sandbox Code Playgroud)

使我们的 SSH 隧道对公众开放。这一步在问题中得到了很好的描述:(如何使 ssh 隧道向公众开放?)。根据那里的答案,我们可以向-g在私有服务器和公共服务器之间建立连接的命令添加选项:

ssh user-of-the-private-server@localhost -p 1111    # provide an additional authentication data (for the Private Server) if it is needed…
Run Code Online (Sandbox Code Playgroud)
GatewayPorts yes
Run Code Online (Sandbox Code Playgroud)

或者,我们可以这样修改~/.ssh/config文件:

autossh public-server-reverse -gfTN
Run Code Online (Sandbox Code Playgroud)

最后我们应该killall autossh重新建立连接。


从客户端通过公共服务器连接到私有服务器

执行完上述步骤后,我们可以通过以下命令实现我们的目标:

@reboot sleep 45 && autossh public-server-reverse -gfTN
Run Code Online (Sandbox Code Playgroud)