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

我有3台服务器, A是Internet上的公共可访问服务器。 B提供我想要访问的Web服务。 C有权连接到A和B.

现在我想,如果一个客户端D试图访问一个特殊的端口,他将被转发到B.

IP和端口

A:

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

B:

  • 1.0.0.2:23 SSHD服务器
  • 1.0.0.2:444 Webservice我想访问

C:

  • 1.0.0.3

d:

  • 1.0.0.4

图:

+------------+ +------------+ | 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设置为yesclientspecified 。 (默认是no ,使用yes不能被推荐,所以如果你想这样做,我build议clientspecified )。

这不是SSH隧道的工作原理。你可以接近你所描述的内容,但不完全如你所描绘的那样。

2个选项可供您使用:

  1. 使用L ocal端口转发
  2. 使用D ynamic端口转发

1)本地端口转发

这要求你改变你的方法:隧道需要从客户端打开,从图中的D开始。 这很容易实现,在客户端(D)只是做一个

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

当然,这需要你:

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

我将稍后解释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。