「翻译」ngrok 1.X 使用文档

映射一个本地 web 服务器到互联网

ngrok 能让你映射一个正在本地运行的 web 服务到互联网上。只要告诉 ngrok 哪一个端口是你的 web 服务运行的即可。让我们试一试开放本地的 80 端口到互联网上。

例子:开放本地的 80 端口到互联网

$ ngrok 80
ngrok

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

当你运行 ngrok 的时候,他会把当前的隧道状态通过一个界面显示在你的终端上。这其中包括了分配给你用来公共访问的地址,这个地址的访问请求会转发到你的 web 服务中:https://3a4bfceb.ngrok.com

检查你的流量

ngrok 会捕获所有那些经过他的 HTTP 流量,并提供了一个实时的 web UI,在这里你可以详细地检查那些请求。启动 ngrok 后,访问 http://localhost:4040。请求你的隧道,你应该会看到 web UI 上这个请求的详细更新,包括了时间、持续时间、headers 头、请求的参数以及原始字节。

ngrok Web 界面中的 HTTP 请求与响应详情

ngrok 的 web 接口允许你详细地检查 HTTP 请求以及=回复

XML/JSON 语法检查

ngrok 对绝大多数使用在 web 中的数据交换格式有特别的支持。一切 XML 以及 JSON 格式的数据都会自动被美化输出来让你检查语法错误。

ngrok 对 JSON 数据进行格式化并高亮语法错误

ngrok 高亮了 JSON 语法错误的位置

重放请求

ngrok 允许你重放任何已经流经该隧道的 http 请求,点击 web UI 中每个请求最上面的 Replay 按钮,ngrok 将重放这个请求到你的服务器上。

ngrok 请求详情页的 Replay 按钮,用于重放 HTTP 请求

通过简单的单击重放任何的请求

密码保护你的隧道

默认地,ngrok 隧道并不需要任何的用户名或者密码就可以访问。这就意味着任何人只要知道了或者猜到了你隧道的 URL 地址就可以对他发出请求。通过在建立隧道的过程中设置 -httpauth 选项,你可以通过用户名和密码加密你的隧道。这将对所有流入的请求强制使用 HTTP 基本身份验证,只有拥有在命令行中设置的密码的人才可以进行访问。

例子:为你的隧道添加用户名和密码

$ ngrok -httpauth="helmet:12345" 80
$ curl -u "helmet:12345" https://3a4bfceb.ngrok.com

使用指定的隧道子域名

ngrok 会随机分配一个十六进制子域名(如:https://3a4bfceb.ngrok.com)给你的隧道。对于只用一次的、个人用的隧道,使用随机的子域名是可以的。然而,如果你打算使用这个 URL 在公共活动上,例如黑客马拉松之类的,或者你设置这个 URL 作为 webhook 来对接第三方的应用,如果这个 tunnel 的域名每次都会更改并且难以阅读的话,这是令人沮丧的。通过 -subdomain 选项,ngrok 允许你使用指定的子域名来启动一个隧道。让我们来用 example 作为子域名启动一个隧道。

例子:使用指定的子域名来启动一个隧道, ‘example’

$ ngrok -subdomain=example 80
ngrok

...
Forwarding                    https://example.ngrok.com -> 127.0.0.1:80
...

转发一个非 HTTP 服务

你是否在开发一个服务运行在 IRC, SMTP, SIP, POP3, XML-RPC 或者其他自定义的网络协议(非 HTTP)?通过 TCP 模式,ngrok 依然可以映射这些服务到互联网上!当你通过 TCP 模式运行 ngrok,他会分配一个 ngrok.com 的端口给你,并且转发所有的流量到你的本地服务。不幸的是,当你运行在 TCP 模式下时,ngrok 并不知道如何去理解并且分析这些流量,因此,他的诊断和调试工具就会变得很原始。

例子:转发流量给本地的 TCP 服务

$ ngrok -proto=tcp 22
ngrok

...
Forwarding                    tcp://ngrok.com:50612 -> 127.0.0.1:22
...

转发非本地服务

ngrok 也可以用来转发流量到 NAT 或者防火墙后的服务,甚至这些服务并不运行在同一台机器上。转发流量到另外的机器非常简单,只需要加上他们的 IP 地址和端口就好了。

例子:转发流量给内网其他机器的服务

$ ngrok 192.168.0.1:80

自定义域名

ngrok 有 -hostname 选项,它将会允许你转发流量从你自己的域名,而且你并不需要运行你自己的 ngrok 服务器。举个例子,如果你想要用 dev.example.com 作为域名创建一个隧道,你必须:

在 ngrok.com 的控制面板输入你的域名作为反向域名,这确保了其他人不会用他们的隧道挟持进你的域名。 在 DNS 系统为 dev.example.com 新建一个指向 ngrok.com 的 CNAME 记录,无论你在用哪家的 DNS 都是需要这样操作的。 使用 -hostname 作为参数调用 ngrok,像这样:

$ ngrok -hostname dev.example.com 80

需要注意的是,如果你使用了 -hostname 选项,你依然可以通过 SSL 来访问你的隧道,但是证书将会被浏览器提示不匹配。


本文是对 https://ngrok.com/docs/1 的一篇翻译,另因本人水平有限,翻译过程中难免会有错误,敬请指出!若有任何版权问题,也敬请指出!

This page is a translation for https://ngrok.com/docs/1. I am not good in translation, maybe this page will has some mistakes, I am happy to see that. Please let me know if this page has any copyright problem.