⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Fight/Star-58k-bendifuwugongwangfangwentongdao-tunnelto/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

tunnelto 是个什么东西

写后端的同学多半都遇到过这种场景——本地起一个 Spring Boot 跑在 8080:

  • 想让微信支付的 notify_url 回调进来——但回调必须是公网域名,本机 localhost 接收不到;
  • 跨网域联调 webhook——前端在家、后端在公司局域网,VPN 拉不通;
  • 给老板演示半成品 demo——还在改的 H5,总不能每次都打包推服务器。

这种”把本地端口暂时推到公网”的需求,业内叫内网穿透。tunnelto 就是干这个的——一行命令 把你 localhost:8080 推到公网,给你一个 https://xxx.tunnelto.dev 的临时域名。

tunnelto --port 8080
# → https://random.tunnelto.dev → http://localhost:8080

这是一个 Rust 写的、纯 async-io / tokio 实现的内网穿透工具,截至本文发稿 GitHub Star 6.6k+——89% 的代码是 Rust——性能是这个赛道里最强的之一。

仓库地址:https://github.com/agrinman/tunnelto

横向对比:tunnelto vs ngrok vs frp vs cpolar

内网穿透这个赛道里——ngrok 是老大、frp 是国人首选、tunnelto 是 Rust 党的最爱、cpolar 是国内运营较好的商用替代——这四款是你大概率会遇到的全部选项:

工具 底层语言 自部署 免费档位 域名稳定性 致命短板
ngrok Go 收费版才支持 1 个固定域名 重启换域名(免费) 国内访问偶发不稳,付费才解锁绝大多数功能
frp Go ✅ 必须自己部署 完全免费 自部署完全自定 没有 SaaS,必须有公网服务器
tunnelto Rust ✅ 支持 随机子域名 重启换域名 免费版子域名随机,稳定性靠社区维护
cpolar 闭源 ❌ 1 个固定域名 有付费档可锁定 商用、不开源、有流量天花板

一句话区分这四款:

  • 想白嫖跑 demo / 临时联调 → tunnelto / ngrok 都行,看顺手;
  • 真要长期挂在自己服务器上 → frp 是国内默认答案,自部署 + 完全免费 + 文档全中文;
  • 完全没运维能力又愿意付钱 → cpolar / ngrok 付费版;
  • 追求极致性能 + Rust 党 → tunnelto。

研发能用它干啥:5 个真实场景

不是所有场景都需要内网穿透。但下面这 5 个——装一个 tunnelto 真的能省事:

  • 微信 / 支付宝回调联调——notify_url 必须是公网域名才能回调进来。本地起一个 Spring Boot,tunnelto --port 8080,把 https://x.tunnelto.dev/pay/notify 填到沙箱配置里,断点直接打在 @PostMapping("/pay/notify")——省掉每次推服务器的 5 分钟;
  • GitHub / GitLab Webhook 调试——同理,给本地 Jenkins / GitHub Actions 模拟用——push 一次代码,本机断点直接命中;
  • 前端跨网域联调——前端同事在家、后端在公司局域网。一根隧道把局域网接口暴露到外网,省掉拉 VPN 的麻烦;
  • 给客户 / 老板演示半成品 demo——还在改的 H5 不想推到正式环境,临时甩一个 tunnelto 链接过去,演示完就关;
  • IoT / 移动端真机联调——手机连不上 localhost,但能访问公网域名。给嵌入式设备 / 真机调用本机 mock 服务用。

注意:生产流量绝对别走内网穿透。它是调试 / 演示工具,不是部署方案——这点 4 个工具都一样。

30 秒装好:一行命令把本地端口推到公网

macOS / Linux 上,brew 一行解决:

brew install agrinman/tap/tunnelto

或者用 cargo:

cargo install tunnelto

Windows 党直接去 Releases 页下二进制丢进 PATH 就行:https://github.com/agrinman/tunnelto/releases

跑起来——假设你本地 Spring Boot 监听 8080:

tunnelto --port 8080
# 输出类似:
# https://abc123.tunnelto.dev → http://localhost:8080

想锁定子域名?去 https://tunnelto.dev/ 注册一个免费 API key——然后:

