我有3台服务器, A是Internet上的公共可访问服务器。 B提供我想要访问的Web服务。 C有权连接到A和B.
现在我想,如果一个客户端D试图访问一个特殊的端口,他将被转发到B.
A:
B:
C:
d:
+------------+ +------------+ | Client (D) +--------> Public (A) | +------------+ +-----^------+ | +----------------+ +-----------+ | Webservice (B) <----+ Proxy (C) | +----------------+ +-----------+
什么SSH隧道命令我需要在C上执行,所以,如果我试图打开D 1.0.0.1:443我得到的服务托pipe在1.0.0.2:444?
在C上,你可以运行
ssh -fNR 1.0.0.1:443:1.0.0.2:444 [email protected]
只有以root用户身份login才会有效,因为443是特权端口。 此外,只有在A上的sshdconfiguration了GatewayPorts设置为yes或clientspecified 。 (默认是no ,使用yes不能被推荐,所以如果你想这样做,我build议clientspecified )。
这不是SSH隧道的工作原理。你可以接近你所描述的内容,但不完全如你所描绘的那样。
2个选项可供您使用:
- 使用L ocal端口转发
- 使用D ynamic端口转发
这要求你改变你的方法:隧道需要从客户端打开,从图中的D开始。 这很容易实现,在客户端(D)只是做一个
ssh -L 443:1.0.0.2:444 [email protected]
当然,这需要你:
我将稍后解释dynamic端口转发
@ kasperd提到你可以为用户设置GatewayPorts,而不必使用nginx。 我把这个解决办法留给别人。
将其添加到/etc/ssh/sshd_config
Match User <username> GatewayPorts yes
我发现一个解决scheme,用ssh和nginx来实现。 这并不完美,因为我必须在代理上安装一个nginx服务器。 我必须启用ssl,并给这个nginx实例一个自己的ssl证书。
所以解决scheme将如下所示: C将执行以下命令以创buildA和B之间的中继:
ssh -R 445:1.0.0.2:444 [email protected] -p 22
这将导致1.0.0.1上的端口445上的任何input被redirect到1.0.0.2:444。 因此, A上的本地用户现在可以执行wget https://localhost:445 --no-check-certificate来获取web服务的索引页面。 但是它尚未公开。 (如果你想知道:445端口是否正确,那么下一部分我必须使用一些未使用的端口)
所以我在A上创build了一个nginx服务器,它将redirect从端口443到端口445的任何stream量。并使用以下configuration:
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; } }
现在,您可以使用Web浏览器(在Firefox上进行隐身模式以防止证书出现问题)绑定到https:// proxy ..com:443并从Web服务中获取结果。 proxy.com的IP必须是1.0.0.1。
我不喜欢这里是我必须创build一个新的Web服务器,将创build一个新的encryption会话,而不是只是redirect我的位于B的 Web服务之一。 然而,这是一个很好的解决方法,直到我find一个更好的解决scheme。