ngrok github 地址:
https://github.com/inconshreveable/ngrok
查看官方说明,我们可以了解到:
ngrok 1.x 是开源的,2.x 代码并未开源。当前的仓库也是 1.x 版本。1.x 项目已经不开发了,但是仍然维护着。生产环境中,最好不要运行 1.x 版本,因为存在很多问题。
ngrok开发者指南(Developer's guide to ngrok)
https://github.com/inconshreveable/ngrok/blob/master/docs/DEVELOPMENT.md
ngrok项目由2部分组成:
客户端(ngrok)和服务端(ngrokd)。ngrok 客户端更加复杂一点,因为它有一个 UI 界面来显示保存过的请求和响应。
编译:
git clone [email protected]:inconshreveable/ngrok.git
cd ngrok && make
bin/ngrok [local port]
有只用于编译客户端和服务器的 Makefile 目标:
make client
make server
注意:
必须通过 Go 1.1+ 来编译,且必须安装 Mercurial SCM
编译发布版本:
客户端和服务端,都包含静态资源文件。这些文件包括:TLS/SSL 证书和客户端 web 界面所需的的 html/css/js 文件。发布版将这些静态文件,都嵌入到自己的二进制包中,而调试版本,从系统中获取这些文件。
我们应该始终在调试版本上进行开发,以便在测试静态资源文件修改时,不必重新编译。
有用于编译发布版本的客户端和服务器的 Makefile 目标:
make release-client
make release-server
make release-all
本地开发:
看文档,这是开发ngrok,和我们没点关系
ngrok 官网内容
ngrok 2.0 对底层重新进行了设计,专注于规模、速度,以及可靠性。使其成为可用于开发和生产的实体。 ngrok 2.0引入了请求的一些最高特性,包括通配符域,保留TCP地址,虚拟主机定位,端到端TLS隧道,团队帐户等。
ngrok功能
1.安全的隧道
迅速为本地开发机器上运行的网站创建一个公共HTTPS URL。
ngrok http 80
2.请求监测
使用ngrok提供的web监控页面,来了解通过隧道的HTTP请求和响应流量
http://localhost:4040
3.快速
ngrok隧道的运行,使用了更优化的技术,来支持HTTP/2,以便隧道服务运行的更快
4.不用配置更多端口转发
不用在我们的路由上,配置端口转发,或者在设置动态DNS解决方案上浪费时间。ngork在任何环境中都可以工作,且没有差异。即便设备改变了网络环境。
5.密码保护
设置http认证证书来保护隧道的访问,并且你可以分享这些证书,让某些人也可以访问你的隧道
ngrok http -auth "user:password" 80
6.TCP隧道
可以将任何网络服务暴露到internet,即使这些网络服务,并不使用 'HTTP',例如:SSH
ngrok tcp 22
7.支持websocket
分享你的实时web应用。ngrok通过HTTP隧道进行websocket连接,无需任何更改
ngrok http 8000
8.并发多个隧道
在单个ngrok客户端,可以并发运行多个隧道
ngrok start demo-site ssh admin-ui
9.重播webhook请求
对于服务的请求和响应,都可以记录下来。并且,我们可以对之前的请求,进行重播请求,以加快开发速度。只需点击web监听界面的 'Replaying' 按钮
10.目标虚拟主机站点
重写隧道请求的主机头,以重定向到我们本地 'WAMP/MAMP/Pow' 等开发环境的特定站点
ngrok http -host-header=mysite.dev 80
11.借助API,来自动化ngrok
ngrok提供了一系列的 REST API接口,来动态启动、停止、请求隧道状态等
curl http://127.0.0.1:4040/api/
12.团队共享帐户访问权限
多个开发人员协作的项目中,使用到的保留域名和地址的访问权限,可以被团队共享。团队成员,仍然使用它们自己的证书。
ngrok付费计划
ngrok服务的一些功能,仅对于使用 'ngrok.com' 付费计划的客户有效。仅在付费计划上提供的功能,列举在下方:
1.自定义子域名
默认是随机子域名,我们可以自定义子域名。https://myapp.ngrok.io
ngrok http -subdomain myapp 80
2.保留域名
保留你自己的ngrok.io子域名,从而确保其他用户不能使用这些子域名,并且这些域名总是对你有效
3.你自己域名上的隧道
在你自己域名上,运行隧道。这需要你DNS的简单修改
ngrok http -hostname tun.yourdomain.com 80
4.端到端的TLS隧道
将HTTPS(或其他TLS)流量,通过隧道转发给本地服务。使用你自己的SSL证书和私钥,端到端的加密传输。你甚至可以通过你自己的域名运行它们
ngrok tls -hostname yourdomain.com 443
5.保留的TCP地址
保留一个不变的IP和端口,专用于你的使用。对私人云服务或通过ngrok TCP隧道暴露的任意内容,是非常完美的
ngrok tcp --remote-addr 1.tcp.ngrok.io:21011
6.TLS客户终端
即使您的本地服务不支持TLS终止,将其卸载到ngrok客户端(by offloading it to the ngrok client),也可以使用带有端到端加密的ngrok的TLS隧道
ngrok tls -crt tls.crt -key tls.key 443
7.通配符域名
将所有你的子域名下的HTTP请求隧道传输到你的本地服务,仅需要一个命令
ngrok http -hostname *.yourname.com 8080
8.IP白名单
设置访问你隧道端点的白名单列表,可设置ip地址和ip段,来为你的隧道服务添加额外的安全机制
ngrok 官方文档
起步
1.将本地web服务暴露到 Internet
ngrok 允许我们将运行在本地的 web 服务,暴露到 internet。只需要告知 ngrok,web 服务监听的端口。
如果不清楚 web 服务监听在哪个端口,很可能是 80 端口,80 端口是 HTTP 服务默认端口。
示例:
将我们本机 80 端口的 web 服务暴露到 internet:
ngrok http 80
当启动 ngrok,将在终端中显示一个 UI 界面,包含隧道的公共 URL 以及有关通过隧道进行连接的其他状态和度量信息。
ngrok 控制台 UI(图片看文档)
2.流量监测
ngrok 提供了一个实时的 web UI 界面,用于监测运行在隧道上的所有 HTTP 流量。启动 ngrok 后,只需在 web 浏览器中打开 'http://localhost:4040',来查看请求详细信息
尝试请求公共 UTL。完成后,再次查看监测 UI 界面。我们将会看到请求和响应的所有详细信息,包括时间、持续时间、头部、查询字符串和请求负载,以及线路上的原始字节。
HTTP 请求和响应的详细检测结果(图片看文档)
3.重播(replaying)请求
开发依赖于外部 API 的 webhooks,常因需要做一些额外的工作,导致减慢开发周期。例如:拨打电话,触发 hook 请求。Ngrok 允许我们通过单击重播任意请求,来加快开发周期。单击 Web 监测 UI 界面上,任何请求右上角的 'Replay' 按钮来重播该请求。
通过单击,重播隧道 web 服务器的任何请求(图片看文档)
4.验证请求体
Ngrok 支持 web 上使用的最常见的数据交换格式。请求体或响应体中的任何 XML 或 JSON 数据,都会自动美化打印,并检查语法错误。
高亮显示 JSON 语法错误的位置(图片看文档)
5.安装 Authtoken(认证 token)
在下一章节中,描述了 ngrok.com 服务的很多高级特性,需要注册一个账号。一旦注册后,需要使用你个人中心的 'authtoken' 来配置ngrok。这将授予你访问 '仅账户功能' 的权限。ngrokyou一个煎蛋的 'authtoken' 命令来使这个过程简单化。在这个hood(机制)下,所有的authtoken命令,将会被添加(或修改),ngrok配置文件点的authtoken属性。
ngrok authtoken <个人的authtoken>
HTTP 隧道:
1.自定义子域名
Ngrok 为它打开的 HTTP 隧道,分配随机的16进制名称。这对于一次性的使用场景没有问题。但是,如果我们在黑客马拉松(hackathon)显示 URL,或者与第三方 webhook 进行交互,隧道名不断变化、或者难以读取,这是令人沮丧的。对于这种情况,我们可以使用 '-subdomain' 选项,为 HTTP 隧道指定一个自定义的子域名,。
示例:
使用子域名 'inconshreveable' 来打开一个隧道
ngrok http -subdomain=inconshreveable 80
2.设置密码来保护隧道
任何人,只要知道你隧道 URL 地址,都可以访问你的本地 web 服务,除非我们使用密码来包含它。我们可以通过 '-auth' 选项,设置密码,让其他人无法访问。这将强制在所有 HTTP 请求上,使用 'HTTP Basic Auth' 认证,需要指定 '用户名' 和 '密码'。
示例:
密码保护我们的隧道:
ngrok http -auth="username:password" 8080
3.自定义域名上设置隧道(URL 白名单) // 其实就是:给指定的域名下,设置可访问的url
我们可以在我们的域名上运行 ngrok 隧道,而不是将我们的隧道设置为 ngrok.io 的子域名。为了在 'dev.example.com' 上,运行隧道,遵循以下步骤:
1>在 'ngrok.com' 仪表盘的 'Reserved' 页面,输入 'dev.example.com' 作为保留域名(Reserved Domain。这确保了其他人在他们自己的隧道上,无法劫持你的域名。
2>在仪表盘,单机 'CNAME' 图标,来复制我们的目标 'CNAME'。
3>将 'dev.example.com' 和目标 CNAME,创建一个DNS CNAME记录。在这个例子中,我们将 'CNAME' 记录,指向到 '2w9c34maz.cname.ngrok.io'
4>使用 '-hostname' 选项来调用 ngrok,并将我们自定义的域名作为参数。确保我们指定的 -region 与保留域名的区域相匹配。
示例:
在自定义域名上运行隧道
ngrok http -region=us -hostname=dev.example.com 8000
注意:
通过 HTTPS 访问自定义域隧道仍然可以工作,但证书不匹配。 如果有 TLS 证书/密钥对,尝试使用 TLS 隧道。
4.禁用监测
Ngrok 记录了通过隧道的每个 HTTP 请求和响应,用于监测(inspect)和重播(replay)。虽然这对于开发很有帮助,但当我们在生产环境中,运行 ngrok 时,基于安全和性能,我们可能希望禁用它。使用 '-inspect' 选项来禁用隧道监测。
示例:
无监听 http 隧道
ngrok http --inspect=false 80
5.重写主机头(rewriting HOST header)
转发到本地端口时,ngrok 一点也不会修改经过隧道的 HTTP 请求,它们会在收到时,会被逐字节的复制到本地服务器。一些应用服务器,例如:WAMP、MAMP 以及 paw,使用主机头(Host header)来决定要展示的开发站点。基于这个原因,ngrok 允许通过修改主机头,来重写请求。使用 '-host-header' 选项,来重写新来的 HTTP 请求。
如果指定了 'rewrite',主机头(Host header)将被重写,以匹配转发地址的主机名部分。任何其他值,将导致主机头被重写为:-host-header指定的值。
将主机头重写为 'site.dev'
ngrok http -host-header=rewrite site.dev:80
将主机头重写为 'example.com'
ngrok http -host-header=example.com 80
6.仅 HTTP 或 HTTPS 隧道
默认情况下,当 ngrok 运行一个 HTTP 隧道时,会同时打开 HTTP 和 HTTPS 流量端点。如果只希望转发 HTTP 或 HTTPS 流量,而非同时转发2者,可以使用 '-bind-tls' 选项。
示例:
只监听 HTTP 隧道端点
ngrok http -bind-tls=false site.dev:80
示例:
只监听 HTTPS 隧道端点
ngrok http -bind-tls=true site.dev:80
7.Websockets
Websocket 端点通过 ngrok 的 http 隧道工作,无需任何更改。但是,目前还不支持监听它们。
TLS隧道:
HTTPS 隧道使用 ngrok.com 证书终止 ngrok.com 服务器上所有 TLS(SSL) 流量。对于生产级服务,我们想要使用自己的 TLS 秘钥和证书来加密我们的隧道流量。使用 TLS 隧道,ngrok 使这非常容易。
转发 TLS 流量到本地 443 端口的 HTTPS 服务
ngrok tls --subdomain=encrypted 443
一旦我们的隧道运行,使用 curl 来访问。
crul --insecure https://encrypted.ngrok.io
没有证书的 TLS 隧道的警告
注意之前 curl 命令示例的 --insecure 选项。我们需要指定该选项,因为我们本地的 HTTPS 服务器没有终止任何 ngrok.io 子域名的流量所需的 TLS 秘钥和证书。如果我们尝试在 web 浏览器中加载该页面,我们会注意到,它会告诉我们页面不安全,因为证书不匹配。
如果我们希望证书匹配并受保护,我们需要做两件事。首先,我们需要为我们拥有的域名购买一个 SSL(TLS) 证书,并配置我们的本地 web 服务使用该证书和证书私钥来终止 TLS 连接。如何实现此操作特定于我们的 web 服务器和 SSL 证书提供商,超过了本文档的范围。为了举例,我们假定已经获得 secure.example.com 域名的 SSL 证书。
一旦我们已经获得了秘钥和证书,并且已经合适地安装了它们,现在可以在我们自己自定义的域名运行一个 TLS 隧道。设置方法与 HTTP 隧道章节中的 '自定义域名上设置隧道' 描述的一致。我们注册的自定义域名必须与 SSL 证书的域名一致(secure.domain.com)。设置自定义域名后,使用 '-hostname' 参数在我们自己的域名上来启动 TLS 隧道。
通过我们自己自定义域名转发 TLS 流量
ngrok tls -region=us -hostname=secure.example.com 443
终止 TLS 连接
我们尝试暴露的服务可能无法终止 TLS 连接。Ngrok 客户端可以为我们实现,以便我们可以端-端加密流量,而且无需担心本地服务是否支持 TLS。指定 -crt 和 -key 命令行选项,来指定 TLS 证书和密钥的文件系统路径,ngrok 客户端将负责为我们终止 TLS 连接。
将 TLS 终止交给 ngrok 客户端
ngrok tls -region=us -hostname secure.example.com -key /path/to/tls.key -crt /path/to/tls.crt 80
通过 TLS 隧道运行非 HTTP 服务
Ngrok LTS 隧道对所传输的底层协议不作任何假设。本文档中的所有示例都使用 HTTPS,因为它是最常见的用例,但我们可以通过 TLS 隧道运行任何 TLS 包装的协议(例如:imaps、smtps、sips等),而无需任何更改。
兼容的客户端
TLS 隧道通过检查 '进来的 TLS 连接上的,服务器名称信息(Server Name Information - SNI)扩展中存在的' 数据来工作。并非所有启动 TLS 连接的客户端都支持设置 SNI 扩展数据。这些客户端无法与 ngrok 的 TLS 隧道一起正常工作。幸运的是,几乎所有现代浏览器都使用 SNI。但是,一些现代软件库并不支持 SNI。以下客户端不支持 SNI,不支持 TLS 隧道:
IE 6.0
Windows XP 上的 IE 7 & 8 或更早版本
Android 2.X 上的原生浏览器
Java <= 1.6
Python 2.X、3.0、3.1,如果未安装依赖模块
更完整的列表可以在 'https://en.wikipedia.org/wiki/Server_Name_Indication#No_support' 找到。
TCP隧道:
1.并非我们希望暴露的所有服务,都是基于 HTTP 或 LTS。Ngrok TCP 隧道允许我们暴露,运行在 TCP 协议上的任何网络服务。这通常用于暴露 SSH,游戏服务器,数据库等。启动 TCP 隧道很简单。
暴露一个运行在 1234 端口的 TCP 服务:
ngrok tcp 1234
示例:
暴露一个监听在默认端口的 ssh 服务
ngrok tcp 22
暴露一个监听在默认端口的 Postgres 服务
ngrok tcp 5431
暴露一个监听在默认端口的 Minecraft 服务
ngrok tcp 25565
2.监听一个保留的远程地址
通常,每次启动一个 TCP 隧道,都会随机分配远程地址和端口。对于生产服务(或为了方便),我们经常需要一个稳定的,有保证的远程地址。 为此,首先,登录 ngrok.com 仪表盘,然后单击 "Reserved TCP Address" 页面中的 "Reserve Address"。之后,当调用 ngrok 时,使用 "-remote-addr" 选项,在 '保留的 TCP 地址' 上绑定一个隧道。确保我们指定的 -region 与保留地址的区域相匹配。
在保留的远程地址上绑定 TCP 隧道
ngrok tcp -remote-addr 1.tcp.ngrok.io:20301 22
更多的隧道选项
1.通配符域名
ngrok 允许我们给通配符域名,绑定 HTTP 和 TLS 隧道。所有的通配符域名,甚至是 'ngrok.io' 子域名,必须首先在 '个人账户的信息中心' 配置。当使用 '-hostname' 或 '-subdomain' 选项时,指定一个前导的 "*",来绑定通配符域名。
绑定一个隧道来接收 example.com 的所有子域名的流量
ngrok http --hostname *.example.com 80
2.通配符域名规则
通配符域名的使用,在 ngrok.com 服务的某些方面,可能产生歧义。下面的规则正是用于解决这些问题,并且当你使用配置符域名时,理解这些规则非常重要:
例如,假设已为你的账号保留了 "*.example.com" 地址.
1>嵌套的子域名(例如:foo.bar.baz.example.com)的连接,将会路由到通配符隧道
2>我们可以为 "example.com" 的任意有效的子域名,绑定隧道,而不用创建额外的保留域名条目
3>其他账号不可以保留 "foo.example.com" 域名,或者
4>连接将会被路由到,最具体的匹配规则。如果你为 "foo.example.com" 和 "*.example.com" 都运行了隧道,'foo.example.com' 的请求,总是会路由到 "foo.example.com"。
3.转发到一个其他机器上的服务(非本地服务)
ngrok 可以转发到不运行在本地机器上的服务。并非只指定端口号(本地只需要指定端口号),而需要指定一个网络地址和一个端口(远程机器)
示例:
转发到其他机器的 web 服务
ngrok http 192.168.1.1:8080
全球架构
不考虑(ngrok.com 提供的服务)
IP白名单隧道访问
不考虑(ngrok.com 提供的服务)
ngrok配置文件
有时ngrok的配置太复杂,无法在命令行中表达。ngrok支持一个可选的,极其简单的 "YAML" 配置文件,为我们提供了同时运行多个隧道的功能,以及设置ngrok一些更复杂的配置
1.配置文件路径
可以使用 '-config' 选项,来指定配置文件路径。推荐用于所有生产部署。
显示指定配置文件路径
ngrok http -config=/opt/ngrok/conf/ngrok.yml 8000
我们可以多次传递 '-config' 选项。如果这样做了,第一个配置文件被解析,之后的每个连续的配置文件将被合并在它的顶部。这允许我们可以按项目来配置 ngrok:
1>家目录放置主配置文件 - 我们的 authtoken 和其他全局配置
2>每个项目配置项目的配置文件 - 项目相关的隧道配置
ngrok start -config ~/ngrok.yml -config ~/projects/example/ngrok.yml demo admin
2.默认配置文件路径
如果未指定配置文件路径,ngrok 尝试从默认路径 "$HOME/.ngrok2/ngrok.yml" 查找配置文件。配置文件是可选的,即使没有配置文件,也不会报错。
在默认的路径中,'$HOME' 是当前用户的家目录,取决于我们的操作系统。它并非环境变量 "$HOME",虽然这两者总是相同的。对于主流操作系统,假设我们的用户名是 "example",默认的配置文件路径为:
OS X - /Users/example/.ngrok2/ngrok.yml
Linux - /home/example/.ngrok2/ngrok.yml
Windows - C:\Users\example\.ngrok2\ngrok.yml
3.隧道定义
配置文件最常用于定义隧道配置。定义隧道配置是非常有用的,因为我们可以在命令行上,通过隧道名,来启动预先配置的隧道,而不用每次记住所有正确的参数。
隧道定义在配置文件中的 "tunnels" 属性下,以 'name' -> 'configuration' 的映射关系存储。
定义 2 个隧道,名称为 'httpbin' 和 'demo':
tunnels:
httpbin:
proto: http
addr: 8000
subdomain: alan-httpbin
demo:
proto: http
addr: 9090
hostname: demo.inconshreveable.com
inspect: false
auth: "demo:secret"
启用 'httpbin' 隧道:
ngrok start httpbin // 传递 '隧道名',来启动隧道
每个隧道定义,是一个配置选项名称和值的映射关系。配置选项的名称通常和命令行上的选项名相同。每个隧道必须定义 "proto" 和 "addr" 属性。其他属性是可用的,并且许多属性是协议特定的。
隧道配置属性:
proto - (必须,所有协议) - 隧道协议名称,http, tcp, tls 其中一个
addr - (必须,所有协议) - 将流量转发到本地端口或网络地址
inspect - (所有协议) - 启用http请求监测
auth - (http协议) - 隧道请求时,强制使用 HTTP Basic 认证
host_header - (http协议) - 重写HTTP主机头到给定的值;或者设置 "preserve" 来保持不变
bind_tls - (http协议) - 绑定一个HTTP或HTTPS端点,true-https|false-http|both-二者
subdomain - (http和tls协议) - 请求的子域名。如果未指定,使用隧道名
hostname - (http和tls协议) - 请求的主机名(包含保留名和DNS CNAME)
crt - (tls协议) - PEM TLS 证书相关
key - (tls协议) - PEM TLS 证书相关
client_cas - (tls协议) - PEM TLS 证书相关
remote_addr - (tcp协议) - 在给定地址上,绑定远程的TCP端口
4.同时运行多个隧道
我们可以传递多个隧道名给 ngrok start,ngrok 将同时运行它们
从配置文件中启动 3 个命名的隧道:
ngrok start admin ssh metrics
我们也可以通过 "--all" 选项,让 ngrok 启动所有定义在配置文件中的隧道
启动定义在配置文件中的所有隧道:
ngrok start --all
相反,我们可以通过 "--none" 选项,让 ngrok 不启动任何隧道。这对于通过 API 来完全管理 ngrok 隧道是很有用的。
运行 ngrok,不启动任何隧道:
ngrok start --none
5.配置文件示例:
配置文件示例如下所示。后续部分包含了显示在这些示例中的所有配置参数的完整文档。
为多个虚拟主机开发站点运行隧道:
authtoken: 4nq9771bPxe8ctg7LKr_2ClH7Y15Zqe4bWLWF9p
tunnels:
app-foo:
addr: 80
proto: http
host_header: app-foo.dev
app-bar:
addr: 80
proto: http
host_header: app-bar.dev
使用我们自己的证书,在 http 和 httpps 上,自定义域名创建隧道:
authtoken: 4nq9771bPxe8ctg7LKr_2ClH7Y15Zqe4bWLWF9p
tunnels:
myapp-http:
addr: 80
proto: http
hostname: example.com
bind_tls: false
myapp-https:
addr: 443
proto: tls
hostname: example.com
在隧道上暴露 ngrok 的 web 监测接口和 API:
authtoken: 4nq9771bPxe8ctg7LKr_2ClH7Y15Zqe4bWLWF9p
tunnels:
myapp-http:
addr: 4040
proto: http
subdomain: myapp-inspect
auth: "user:password"
inspect: false
包含所有选项的配置文件示例:
authtoken: 4nq9771bPxe8ctg7LKr_2ClH7Y15Zqe4bWLWF9p
region: us
console_ui: true
http_proxy: false
inspect_db_size: 50000000
log_level: info
log_format: json
log: /var/log/ngrok.log
metadata: '{"serial": "00012xa-33rUtz9", "comment": "For customer [email protected]"}'
root_cas: trusted
socks5_proxy: "socks5://localhost:9150"
update: false
update_channel: stable
web_addr: localhost:4040
tunnels:
website:
addr: 8888
auth: bob:bobpassword
bind_tls: true
host_header: "myapp.dev"
inspect: false
proto: http
subdomain: myapp
e2etls:
addr: 9000
proto: tls
hostname: myapp.example.com
crt: example.crt
key: example.key
ssh-access:
addr: 22
proto: tcp
remote_addr: 1.tcp.ngrok.io:12345
6.配置选项:
authtoken
当连接到 'ngrok.com' 服务时,用于认证客户端。当创建了一个 'ngrok.com' 帐户,将在帐户信息设置中,显示该认证字段
console_ui
true - 启用控制台UI界面
false - 禁用控制台UI界面
iftty - 只有当标准输出是一个 'TTY',而不是文件或管道时,才启用控制台UI界面(默认值)
console_ui_color
translate - 当显示控制台UI界面时,不设置背景颜色
black - 设置控制台UI界面的背景颜色为黑色(默认值)
http_proxy
用于建立隧道连接的HTTP代理的URL。许多HTTP代理有连接大小和持续时间的限制,这将导致ngrok失败。像许多其他网络工具一样,如果设置了 "http_proxy",ngrok也将检查 "http_proxy" 环境变量
http_proxy: "http://user:[email protected]:3128"
inspect_db_size
分配给用于监测和重播的HTTP隧道的请求的内存上限,单位为字节,正整数。
0 - 使用默认分配的限制,50M
-1 - 禁用监测数据库;同禁用所有隧道的监测效果一致。
log_level
日志级别,随着日志冗长顺序递增:
crit, warn, error, info, debug
log_format
日志记录格式:
logfmt - 对人类和机器友好的键、值对
json - 换行符分隔的json对象
term - 如果标准输出是 'TTY',色彩高亮显示。否则是 'logfmt'
log
记录日志位置
stdout - 标准输出
stderr - 标准错误输出
false - 禁用日志(默认)
其他值 - 硬盘上指定的文件路径
示例:log: /var/log/ngrok.log
metadata
不透明的,用户提供的字符串,将作为ngrok.com API响应的一部分返回给此客户端启动的所有隧道的在线资源列表。 这是一种有用的机制来识别您自己的设备或客户标识符的隧道。 最多4096个字符。
// 可理解为一种客户端的唯一标识,来区分不同的客户端启用的隧道
示例:metadata: bad8c1c0-8fce-11e4-b4a9-0800200c9a66
region
ngrok客户端选择的用于连接的区域。(ngrok服务,支持全球架设,支持4大区域)
us - 美国
eu - 欧洲
ap - 亚洲
au - 澳大利亚
root_cas
用于验证与ngrok服务器的TLS连接的根证书颁发机构
trusted - 仅使用 'ngrok.com' 隧道服务信任的根证书(默认)
host -
其他值 -
socks5_proxy
使用 SOCKS5 代理,建立到ngrok服务器的连接
示例:socks5_proxy: "socks5://localhost:9150"
tunnels
隧道定义
update
true - 如果有效,将自动更新ngrok到最新版本
false - 除非用户手动更新,将不会更新ngrok(默认)
update_channel
ngrok更新的版本
stable - 稳定版(默认)
beta - 不稳定版本
web_addr
服务于本地web接口和api的网络地址绑定
网络地址 - 绑定其他地址
127.0.0.1:4040 - 默认的网络地址
false - 禁用webUI界面
ngrok 与 ... 一起使用(看文档)
1.Wordpress
2.虚拟主机(MAMP、WAMP等)
3.Visual Stutio/IIS Express
4.出站代理(An outbound proxy)
5.node.js
6.Puppet(一款运维工具)
故障排除
带有 HTTP basic 身份认证的 CORS(CORS with HTTP basic authentication)
是的,但是我们不能使用 ngrok 的 -auth 选项。Ngrok 的 http 隧道允许我们指定基本的身份验证凭证以保护我们的隧道。然而,ngrok 对所有请求强制执行此策略,包括 CORS 规范要求的预检 OPTIONS 请求。在这种情况下,我们的应用必须实现自己的基本身份验证。更多信息,参考 github issue(https://github.com/inconshreveable/ngrok/issues/196)
ngrok 客户端 API
ngrok 客户端暴露了一个 REST API,授予对以下内容的编程访问:
1>收集状态和指标信息
2>收集和重播捕获的请求
3>动态启动和停止隧道
1.基准 URL 和身份认证
Base URL - http://127.0.0.1:4040/api
Authentication - None
ngrok 客户端 API,作为 ngrok 本地 web 监测接口的一部分,暴露出来。因为它服务于本地接口,API 没有身份认证。我们可以在配置文件中,覆盖 "web_addr" 配置项来改变基准 URL。
访问正在运行的 ngrok 客户端的根 API 资源:
curl http://localhost:4040/api
2.支持的内容类型
必须使用 "application/json" 将请求参数编码到 API。确保我们的客户端正确设置请求的 'Content-Type' 标头。API 返回的所有响应都是 "application/json" 编码。
3.版本控制和 API 稳定性
ngrok 客户端API保证除非调用者明确地选择使用较新的版本,否则绝对不会对API进行更改。
看手册 - 没啥用
4.列出隧道
返回正在运行的、包含了状态和指标信息的隧道列表。
请求:
get /api/tunnels
响应:
参数:
tunnels - 列出所有正在运行的隧道。有关每个隧道对象的参数的文档, 请参阅 "隧道详情(tunnel detail)" 资源。
响应示例:
{
"tunnels": [
{},
{}
],
"uri": "/api/tunnels"
}
5.开启隧道
在 ngrok 客户端,动态启动一个新的隧道。请求体参数与定义在配置文件中的隧道参数相同。
请求:
post /api/tunnels
参数:
参数名称和行为与配置文件中定义的参数名称和行为相同。使用 "隧道定义" 部分作为配置参数及其行为的参考。
请求体示例:
{
"addr": "22",
"proto": "tcp",
"name": "ssh"
}
响应:
返回201状态码,以及描述已启动的隧道的响应体。有关响应对象参数的文档,请参阅 "隧道详情(tunnel detail)" 资源。
响应示例:
{
...
}
6.隧道详情
获取指定名称的运行隧道的状态和指标。
请求:
get /api/tunnels/:name
响应:
响应示例:
{
...
}
7.关闭隧道
关闭一个正在运行的隧道。
请求:
delete /api/tunnels/:name
响应:
返回204状态码,以及一个空的响应体
8.列出捕获的请求
返回所有捕获的 HTTP 请求列表,用于监测。这仅仅会返回仍然在内存中的请求(当内存使用超过 "inspect_db_size" 设置的值,ngrok 将删除捕获的请求)
请求:
get /api/requests/http
查询参数:
limit - 返回的请求的最大数量
tunnel_name - 仅获取指定隧道的请求
请求示例:
curl http://localhost:4040/api/requests/http?limit=50
响应:
参数:
requests - 已捕获的请求列表。每个请求的详细描述
响应示例:
{
...
}
9.重播捕获的请求
重播一个隧道的本地端点的请求
请求:
post /api/requests/http
参数:
id - 重播的请求id
tunnel_name - 重播的请求的隧道名称。如果未指定,将使用原始记录请求的隧道。(这个也是比较合理的啊)
请求示例:
curl -H "Content-Type: application/json" -d '{"id": "548fb5c700000002"}' http://localhost:4040/api/requests/http
响应:
返回204状态码,以及一个空响应体
10.删除已捕获的请求(会删除所有)
删除所有已经捕获的请求
请求:
delete /api/requests/http
响应:
返回204状态码,以及一个空响应体
11.获取捕获的请求详情
获取一个捕获请求的元数据(metadata)和原始字节(raw bytes)。原始数据在 json 响应中以 base64 编码。如果本地服务还未响应一个请求,response 的值可能为 null。
请求:
get /api/requests/http/:request_id
响应:
响应示例:
{
...
}
向后兼容
看文档
常见问答
隧道存储了哪些信息?
Ngrok 不会记录或存储通过隧道连接传输的任何数据。Ngrok 会记录一些 '以调试为目的' 的连接的信息,以及像隧道名称和连接持续时间等指标。要获得完整的端-端的安全性,使用 TLS 隧道。
Ngrok 如何发音?
en-grok
ngrok环境搭建
参考文章
https://blog.csdn.net/zhangguo5/article/details/77848658
https://github.com/clangcn/ngrok-one-key-install - ngrok 一键部署(未了解)
https://github.com/fatedier/frp/blob/master/README_zh.md - frp 反向代理(未了解)
http://www.tuicool.com/articles/ZraURrq
http://www.sunnyos.com/article-show-48.html
https://blog.csdn.net/yjc_1111/article/details/79353718
ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。
简单来说就是可以让你的本地服务暴露在外网上面,可以通过外网访问,这是我们经常需要用到的功能。
适用场景:
微信本地开发
支付宝接口本地调试
将本地的网站,可以让其他人通过外网访问,作为展示
准备工作:
1.安装git
2.安装go环境(也使用git),查看之前写的教程:http://blog.csdn.net/beyond__devil/article/details/68064202
按教程安装,是将 go 安装到了 '~/go',以后我们将其安装在 '/usr/local/go',需要的操作有:
1.mv ~/go /usr/local/
2.修改go相关环境变量
mkdir $HOME/go // 使用$HOME/go 作为go的工作目录
echo 'export GOROOT=/usr/local/go'>> ~/.bashrc
echo 'export GOPATH=$HOME/go'>> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc
source $HOME/.bashrc
3.安装ngrok
// 获取代码
git clone https://github.com/inconshreveable/ngrok.git
// 导入环境变量
export NGROK_DOMAIN="ngrok.ipxjy.com"
// 生成自签名ssl证书
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
// 拷贝证书文件到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
// 应该是日志相关(感觉都是github上的,应该不存在说的之类的)
vim /usr/local/ngrok/src/ngrok/log/logger.go
log "github.com/keepeye/log4go"
/*
import (
"fmt"
log "github.com/alecthomas/log4go" // 将这里替换下
)
*/
4.利用go开始编译ngrok客户端和服务端(利用Go的交叉编译,注意设置平台参数)
// 服务端,用的是64位centos
cd /usr/local/go/src
GOOS=linux GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=linux GOARCH=amd64 make release-server
// 客户端,用的是64位mac
cd /usr/local/go/src
GOOS=darwin GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=darwin GOARCH=amd64 make release-client
// 客户端,windows 64位
cd /usr/local/go/src
GOOS=windows GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=windows GOARCH=amd64 make release-client
最终生成的路径,都在 /usr/local/ngrok/bin
服务端:ngrokd
linux客户端:ngrok
mac64位客户端:darwin_amd64/ngork
win64位客户端:windows_amd64/ngork
5.ngrokd服务端
1>启动ngrokd服务端
/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000"
2>ngrokd后台运行
nohup /usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" &
3>结束后台运行
ps -A // 找到PID
kill PID
---
pkill ngrokd
killall ngrokd
忘记了进城相关命令,以后有时间复习
---
6.启动ngrok客户端
1>下载服务端生成的客户端软件
2>创建 ngrok.conf 配置文件
server_addr: "ngrok.ipxjy.com:8000"
trust_host_root_certs: false
3>启动客户端
./ngrok -config=./ngrok.cfg -subdomain=blog 80
setsid ./ngrok -config=./ngrok.cfg -subdomain=test 80 #在linux下如果想后台运行
需要注意:
1.ngrok服务端,按照上面的步骤,并不在 $PATH 中,我们可以选择性添加
echo 'export PATH=$PATH:/usr/local/ngrok/bin' >> ~/.bashrc
source ~/.bashrc
2.启动时,指定的 $NGROK_DOMAIN,并未永久添加到 个人配置,也可以选择性添加
echo 'export NGROK_DOMAIN=ngrok.pxjy.com' >> ~/.bashrc
source ~/.bashrc
上面的搭建步骤是之前的笔记,今天重新配置一遍:
1.安装 git
yum -y install git
2.安装 go
yum -y install golang
3.下载 ngrok 源码
mkdir ~/ngrok内网穿透
cd ~/ngrok内网穿透
git clone https://github.com/inconshreveable/ngrok.git
4.导入 ngrok 我们配置的域名
假设我们想要给 ngrok 配置的外网域名是:ngrok.test.com
echo 'export NGROK_DOMAIN=ngrok.test.com' >> ~/.bashrc
source ~/.bashrc
5.生成自签名ssl证书
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
// 拷贝证书文件到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
6.编译安装 ngrok 客户端和服务端
服务端,我们编译64位 linux 版:
GOOS=linux GOARCH=amd64 make release-server
客户端,我们编译64位 mac 和 windows 版:
GOOS=darwin GOARCH=amd64 make release-client
GOOS=windows GOARCH=amd64 make release-client
从服务器端下载编译好的客户端到本地
scp root@xxx:~/ngrok内网穿透/ngrok/bin/darwin_amd64/ngork ./
scp root@xxx:~/ngrok内网穿透/ngrok/bin/windows_amd64/ngork.exe ./
7.启动 ngrokd 服务
// 前台启动
ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8001" -httpsAddr=":8002"
// 后台启动
TODO(等有时间再整下这里,写个 service 脚本)
8.客户端连接
// 创建 ngrok.conf 配置文件
vim ngrok.conf
server_addr: "ngrok.test.com:4443"
trust_host_root_certs: false
// 启动 ngrok 客户端,8000 端口(所以我们需要在本地按端口来配置虚拟主机)
ngrok -config=./ngork.conf -subdomain=dongxuemin 8000
9.阿里云服务器配置
域名解析
假设我们的域名是:
dongxuemin.com
我们一般配置一个 'ngrok' 的二级域名
ngrok.dongxuemin.com - 指向到我们 ngrokd 所在的服务器地址
还需要配置一个泛域名
*.ngrok.dongxuemin.com - 也指向到我们 ngrokd 所在的服务器地址
开放端口
ngrokd 默认在服务器上会监听(以下 3 个端口都可以自定义):
4443 - ngrok 客户端监听地址
80 - http 监听地址
443 - https 监听地址
这 3 个端口,我们都需要放开:
1>阿里云安全策略组
2>ECS 服务器防火墙
10.相关命令
ngrokd - 服务端命令(没找到文档说明,我们运行 ngrokd --help 查看命令帮助):
-domain string
托管隧道的域名(默认是 "ngrok.com")
-httpAddr string
HTTP 连接的公共地址,空字符串表示禁用(默认是 ":80")
-httpsAddr string
监听 HTTPS 连接的公共地址,空字符串表示禁用(默认是 ":443")
-log string
将日志消息写入此文件。'stdout' 和 'none' 有特殊含义(默认是 "stdout")
-log-level string
要记录的消息级别。DEBUG、INFO、WARNING、ERROR 之一(默认是 "DEBUG")
-tlsCrt string
TLS 证书文件的路径
-tlsKey string
TLS 秘钥文件
-tunnelAddr string
ngrok 客户端监听的公共地址(默认是 ":4443")
ngrok - 客户端命令(1.x 版本可能跟我们在官网看到的文档是不同的,我们运行 ngrok --help 查看命令帮助):
使用:./ngrok [选项] <本地端口或地址>
选项:
-authtoken string
标识 ngrok.com 账号的身份认证 token
-config string
ngrok 配置文件路径(默认是:$HOME/.ngrok)
-hostname string
从 ngrok 服务器上请求一个自定义主机名。(仅限于 HTTP)(需要我们的 DNS 的 CNAME)
-httpauth string
用户名:密码 的 HTTP 基础身份认证用于保护公共隧道端点
-log string
将日志消息写入此文件。'stdout' 和 'none' 有特殊含义(默认是 "none")
-log-level string
要记录的消息级别。DEBUG、INFO、WARNING、ERROR 之一(默认是 "DEBUG")
-proto string
隧道的流量协议 {'http', 'https', 'tcp'}(默认是:'http+https')
-subdomain string
从ngrok 服务器上请求一个自定义子域名
示例:
ngrok 80
ngrok -subdomain=example 8080 // 最终的访问域名为:example.ngrok.xxx.com
ngrok -proto=tcp 22
ngrok -hostname="example.com" -httpauth="用户名:密码" 10.0.0.1
高级用法:ngrok [选项] <命令> [命令参数] [...]
ngrok start [隧道名] [...]
根据配置文件中的隧道名来启用隧道
ngrok start-all
启动定义在配置文件中的所有隧道
ngrok list
列出定义在配置文件中的所有隧道
ngrok help
帮助
ngrok version
ngrok 版本
示例:
ngork start www api blog pubsub
ngork -log=stdout -config=ngrok.yml start ssh
ngrok start-all
ngrok version