ngrok:开源版内网穿透反向代理自建服务端与客户端指南
一、项目官方信息
| 项目 | 信息 |
|---|---|
| GitHub 仓库 | https://github.com/inconshreveable/ngrok |
| 官网 | https://ngrok.com |
| 开源协议 | BSD(v1 开源版,GitHub 未自动识别) |
| 主要语言 | Go(约 72.4%) |
| Star 数 | 约 24k |
重要现状说明:本仓库是 ngrok 旧 v1 版本的代码库,2013–2016 年间活跃开发,现已归档(archived),官方不再开发、支持或维护 v1。ngrok 云端服务继续运营,新版本转向闭源客户端 + 官方云服务(见 https://ngrok.com/signup)。本文按该开源仓库 README,记录自建 ngrok 服务端(ngrokd)+ 客户端的传统用法,供学习与自建内网穿透使用。
ngrok 是一个全局分布式反向代理,把你本机/内网的服务安全地暴露到公网:你可以把它理解为应用的"前门",把反向代理、防火墙、API 网关、全局负载均衡合而为一。
典型用途:
- 开发者预览:不部署即可从本机演示 App;
- Webhook 调试:接收并回放 HTTP 回调;
- 站点到站点连通:安全连接到客户网络内的 API/数据库;
- 调试分析:抓取并检查发往 Web 服务的 HTTP 流量。

二、官方图片
上图为 ngrok 开源仓库在 GitHub 上的社交预览图。
三、环境要求
- Go 语言环境(v1 基于 Go,需从源码编译)。
- 一台有公网 IP 的服务器(用于运行 ngrokd 服务端),以及一台需要暴露内网服务的机器(运行客户端)。
- 一个域名(可选,用于把二级域名指向 ngrokd,便于按子域名分发)。
- 编译产物为单二进制,运行时无外部依赖。
四、部署步骤(自建 v1 服务端)
1. 克隆源码
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok
2. 编译服务端 ngrokd
用 Go 编译服务端(按仓库内 Makefile 说明,通常 make server 或直接 go build 对应 server 目录):
# 编译服务端二进制 ngrokd
make server
产物为 ngrokd,部署到公网服务器。
3. 编译客户端
make client
产物为 ngrok 客户端,放到需要暴露内网服务的机器上。
提示:跨平台时可用
GOOS/GOARCH指定目标系统,例如为 Linux 服务器编译、为 macOS 本机分别编译。
4. 启动服务端 ngrokd
在公网服务器上运行 ngrokd,指定隧道与 HTTP/HTTPS 监听端口:
ngrokd -domain="ngrok.yourdomain.com" \
-httpAddr=":8080" \
-httpsAddr=":8081" \
-tunnelAddr=":4443"
-domain:客户端隧道分配的二级域名根;-httpAddr/-httpsAddr:对外提供给浏览器访问的 HTTP/HTTPS 地址;-tunnelAddr:客户端连接隧道的端口。
5. 启动客户端建立隧道
在本机(内网)上运行客户端,连接自建服务端并转发本地端口:
ngrok -server="ngrok.yourdomain.com:4443" \
-subdomain="demo" \
80
含义:把本机 80 端口的服务,通过自建隧道暴露为 http://demo.ngrok.yourdomain.com:8080。
五、使用方法
- 暴露 HTTP 服务:
ngrok -server=... -subdomain=web 8080,浏览器访问分配的公网地址即可。 - 暴露 TCP 服务:v1 支持指定 TCP 隧道,把数据库/SSH 等端口转发出去。
- 查看会话:客户端自带本地 Web 界面,可查看经过隧道的请求记录并回放。
- 生产替代:若不希望维护 v1 归档代码,可直接使用 ngrok.com 官方客户端(免费额度),或选用 gost、frp 等仍在维护的开源隧道项目。
六、常见问题 FAQ
-
这个仓库还能直接用吗? 代码可编译、可自建,但官方已归档,不再修 bug/发版。学习和自建内网穿透没问题,生产环境建议评估仍在维护的替代方案。
-
ngrokd 启动后客户端连不上? 检查服务器防火墙/安全组是否放行 tunnelAddr(如 4443)、httpAddr/httpsAddr;确认
-domain与 DNS 解析一致。 -
必须有域名吗? 自建 v1 推荐用域名做二级域名分发;只用 IP 也可跑基础隧道,但按子域名分发会受限。
-
ngrok 新版和这个 v1 什么关系? 新版 ngrok 是闭源客户端 + 官方云服务,不再开源服务端;本仓库只是历史开源 v1。
-
客户端怎么编译成 Windows 版? 用
GOOS=windows GOARCH=amd64 go build交叉编译。 -
想看流量调试怎么做? 客户端本地 Web 界面会列出经过隧道的请求,可查看、回放,用于复现 webhook。
七、跳转链接
- GitHub 仓库:https://github.com/inconshreveable/ngrok
- 官网:https://ngrok.com
- 新版登录/注册:https://ngrok.com/signup