ngrok 如何在防火墙后面工作?

Posted

技术标签:

【中文标题】ngrok 如何在防火墙后面工作?【英文标题】:How does ngrok work behind a firewall? 【发布时间】:2014-06-17 04:32:46 【问题描述】:

Ngrok (https://ngrok.com/) 应该允许您通过转发向万维网公开本地端口和服务。但是,如果我像这样在本地机器上打开端口 80:

ngrok 80

我回来了:

Tunnel Status                 online
Version                       1.3/1.3
Forwarding                    http://3a4bfceb.ngrok.com -> 127.0.0.1:80
Forwarding                    https://3a4bfceb.ngrok.com -> 127.0.0.1:80
Web Interface                 http://127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

我知道对http://3a4bfceb.ngrok.com 的任何请求都将通过端口 80 发送到我的本地计算机,但如果我坐在阻止传入流量的 NAT/防火墙后面怎么办(一种非常常见的情况)。 ngrok 是否发起轮询请求以确定何时收到数据?

【问题讨论】:

Developer's guide to ngrok 中有一个名为“网络协议和隧道”的章节解释了 ngrok 的工作原理。关键元素是所有传入请求实际上通过服务器启动的套接字传输的隧道,从而绕过了您提到的问题。 @fvu 下载和使用的 ngrok 客户端启动隧道,而不是服务器。 @RalphCaraveo 我确实可以制定得更好,我正在查看完整的轨迹,并且 ngrok 客户端程序在服务器计算机上运行... 【参考方案1】:

因为 ngrok 隧道总是首先在客户端启动,所以它可以与服务器协商安全通道。这是绕过传统防火墙配置的一个非常巧妙的解决方案。

这是通过客户端打开一个长寿命的 tcp 连接在内部完成的,其中在一个物理套接字连接中创建了许多逻辑套接字。这种技术称为stream multiplexing。有了这个设置,就不需要任何类型的轮询,因为客户端和服务器仍然有完全的双向通信。

然后,客户端和服务器通过心跳机制保持活动状态,确保连接打开并正常工作,甚至会在出现错误或丢失/关闭连接时重新连接。

更多信息请参见:Developer Guide on github.com

【讨论】:

【参考方案2】:

您可以在没有 authtoken 的情况下创建基本的 http-https-tcp 隧道。对于自定义子域等,您应该通过在 ngrok.com 上注册来获取 authtoken。设置后,它会存储在 ngrok 配置中并用于所有隧道。几种方法:

等待 ngrok.authtoken(token); 等待 ngrok.connect(authtoken: token, ...);

【讨论】:

以上是关于ngrok 如何在防火墙后面工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ngrok 隧道使 spring social facebook 在 localhost 上工作

如何让 ngrok 工作的 Telegram webhook?

在 Codeigniter 中如何通过 ngrok 执行 POST 请求?

如何通过 ngrok 使用 ws(websocket)

如何使用 ngrok 正确公开 docker 服务器?

如何使用 ngrok 将 webhook 发布到本地计算机上的 url?