Ngrok内网穿透以及与FRP、Zerotier的对比#
一、Ngrok 是什么?#
Ngrok 是一个一体化的云网络平台,通过创建安全隧道将本地服务暴露到公网。它能穿透 NAT、防火墙(包括双重 NAT),无需复杂的网络配置。
核心特点:
- ⚡ 极简启动:一行命令即可将本地服务上线
- 🔒 自动 HTTPS:自动管理 TLS 证书
- 🌐 全球网络:通过 ngrok 全球边缘网络分发流量
- 📦 零依赖:单文件可执行,无运行时依赖
- 🛡️ 安全策略:支持 OAuth、IP 限制、流量策略等

与 FRP、ZeroTier 的对比#
| 对比项 | FRP | ZeroTier | ngrok |
|---|
| 原理 | 反向代理(端口转发) | 虚拟局域网(组网) | 云端隧道(SaaS) |
| 需要公网服务器 | ✅ 必须 | ❌ | ❌ |
| 需要注册账号 | ❌ | ✅ | ✅ |
| 自托管 | ✅ 完全自托管 | ❌ 用官方云 | ❌ 用官方云 |
| 配置难度 | 中等 | 简单 | 极简 |
| 免费额度 | 完全免费 | 25 台设备 | 有限免费 |
| 适用场景 | 长期稳定穿透 | 设备互联组网 | 快速临时分享 |
二、主要用途#
| 场景 | 说明 |
|---|
| 🖥️ 分享 localhost | 将本地开发中的应用暴露到公网,一行命令搞定 |
| 🔗 Webhook 测试 | 接收第三方平台的 Webhook 回调 |
| 🌐 API 网关 | 生产环境 API 的交付和安全保护 |
| 🤖 AI 网关 | 路由、保护和转换到 AI 模型的流量 |
| 🔌 SSH / RDP 远程访问 | 远程连接内网机器 |
| 📱 IoT 设备管理 | 远程控制现场物联网设备 |
| 🏢 站点间互联 | 安全连接客户网络中的 API 和数据库 |
| ☸️ Kubernetes Ingress | ngrok Operator 为 K8s 集群提供入口 |
| 🔧 MCP 服务器连接 | 连接远程 MCP 工具服务器 |
| 🔁 HTTP 请求重放 | 检查和重放 HTTP 流量 |
三、部署方法#
1
2
| [用户/客户端] ──→ [ngrok 全球边缘网络] ──→ [ngrok Agent(本地)] ──→ [本地服务]
(自动HTTPS/负载均衡) (隧道客户端)
|
步骤(约 2 分钟完成)#
1️⃣ 注册账号#
访问 dashboard.ngrok.com/signup 注册免费账号。
2️⃣ 安装 ngrok Agent#
1
2
3
4
5
6
7
8
9
10
11
12
13
| # macOS(Homebrew)
brew install ngrok
# Debian/Ubuntu Linux
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list \
&& sudo apt update \
&& sudo apt install ngrok
# Windows
# 通过 Windows App Store 安装,或从官网下载
|
验证安装:
3️⃣ 连接账号#
从 Dashboard 获取你的 Authtoken,然后:
1
| ngrok config add-authtoken $YOUR_TOKEN
|
4️⃣ 启动本地服务#
1
2
| # 示例:启动一个简单的 HTTP 服务(端口 8080)
# 或者用你已有的任何本地服务
|
5️⃣ 一行命令上线#
1
2
| # 暴露本地 8080 端口的 HTTP 服务
ngrok http 8080
|
启动后会显示:
1
2
3
4
5
6
| Session Status online
Account your-email@example.com
Version 3.x.x
Region Asia Pacific (ap)
Web Interface http://127.0.0.1:4040
Forwarding https://xxxx-xx-xx.ngrok-free.app -> http://localhost:8080
|
访问 https://xxxx-xx-xx.ngrok-free.app 即可从公网访问你的本地服务!
四、常用命令#
HTTP/HTTPS 隧道#
1
2
3
4
5
6
7
8
| # 暴露本地 HTTP 服务
ngrok http 8080
# 暴露本地 HTTPS 服务
ngrok http https://localhost:3000
# 使用自定义域名(付费功能)
ngrok http --url=your-domain.com 8080
|
TCP 隧道#
1
2
3
4
5
6
7
8
| # 暴露 SSH(端口 22)
ngrok tcp 22
# 暴露远程桌面(端口 3389)
ngrok tcp 3389
# 暴露数据库(如 MySQL 3306)
ngrok tcp 3306
|
TLS 隧道#
1
2
| # TLS 隧道
ngrok tls 443
|
配置管理#
1
2
3
4
5
6
7
8
| # 添加 authtoken
ngrok config add-authtoken $TOKEN
# 编辑配置文件
ngrok config edit
# 查看配置
ngrok config check
|
使用配置文件启动#
编辑 ngrok.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| version: "3"
agent:
authtoken: YOUR_TOKEN
endpoints:
- name: my-app
url: your-domain.ngrok-free.app
upstream:
url: 8080
protocol: http1
traffic_policy:
on_http_request:
- actions:
- type: oauth
config:
provider: google
tunnels:
my-app:
proto: http
addr: 8080
|
通过配置启动:
五、进阶功能#
🔐 流量策略(Traffic Policy)#
通过 YAML 配置实现安全控制:
1
2
3
4
5
6
7
8
9
10
11
12
| traffic_policy:
on_http_request:
# OAuth 认证
- actions:
- type: oauth
config:
provider: google
# IP 限制
- expressions:
- "!actions.ngrok.oauth.identity.email.endsWith('@your-company.com')"
actions:
- type: deny
|
📊 Web 检查界面#
访问 http://127.0.0.1:4040 可实时查看:
- 所有 HTTP 请求和响应详情
- 请求头、Body、时间线
- 支持请求重放
🔌 Agent SDK(编程集成)#
支持在代码中直接管理 ngrok 隧道:
- JavaScript (Node.js)
- Go
- Python
- Rust
示例(Python):
1
2
3
4
| import ngrok
listener = ngrok.forward(8080, authtoken="YOUR_TOKEN")
print(f"Ingress at: {listener.url()}")
|
🖥️ 后台服务模式#
1
2
3
4
5
| # 安装为系统服务(开机自启)
ngrok service install
ngrok service start
# 远程管理(通过 API 或 Dashboard)
|
六、免费额度与定价#
| 计划 | 价格 | 主要限制 |
|---|
| Free | 免费 | 1 个在线 endpoint、随机域名、有限带宽 |
| Personal | $8/月 | 自定义域名、更多 endpoint |
| Pro | $20/月 | 更多功能、更高带宽、团队协作 |
| Enterprise | 定制 | 无限制、企业安全功能、SLA |
免费版的域名每次重启会随机变化,适合临时测试;需要固定域名需升级付费版。
七、三种工具选择建议#
| 需求 | 推荐 |
|---|
| 快速临时分享 localhost 给别人看 | ngrok(最简单) |
| 长期稳定的内网服务穿透 | FRP(完全自控) |
| 多设备组网互联、远程办公 | ZeroTier(虚拟 LAN) |
| 不想维护服务器 | ngrok 或 ZeroTier |
| 完全掌控数据和安全 | FRP(自托管) |
八、相关链接#