tunnelto set-auth --key <你的key>
tunnelto --port 8080 --subdomain my-springboot
# → https://my-springboot.tunnelto.dev

子域名锁定后重启就不变了——方便长期联调。

它还自带一个本地 introspection dashboard——浏览器打开 http://localhost:9999,能看到所有进出的请求、响应和耗时——类似 Postman 抓包。调微信回调时这个特别有用——可以直接看微信带过来的签名参数。

自部署:把服务端搬回自己的服务器

tunnelto 默认连官方 SaaS(tunnelto.dev)。如果你不放心数据走第三方——仓库里也提供了 server 端代码(tunnelto_server 二进制),支持自部署——具体启动参数和环境变量请直接看 官方 README 的 self-hosting 章节,它的 CLI 参数迭代过几版、本文不照抄避免误导。

自部署方案的真实痛点(这几条不会变):

  • 服务端需要泛域名解析——每个客户端会拿到一个 <sub>.yourdomain.com 子域名,*.yourdomain.com 必须全部 A 记录到这台服务器;
  • HTTPS 证书要自己配——官方 SaaS 自带 Let’s Encrypt 通配符证书,自部署得自己用 acme.sh 申请通配符证书 + 配 nginx 转发——这一步会劝退至少一半人;
  • 运维成本不低——服务器不挂的前提下还得加监控 + 自动续证 + 容量评估。

这也是为什么国内研发更多直接用 frp——frp 文档把这一步写得更详细,社区里能找到现成的 systemd / Docker 部署脚本——新手 30 分钟能跑通。

frp 仓库:https://github.com/fatedier/frp

真实边界:用之前要知道的 4 件事

按破坏力从高到低:

边界 1:免费版子域名重启就变(最常见)

不锁定子域名的话——每次 tunnelto --port 8080 都会拿到一个新的随机子域名——临时调试无所谓,长期联调一定要去 tunnelto.dev 注册免费 API key 锁定子域名。

边界 2:依赖第三方 SaaS(常见)

默认走官方 tunnelto.dev——这意味着你的所有调试流量都过它的中继。敏感数据 / 内网联调 不要走默认 SaaS,自部署一套服务端是更稳的选择。

边界 3:流量受限(少见但破坏力大)

免费版有流量配额——长时间挂着大流量调试会被限速。生产流量 不要走 tunnelto——这是它的定位边界,只用作本地调试 + 演示场景。

边界 4:cargo install 偶尔依赖解析失败(高级场景)

如果你用 cargo install tunnelto 装时报依赖解析失败——大概率是你本地 Rust toolchain 版本不匹配。优先用 brew 装——brew 包是预编译的二进制,比 cargo 编译稳定一档。Windows 用户直接下 GitHub release 二进制——别折腾 cargo。

我的判断

我对 tunnelto 的真实态度是:Rust 写得很漂亮、设计很克制、用起来一点都不难——是非常好的”日常调试工具”。

临时调试——用它没问题,brew 一行就装好了,调完就关;
长期联调 / 长期挂着 ——去用 frp(仓库 https://github.com/fatedier/frp):国人维护、中文文档、活跃更新——研发同学社区里能找到所有问题的答案;
完全不想运维——去开 ngrok / cpolar 的付费版——每月一杯咖啡钱,省心。

工具组合的最佳姿势是 “tunnelto 装本机调试用 + frp 部署在自家服务器做长期联调用”——两手抓——临时和长期场景都覆盖了。

仓库地址:https://github.com/agrinman/tunnelto

文章目录
  1. 1. tunnelto 是个什么东西
  2. 2. 横向对比:tunnelto vs ngrok vs frp vs cpolar
  3. 3. 研发能用它干啥:5 个真实场景
  4. 4. 30 秒装好:一行命令把本地端口推到公网
  5. 5. 自部署:把服务端搬回自己的服务器
  6. 6. 真实边界:用之前要知道的 4 件事
    1. 6.0.1. 边界 1:免费版子域名重启就变(最常见)
    2. 6.0.2. 边界 2:依赖第三方 SaaS(常见)
    3. 6.0.3. 边界 3:流量受限(少见但破坏力大)
    4. 6.0.4. 边界 4:cargo install 偶尔依赖解析失败(高级场景)
  • 7. 我的判断