bore 还是 tunnelto?Rust 内网穿透双雄选型与上手指南

bore 还是 tunnelto?Rust 内网穿透双雄选型与上手指南
bore 还是 tunnelto?Rust 内网穿透双雄选型与上手指南

bore 还是 tunnelto?Rust 内网穿透双雄选型与上手指南

本地跑着 Spring Boot、Vite 或 FastAPI,微信回调打不进来;同事在家,你的 API 还在公司内网;老板突然要看 Demo,你又不想把半成品部署到测试服——这类场景里,内网穿透几乎是开发者的标配能力。

近两年 Rust 生态里冒出两款口碑很好的 CLI:bore(公网实例 bore.pub)和 tunnelto(公网实例 tunnelto.dev)。它们都被拿来和 ngrok、frp、localtunnel 比较,但设计哲学完全不同:一个只管 TCP 转发,一个为 Web 联调做了全套封装。

本文从原理、命令、场景到安全边界,帮你一次性搞懂「综合开发者该怎么选、怎么用」。

封面:bore 与 tunnelto 选型指南


一、30 秒看懂:它们各自解决什么问题?

维度 bore tunnelto
一句话 极简 TCP 隧道,把本地端口搬到公网 面向 Web 的 HTTPS 穿透 + 调试面板
协议层 TCP(SSH、数据库、任意端口) 主要服务 HTTP/HTTPS 本地 Web
公网形态 bore.pub:随机端口 https://子域名.tunnelto.dev
HTTPS 不处理,需自建反代 官方 SaaS 自带 HTTPS
流量面板 本地 http://localhost:9999
Star 量级 GitHub 约 8k+ GitHub 约 6k+
适合谁 要穿透非 HTTP、追求极简 Webhook/支付回调/前后端联调

记忆口诀

  • 穿透 MySQL / SSH / 游戏端口 → 想少配置 → bore
  • 穿透 本地 8080 Web API,还要 HTTPS 回调地址tunnelto

插图:bore 与 tunnelto 架构对比


二、底层原理:为什么同是 Rust,体验却差这么多?

2.1 bore:只做「TCP 管道」

bore 的定位在官方 README 里写得很直白:"That's all it does: no more, and no less."

工作流程大致是:

