前言

平时开发时,经常遇到需要把本地服务分享给外部测试或调用 Webhook 的场景,但公司的开发机没有公网 IP,防火墙限制也无法自行开放端口。ngrok 就是来解决这个问题的——一条命令,把本地端口映射到公网 HTTPS 地址。

同时它现在已升级为 AI & API Gateway 平台,不只是隧道,还提供流量策略、WAF、API 路由等企业级功能。

ngrok 是什么

ngrok 是一个云端网络平台,核心能力有三个:

  1. 安全隧道 — 把本地服务暴露到公网,无需开放防火墙端口
  2. AI & API 网关 — 统一管理多个 AI API 的路由、认证和流量控制
  3. Traffic Policy — 用 CEL 表达式配置流量规则,替代复杂的 nginx 配置

快速开始

安装

1
2
3
4
5
6
7
# macOS
brew install ngrok

# Linux
curl -s 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

启动隧道

最基础的用法,把本地 8080 端口暴露到公网:

1
ngrok http 8080

运行后 ngrok 会输出一个公网地址,类似:

1
https://xxxx.ngrok-free.app

访问这个地址,所有请求都会被转发到本地的 8080 端口。

基本认证

给隧道加一层 HTTP Basic Auth:

1
ngrok http 8080 --basic-auth "user:password"

TCP 端口转发

暴露非 HTTP 服务,比如数据库:

1
ngrok tcp 5432

配置 Authtoken

首次使用需要配置 Token(从 https://dashboard.ngrok.com 获取):

1
ngrok config add-authtoken <YOUR_TOKEN>

进阶功能

Traffic Policy

ngrok 支持用 CEL 表达式定义流量策略,比如对特定路径限流:

1
2
ngrok http 8080 \
--traffic-policy-file traffic-policy.yaml
1
2
3
4
5
6
7
8
9
10
11
12
# traffic-policy.yaml 示例
on_http_request:
- expressions:
- "req.url.path.startsWith('/api')"
actions:
- type: rate-limit
config:
algorithm: sliding_window
bucket_key:
- conn.client_ip
capacity: 100
rate: 60s

绑定自定义域名

付费版本支持绑定自己的域名:

1
ngrok http 8080 --domain=api.yourdomain.com

日志与监控

ngrok 提供 Traffic Inspector,可实时查看每个请求的详细信息,包括 headers、body、延迟等。

常见使用场景

场景 命令
暴露本地 Web 服务 ngrok http 3000
测试 Webhook(GitHub/Slack 等) ngrok http 3000
远程访问本地数据库 ngrok tcp 5432
移动端调试 ngrok http 8080
给外部同事演示本地项目 ngrok http 3000 --basic-auth "demo:demo123"

注意事项

  • 免费版每次重启会变更地址,付费版可固定域名
  • 免费版有连接数和带宽限制
  • 不要把线上服务直接暴露在公网,建议配合认证使用

结语

ngrok 是我日常开发中使用频率最高的工具之一,特别是在前后端联调、Webhook 测试、远程演示等场景下,一行命令解决问题。相比自己搭 VPN 或配置反向代理,ngrok 的体验非常顺滑。

官网:https://ngrok.com