node.js - 如何构建 localtunnel / ngrok 克隆
问题描述
存在ngrok和localtunnel之类的服务,因此您可以(我不太热衷于描述这一点)将您的 localhost 放在公共网络上,以便通过公共 URL 访问。Localtunnel似乎更受欢迎。
我的问题是,在一般级别/高级概述之类的事情上,您如何自己实现这一点?就像,我怎样才能创建一个域mydomain.com
,然后让它这样一个 cli 命令mydomain create-tunnel
会返回一个唯一的 URL12345.mydomain.com
或其他什么,然后我可以从那个唯一的 URL 访问我的本地主机。
我知道如何构建 CLI 和 RESTful Web 应用程序,但我不知道 localhost 和公共 URL 之间的连接在哪里。我看不到如何在公共 URL(仅限 https URL)上托管我的本地主机。
如果我尝试考虑一下,我可能会尝试搜索导致隧道协议的HTTP 隧道。HTTP 隧道页面没有透露太多。我认为隧道协议页面的级别太低了,我想我在问更高的级别。
但如果我试着想象会发生什么……浏览器向mydomain.com
. 然后,这与我本地计算机上的 HTTPS 服务器建立了一个已经打开的 HTTPS 连接。它将请求代理到本地机器的 HTTPS 服务器。然后这会向 localhost 发出请求。也就是说,它将来自本地 HTTPS 服务器的请求代理到我实际关注的任何 localhost 服务器。它向 localhost 服务器发出请求,然后得到响应。将响应传送回远程机器,然后远程机器将其传送回浏览器。
另外,在安全性方面我需要担心什么(无论是在构建安全隧道应用程序方面,还是在如何绕过防火墙方面,可以这么说)?
也许我应该看这里:)。
解决方案
我发现这个问题没有答案,我也遇到了同样的问题。其所依据的概念有两个:
反向端口转发:从本地计算机连接到公共主机(您必须获得授权)并要求将特定端口上的所有传入请求转发到 ssh 连接请求开始的本地计算机的 ssh 连接。例如,在您的本地计算机上,您在端口 8080 上有一个 Web 服务器,并且您希望从您知道用户的用户名和密码的公共域服务器访问它:
ssh -N -R 80:localhost:8080 serveruser@my.public.host.com
现在您可以通过在端口 80 上调用公共服务器来访问本地 Web 服务器。
- 子域:如果您在公共服务器上有 nginx 或 apache 或其他一些反向代理,您可以在航班上创建一个子域,将地址传送到本地服务器请求 ssh 反向连接,然后,知道特定的主机地址(理解子域),它可以启动 ssh 反向连接。
这就是我认为它的工作原理。