我有基于Linux的设备(让我们说一个树莓派),承载一个HTTP服务器。 该设备定期更换WiFi接入点,并且由于NAT和/或防火墙而经常不能公开访问。
我想使用公共可用的服务器(下面的rpi.example.com )设置一个反向ssh隧道,使得rpi behind NAT rpi.example.com在启动时build立到rpi.example.com的隧道。 rpi.example.com会将任何HTTP请求转发到rpi behind NAT的rpi behind NAT 。
序列图:
HTTP client rpi.example.com rpi behind NAT + + + | | ssh -R | | | <-----------------+ | GET /temp | | +-----------------> | | | +-----------------> | | | [SSH tunnel] | | | <-----------------| | HTTP/1.1 200 OK | | | <-----------------+ | | | |
如何设置反向SSH隧道? 有更好的select吗?
我认为VPN(例如openVPN或像strongswan这样的IPSEC解决scheme)可能会更好。
您可以绝对使用SSH,使用-R开关:
-R remote_socket:local_socket
指定到远程(服务器)主机上给定TCP端口或Unix套接字的连接将被转发到本地端的给定主机和端口(或Unix套接字)。 这可以通过分配一个套接字来侦听TCP端口或远程端的Unix套接字。 无论何时连接到此端口或Unix套接字,都会通过安全通道转发连接,并从本地计算机连接到主机端口hostport或local_socket。
你只需要在你的Pi上启动连接,如果失败就重新启动。 这里的NAT是无关的,因为隧道将直接在你的公共主机和Pi之间 – 你的主机上实际上有一个监听器(例如127.0.0.1:9999),并将configuration你的web服务器使用该监听器作为上游。
最有可能的是,你会希望有一个专门的用户来创build这个转发(因为你的Pi需要能够validation你的服务器,这几乎肯定意味着你将需要一个无密码的私钥)。 如果您需要多个端口,则还需要为每个端口创build一个转发连接。
我怀疑一个VPN可以更容易地做出可靠的工作,而且本质上需要更less的脚本。 不过,两种方法都行得通。