客户端和路由器后面的远程 Raspberry Pi 之间的连接

网络工程 互联网
2022-03-01 13:49:43

我想为处理文件下载/上传请求(和其他自定义操作)的 Raspberry Pi(C++、Boost、OpenSSL)构建一个应用程序。RPi 有一个外部 HDD 连接到它(通过 USB)。我们将其简称为存储(RPi + HDD)。

我有一个公共服务器,可以根据需要进行配置。问题是存储位于我无权配置的路由器后面(不包括端口转发),因此公共服务器无法直接连接到Stroage

以编程方式,通过公共服务器在客户端(Web 浏览器/移动应用程序)和存储之间进行通信的最佳方式是什么?一个简单的用例是:我想通过 Internet将文件从Storage下载到我的手机。

我可以想到两种可能的解决方案:

  1. 在公共服务器和Storage之间保持隧道开放这对于多个存储是否可扩展假设公共服务器将来会为其中的许多存储提供服务)?
  2. 存储3 秒 ping 一次公共服务器(更像是宣布服务器在线),如果公共服务器有来自客户端的请求,则将建立完整连接(客户端 <-> 公共服务器 <-> Storage ) 和文件下载/上传请求将正常处理。

我该如何实现(不包括 Weaved 等第三方工具)以及还有哪些其他可能性?另外,我上面描述的两种选择是否可行?

整个系统架构如下所示。

我知道这是一个更普遍的问题,但我不知道如何处理我的特殊情况。

远程 Raspberry Pi 请求

1个回答

我假设您的应用程序在端口 X 上运行。

在 PS(公共服务器)上安装 ssh 服务器。

通过 ssh 连接到 PS,并创建一个反向端口,从 PS:127.0.0.1:Y(PS 上的端口 Y)到 S:x

在 PS 上创建一个守护程序,以侦听端口 Z。当有人连接到 PS 上的端口 Z 并验证(或您需要做的任何事情)该新连接和 PS:127.0.0.1:Y 之间的流数据时。

这消除了端口转发的需要。

如果你想更进一步,你可以使用打孔库来尝试做直接连接(但这比上面的解决方案要困难得多)。

您需要确保 ps 上的 ssh 服务器除了身份验证和反向端口转发之外不允许任何命令,以禁止 S 客户端在服务器上执行操作(如果需要)。