AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1005337
Accepted
Sagar Khatiwada
Sagar Khatiwada
Asked: 2018-02-12 21:21:49 +0800 CST2018-02-12 21:21:49 +0800 CST 2018-02-12 21:21:49 +0800 CST

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

  • 772

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

在此处输入图像描述

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

networking server ssh remote-access teamviewer
  • 1 1 个回答
  • 4594 Views

1 个回答

  • Voted
  1. Best Answer
    pa4080
    2018-02-15T12:43:24+08:002018-02-15T12:43:24+08:00

    如果我们可以访问具有公共 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 的主要优点是我们省略了一步,但在这种情况下,我们应该考虑私有服务器的安全性,因为它可以通过转发端口公开访问。此外,这些场景可以应用于不同的端口和服务,不仅仅是 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
    
    • -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
    

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

    Host public-server-reverse
        HostName 100.100.100.100
        IdentityFile ~/.ssh/pass-less/id_rsa
        User user-of-the-public-server
        Port 22
        RemoteForward 2222 localhost:22
    
    • 100.100.100.100是公共服务器的IP地址或域名

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

    autossh public-server-reverse -fTN
    

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

    @reboot sleep 45 && autossh public-server-reverse -fTN
    

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

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

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

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

    ssh user-of-the-public-server@public-server -p 22 -fTN -L 1111:127.0.0.1:2222 -i ~/.ssh/pass-less/id_rsa
    
    • -L 1111:127.0.0.1:2222 表示1111(本地)客户端计算机上的端口将被转发到(远程)公共服务器的端口2222(即转发到私有服务器的 SSH 端口)。注意我们可以使用-L 2222:127.0.0.1:2222.

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

    • 我们也可以使用指令autossh或.~/.ssh/config RemoteForwardLocalForward


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

    完成上述两个步骤后,我们可以通过以下命令从 Client Machine 连接到 Public Server:

    ssh user-of-the-private-server@localhost -p 1111    # provide an additional authentication data (for the Private Server) if it is needed…
    

    如何在 Ubuntu 中应用场景 2

    通过从私有服务器到公共服务器的端口转发建立 SSH 连接

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

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

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

    GatewayPorts yes
    

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

    autossh public-server-reverse -gfTN
    
    @reboot sleep 45 && autossh public-server-reverse -gfTN
    

    或者,或者,我们可以~/.ssh/config用这种方式修改文件:

    Host public-server-reverse
        HostName 100.100.100.100  
        IdentityFile ~/.ssh/pass-less/id_rsa
        User user-of-the-public-server
        Port 22
        RemoteForward \*:2222 localhost:22
    
    • 100.100.100.100是公共服务器的IP地址或域名

    最后我们应该killall autossh再次建立连接。


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

    一旦执行了上述步骤,我们就可以通过命令实现我们的目标:

    ssh user-of-the-private-server@public-server -p 2222    # provide an additional authentication data (for the Private Server) if it is needed… forward some ports, etc.
    

    更新

    如果公共服务器和私人服务器在同一个局域网中,您可以使用选项ProxyCommand或ProxyJump。选项ProxyJump在 OpenSSH 7.4+ 中可用,使用此选项您可以轻松地通过多个网关。这里有几个例子:

    ssh -J PublicServer PrivateServer
    ssh -J user1@PublicServer:port1 user2@PrivateServer -p port2
    ssh -J user1@PublicServer:port1,user2@IntermediateServer:port2 user3@PrivateServer -p port3
    

    或者,如果您更喜欢使用~/.ssh/config条目:

    Host PublicServer
            HostName 100.100.100.100
            IdentityFile ~/.ssh/public_server_id_rsa
            User User1
            Port 10222
    
    Host PrivateServer
            HostName 172.16.1.100
            IdentityFile ~/.ssh/private_server_id_rsa
            User User2
            Port 22
            ProxyJump PublicServer
    
    • 请注意,两个 SSH 密钥都存储在客户端计算机上。

    • 100.100.100.100 是公共服务器的 IP 地址或域名。172.16.1.0/24 是公共服务器可以访问私有服务器的局域网。而 172.16.1.100 是 Private Server 的 LAN IP 地址。

    然后,为了连接到私人服务器,只需使用:

    ssh PrivateServer
    
    • 6

相关问题

  • 如何从命令行刻录双层 dvd iso

  • 如果在服务器机器上运行 Ubuntu 桌面版,性能损失是多少?

  • 将桌面版剥离为服务器版的最简单方法是什么?

  • 如何与无头服务器进行图形交互?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve