SSH 隧道通过第三台服务器连接两台服务器

SSH 隧道通过第三台服务器连接两台服务器

我有 3 台服务器,A是互联网上可公开访问的服务器。 托管我想要访问的 Web 服务。 C具有连接 A 和 B 的访问权限。

现在我想要的是如果一个客户尝试访问 A 上的特殊端口,然后将其转发给 B。

IP 和端口

A:

  • 1.0.0.1:22 SSHD 服务器
  • 1.0.0.1:443 我想要使用的公共端口

乙:

  • 1.0.0.2:23 SSHD 服务器
  • 1.0.0.2:444 我想要访问的 Web 服务

C:

  • 1.0.0.3

答案:

  • 1.0.0.4

图表:

  +------------+        +------------+
  | Client (D) +--------> Public (A) |
  +------------+        +-----^------+
                              |
  +----------------+    +-----------+
  | Webservice (B) <----+ Proxy (C) |
  +----------------+    +-----------+

问题:

我需要在 ssh 隧道上执行哪些命令C如果我尝试打开 1.0.0.1:443我获得了托管在 1.0.0.2:444 上的服务?

答案1

在 C 上你可以运行

ssh -fNR 1.0.0.1:443:1.0.0.2:444 [email protected]

root它仅在您以用户身份登录时才有效,因为443是特权端口。此外,它仅sshd在 A 上的配置设置为GatewayPortsyes时才有效clientspecified。(默认值为no,不建议使用yes,因此如果您想以这种方式执行此操作,我建议clientspecified)。

答案2

这并不完全是 SSH 隧道的工作方式。您可以接近您描述的方式,但并不完全符合您绘制的方式。

您有 2 个选项可供选择:

  1. 使用大号本地端口转发
  2. 使用动态端口转发

1)本地端口转发

这就需要你改变你的方法:隧道需要从客户端打开,从图中的 D 打开。这很容易实现,在客户端(D)上只需执行

ssh -L 443:1.0.0.2:444 [email protected]

当然这需要你:

  • 在 D 上有 shell 访问权限或 putty 客户端
  • 在代理(C)上有一个用户可以登录到 D
  • 能够通过 ssh 从 D 连接到 C
  • 在 C 上的服务器配置中将 X11Forwarding 和 AllowTcpForwarding 设置为 yes

我稍后会解释动态端口转发

答案3

编辑:

@kasperd 提到,您可以为用户设置 GatewayPorts,这样您就不必使用 nginx。我把解决方法留给其他人。

将其添加到/etc/ssh/sshd_config

Match User <username>
   GatewayPorts yes

原始答案:

我找到了一个使用 ssh 和 nginx 实现此目的的解决方案。它并不完美,因为我必须在 A 上使用代理安装 nginx 服务器。我必须启用 ssl 并为该 nginx 实例提供自己的 ssl 证书。

因此解决方案如下: C将执行以下命令在 A 和 B 之间创建中继:

ssh -R 445:1.0.0.2:444 [email protected] -p 22

这将导致 1.0.0.1 上 445 端口上的任何输入都重定向到 1.0.0.2:444。因此A现在可以执行wget https://localhost:445 --no-check-certificate以获取您的 web 服务的索引页。但是它尚未公开。(如果您想知道:端口 445 是正确的,我必须在下一部分中使用一些尚未使用的端口)

所以我创建了一个 nginx 服务器A它将把所有流量从端口 443 重定向到端口 445。并使用以下配置:

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ssl on;

        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        server_name proxy.<your-domain>.com;

        location / {
          proxy_pass        https://127.0.0.1:445;
          proxy_set_header  X-Real-IP  $remote_addr;
          proxy_set_header  Host $host;
        }
}

现在,您可以使用您的网络浏览器(在 Firefox 上使用隐身模式以防止证书问题)来https://代理..com:443 并从您的 Webservice 获取结果。proxy..com 的 IP 必须是 1.0.0.1。

我不喜欢的是,我必须创建一个新的网络服务器,它将创建一个新的加密会话,而不是仅仅重定向位于。然而,在我找到更好的解决方案之前,这是一个很好的解决方法。

相关内容