我有 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 上的配置设置为GatewayPorts
或yes
时才有效clientspecified
。(默认值为no
,不建议使用yes
,因此如果您想以这种方式执行此操作,我建议clientspecified
)。
答案2
这并不完全是 SSH 隧道的工作方式。您可以接近您描述的方式,但并不完全符合您绘制的方式。
您有 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。
我不喜欢的是,我必须创建一个新的网络服务器,它将创建一个新的加密会话,而不是仅仅重定向位于乙。然而,在我找到更好的解决方案之前,这是一个很好的解决方法。