Ngrok内网穿透以及与FRP、Zerotier的对比

一、Ngrok 是什么?

Ngrok 是一个一体化的云网络平台,通过创建安全隧道将本地服务暴露到公网。它能穿透 NAT、防火墙(包括双重 NAT),无需复杂的网络配置。

核心特点:

  • ⚡ 极简启动:一行命令即可将本地服务上线
  • 🔒 自动 HTTPS:自动管理 TLS 证书
  • 🌐 全球网络:通过 ngrok 全球边缘网络分发流量
  • 📦 零依赖:单文件可执行,无运行时依赖
  • 🛡️ 安全策略:支持 OAuth、IP 限制、流量策略等

img

与 FRP、ZeroTier 的对比

对比项FRPZeroTierngrok
原理反向代理(端口转发)虚拟局域网(组网)云端隧道(SaaS)
需要公网服务器✅ 必须❌❌
需要注册账号❌✅✅
自托管✅ 完全自托管❌ 用官方云❌ 用官方云
配置难度中等简单极简
免费额度完全免费25 台设备有限免费
适用场景长期稳定穿透设备互联组网快速临时分享

二、主要用途

场景说明
🖥️ 分享 localhost将本地开发中的应用暴露到公网,一行命令搞定
🔗 Webhook 测试接收第三方平台的 Webhook 回调
🌐 API 网关生产环境 API 的交付和安全保护
🤖 AI 网关路由、保护和转换到 AI 模型的流量
🔌 SSH / RDP 远程访问远程连接内网机器
📱 IoT 设备管理远程控制现场物联网设备
🏢 站点间互联安全连接客户网络中的 API 和数据库
☸️ Kubernetes Ingressngrok 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 安装,或从官网下载

验证安装:

1
ngrok help

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

通过配置启动:

1
ngrok start my-app

五、进阶功能

🔐 流量策略(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(自托管)

八、相关链接