我有一台基于 Linux 的设备(比如说 Raspberry Pi),它托管一个 HTTP 服务器。此设备会定期更换 WiFi 接入点,并且由于 NAT 和/或防火墙,通常无法公开访问。
我想使用一个公开可用的服务器(rpi.example.com
如下)设置一个反向 ssh 隧道,以便在启动时rpi behind NAT
建立一个隧道。然后将任何 HTTP 请求转发到。rpi.example.com
rpi.example.com
rpi behind NAT
序列图:
HTTP client rpi.example.com rpi behind NAT
+ + +
| | ssh -R |
| | <-----------------+
| GET /temp | |
+-----------------> | |
| +-----------------> |
| | [SSH tunnel] |
| | <-----------------|
| HTTP/1.1 200 OK | |
| <-----------------+ |
| | |
如何设置这样的反向 SSH 隧道?还有更好的选择吗?
答案1
我认为 VPN(例如 openVPN 或像 strongswan 这样的 IPSEC 解决方案)可能会更好用。
您绝对可以使用 SSH,使用以下-R
开关:
-R 远程套接字:本地套接字
指定与远程(服务器)主机上给定 TCP 端口或 Unix 套接字的连接将转发到本地端的给定主机和端口或 Unix 套接字。这通过分配一个套接字来监听远程端的 TCP 端口或 Unix 套接字来实现。每当与此端口或 Unix 套接字建立连接时,连接都会通过安全通道转发,并从本地计算机建立与主机端口 hostport 或 local_socket 的连接。
你只需要在你的 Pi 上安装一些东西来启动连接,如果失败了就重新启动它。这里的 NAT 无关紧要,因为隧道将直接位于你的公共主机和 Pi 之间 - 在你的主机上,你实际上会有一个侦听器(例如 127.0.0.1:9999),并将你的 Web 服务器配置为使用该侦听器作为上游。
最有可能的是,您需要一个专门的用户来创建此转发(因为您的 Pi 需要能够对您的服务器进行身份验证,这几乎肯定意味着您需要一个无密码私钥)。如果您需要多个转发连接,您还需要为每个端口创建一个转发连接。
我认为 VPN 更容易可靠地工作,并且本质上需要更少的脚本。不过,这两种方法都可以。