1. 客户端 bore local 连到远程 bore server(或公共 bore.pub

2. 通过控制通道(默认端口 7835)协商「远程监听哪个端口」

3. 公网访问 bore.pub:端口 时,流量被原样转发到你本机 localhost:PORT

不解析 HTTP,也不终结 TLS。所以你拿到的是「裸 TCP 隧道」——灵活,但 Web 场景要自己处理证书和域名。

2.2 tunnelto:HTTP 反向代理 + 子域名路由

tunnelto 在客户端与 tunnelto_server 之间建立控制连接,把公网 HTTPS 请求按 Host 子域名 路由到本地 http://localhost:端口

因此它天然适合:

  • 支付/微信 notify_url(必须是公网 HTTPS)
  • GitHub / 飞书 Webhook(对方只认 URL,不认端口)
  • 手机真机访问你电脑上的 dev server(HTTPS 页面混合内容限制更少)

底层同样基于 Tokio 异步 IO,高并发时内存占用低;但产品层多了子域名、Dashboard、API Key 绑定等「Web 开发者友好」能力。


三、上手命令:复制就能跑

3.1 bore:一行映射本地端口

安装(任选其一)

bore 还是 tunnelto?Rust 内网穿透双雄选型与上手指南

# Rust 生态
cargo install bore-cli

# 或下载 Release 二进制:https://github.com/ekzhang/bore/releases

使用公共服务器 bore.pub

# 把本地 8000 暴露到 bore.pub 的随机远程端口
bore local 8000 --to bore.pub

典型输出(端口每次可能不同):

listening at bore.pub:51234

访问方式:http://bore.pub:51234(注意是 带端口 的 HTTP,不是子域名路径)。

指定远程端口(需该端口空闲)

bore local 8000 --to bore.pub --port 19999

自建服务端(团队内网 / 合规场景)

# 公网 VPS 上
bore server

# 本机连接自己的服务器
bore local 8000 --to your-vps-ip

可选环境变量 BORE_SECRET 为控制通道增加简单鉴权。

本机实测 bore --help 输出摘要:

Usage: bore <COMMAND>

Commands:
local Starts a local proxy to the remote server
server Runs the remote proxy server

3.2 tunnelto:HTTPS 域名直达本地 Web

安装

brew install agrinman/tap/tunnelto
# 或
cargo install tunnelto

最简启动(本地 8080)

tunnelto --port 8080

输出示例:

https://a1b2c3d4.tunnelto.dev/ -> http://localhost:8080/

固定子域名(推荐联调时绑定)

tunnelto set-auth --key sk-your-api-key-here
tunnelto --port 8080 --subdomain my-api-dev
# => https://my-api-dev.tunnelto.dev/

本地流量审计面板

隧道运行期间打开:

http://localhost:9999

可查看经隧道的 HTTP 请求/响应,调试微信回调时非常省事。


四、五大真实场景:该用谁?

场景 1:微信支付 / 支付宝沙箱回调

推荐:tunnelto

沙箱配置里的 notify_url 通常要求 HTTPS 公网 URL。tunnelto 直接给出 https://xxx.tunnelto.dev/...,填进后台即可在本机断点调试。

bore 只能给你 http://bore.pub:端口,多数支付平台不接受,还要自己在 VPS 上套 Nginx + 证书,得不偿失。

场景 2:穿透本机 PostgreSQL / Redis / SSH

推荐:bore

数据库和 SSH 都是 TCP 协议,tunnelto 的 HTTP 路由模型并不对口。bore 一条命令把 5432 或 22 映射出去即可(务必配合防火墙与强密码,见下文安全章节)。

场景 3:GitHub Actions / 飞书 Webhook 打到本地

推荐:tunnelto

Webhook 提供方按 URL 发 HTTP POST。tunnelto 的 HTTPS 端点 + 本地 Dashboard,能直接看到 payload 与 Header。

场景 4:给老板 / 客户演示本地 H5

两者皆可,优先 tunnelto

tunnelto 链接是标准 HTTPS 域名,手机点开更顺;bore 需要记住 主机:端口,且默认 HTTP,部分浏览器环境会提示不安全。

场景 5:公司有合规要求,不能走第三方 SaaS

推荐:bore 自建 或 frp

  • bore:bore server 部署在自有 VPS,客户端 --to 指向内网可控节点,架构简单。
  • tunnelto:可自建 tunnelto_server,但泛域名解析、通配证书、多实例协调成本更高;国内团队长期自建更常选 frp(文档与社区成熟)。

插图:五大开发场景选型流程


五、和 ngrok / frp / localtunnel 怎么排座次?

把 bore、tunnelto 放进「全家桶」里看,角色更清晰:

工具 类型 优势 短板
ngrok 商业 SaaS + 客户端 生态成熟、功能全 国内不稳、免费版限制多
frp 自建为主 国内文档多、稳定可控 必须有公网机、要运维
localtunnel Node 轻量 SaaS 安装简单 稳定性一般、HTTP 为主
bore 极简 TCP 二进制小、自建简单 无 HTTPS、无 Web UI
tunnelto Rust Web 隧道 HTTPS + 子域名 + Dashboard SaaS 流量经第三方

综合开发者推荐组合(亲测够用):

日常 Web 联调 / 回调调试  →  tunnelto(随开随关)
TCP 服务 / 数据库临时暴露 → bore(或 bore 自建)
长期稳定、多同事共用 → frp 自建

六、安全红线:便利不等于可以裸奔

[!WARNING] 内网穿透等于在防火墙上临时开一扇窗,以下规则请当作肌肉记忆。

1. 仅用于开发联调:演示结束立刻 Ctrl+C 关隧道,不要把穿透地址写进生产配置。

2. 公共 SaaS 中转风险bore.pubtunnelto.dev 上的流量会经过第三方服务器,禁止传输真实用户数据、生产密钥、数据库全量导出

3. bore 隧道加密有限:控制通道可用 secret,但转发中的 TCP 载荷默认不额外加密;敏感服务应套 TLS 或 VPN。

4. 固定子域名被扫描:tunnelto 绑定固定 subdomain 后,可能被扫描器撞库;本地服务不要有未授权接口、调试后门。

5. 数据库切勿长期暴露:用 bore 临时开 5432 时,务必限制来源 IP、强密码,并Prefer SSH 隧道替代直接暴露。


七、常见问题速查

Q:bore 和 tunnelto 能同时装吗?
能。它们不冲突,按场景切换命令即可。

Q:tunnelto 能穿透 WebSocket 吗?
本地 HTTP 服务升级的 WebSocket,多数情况下可以随 HTTP 一起穿透;纯 TCP 长连接更建议 bore。

Q:国内访问 bore.pub / tunnelto.dev 稳吗?
公共实例无 SLA,偶发超时正常。重要演示前先在目标网络试连;稳定需求请自建。

Q:和之前介绍的 tunnelto 专题文重复吗?
仓库里已有 tunnelto 单品深度文;本篇是 bore + tunnelto 双雄对比 + 综合选型,侧重「该用哪个」。


八、总结:一张表做最终决定

你的需求 首选
本地 Web API + HTTPS 公网地址 tunnelto
看 HTTP 请求明细、调试 Webhook tunnelto
SSH / 数据库 / 任意 TCP 端口 bore
最小依赖、自建一台 VPS 就够 bore server
团队长期内网穿透平台 frp(bore/tunnelto 作个人轻量补充)

Rust 把这两款工具的性能底子都打磨得很好;真正拉开差距的,是你需要的是「管道」还是「Web 联调套件」。搞清这一点,命令行里那两行配置,基本就不会选错。


项目地址
- bore:https://github.com/ekzhang/bore(公网示例:bore.pub
- tunnelto:https://github.com/agrinman/tunnelto(公网示例:tunnelto.dev


公众号二维码

长按二维码关注 “边学边练”

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读