通过反向 ssh 隧道的 HTTP 服务器

Dur*_*ndA 7 reverse-proxy ssh-tunnel

我有一个基于 linux 的设备(假设是一个 Raspberry Pi),它托管一个 HTTP 服务器。此设备会定期更改 WiFi 接入点,并且由于 NAT 和/或防火墙的原因通常无法公开访问。

我想使用公开可用的服务器(rpi.example.com如下)设置反向 ssh 隧道,rpi behind NAT以便rpi.example.com在启动时建立隧道。rpi.example.com然后将任何 HTTP 请求转发到rpi behind NAT.

时序图:

HTTP client       rpi.example.com     rpi behind NAT
     +                   +                   +
     |                   |       ssh -R      |
     |                   | <-----------------+
     |    GET /temp      |                   |
     +-----------------> |                   |
     |                   +-----------------> |
     |                   |   [SSH tunnel]    |
     |                   | <-----------------|
     |  HTTP/1.1 200 OK  |                   |
     | <-----------------+                   |
     |                   |                   |
Run Code Online (Sandbox Code Playgroud)

如何设置这样的反向 SSH 隧道?有更好的选择吗?

iwa*_*rue 3

我认为 VPN(例如 openVPN 或像 Strongswan 这样的 IPSEC 解决方案)可能效果更好。

你绝对可以使用 SSH,通过以下-R开关:

-R 远程套接字:本地套接字

指定到远程(服务器)主机上给定 TCP 端口或 Unix 套接字的连接将转发到本地端的给定主机和端口或 Unix 套接字。这是通过分配一个套接字来侦听 TCP 端口或远程端的 Unix 套接字来实现的。每当与此端口或 Unix 套接字建立连接时,该连接都会通过安全通道转发,并从本地计算机与主机端口 hostport 或 local_socket 建立连接。

您只需要 Pi 上有一些东西来启动连接,并在失败时重新启动它。这里的 NAT 是无关紧要的,因为隧道将直接位于您的公共主机和 Pi 之间 - 在您的主机上,您实际上会有一个侦听器(例如 127.0.0.1:9999),并将配置您的网络服务器以使用该侦听器作为上游。

最有可能的是,您希望有一个专门的用户来创建此转发(因为您的 Pi 需要能够对您的服务器进行身份验证,这几乎肯定意味着您需要一个无密码的私钥)。如果您需要多个连接,您还需要为每个端口创建一个转发连接。

我怀疑 VPN 会更容易可靠地工作,并且本质上需要更少的脚本。不过,这两种方法都有效。

  • 我使用 `ssh -NR 8080:localhost:80 user@rpi.example.com` 来实现。诀窍是将“AllowTcpForwarding yes”和“GatewayPorts yes”添加到 sshd_config。然后我可以使用“autossh”将其自动化。我还发现[this Gist](https://gist.github.com/gdamjan/4586758)使用nginx将子域与ssh隧道绑定。 (5认同)