轻松将本地端口暴露到互联网
一个常见的场景:你在本地机器上启动了一个后端服务,配置了与 Stripe 或 Telegram 等外部服务的集成,然后需要测试 webhook。但你的 localhost:8000 没有外部访问权限,申请静态 IP 太麻烦,而为了几个请求部署一套预发布环境又太费时间。
通常在这种情况下,你会本能地想到 ngrok 或类似服务。但商业替代方案总是伴随着恼人的限制:流量上限、每次重启都会变化的 URL,或者需要付费订阅才能使用的基本功能。最近我发现了 tunnelto——一款开源 Rust 工具,它名副其实地完成了它声称的功能,没有额外的麻烦。
这个工具是什么
tunnelto 项目可以让你通过隧道将本地 Web 服务器暴露到公共互联网。你在终端运行一条命令,获得一个有效的公共 URL,然后将其交给外部服务或客户端用于演示目的。
主要亮点是客户端和服务器都是使用 Rust 和异步 tokio 引擎编写的。这带来了适度的内存占用和快速处理传入连接的能力。没有臃肿的运行时或后台进程占用数 GB 的 RAM。
项目仓库位于 https://github.com/tunneltodev/tunnelto。
实际工作原理
安装只需几分钟。如果你在 macOS 上,可以通过 Homebrew 安装:
brew install agrinman/tap/tunnelto
如果你已经配置了 Rust 工具链,可以通过 Cargo 构建:
cargo install tunnelto
对于其他系统,作者在 GitHub 的 Releases 部分准备了编译好的二进制文件。
快速开始
假设你有一个在本地 8000 端口上运行的 Web 应用。你可以用这条命令将其暴露给外部世界:
tunnelto --port 8000
执行后,工具会打开一个隧道并立即提供一个可用的地址。从互联网发送到该地址的任何请求都会即时转发到你的本地端口。
有用的参数
在日常工作中,你经常需要额外的配置。以下是节省时间的标志:
--subdomain设置固定的子域名,这样你就不必在每次重启后更改 webhook 设置中的 URL--scheme在 http 和 https 之间切换协议,如果你的本地服务需要安全连接--dashboard-address启动一个本地界面用于检查和查看传入的请求--key接受 API 密钥用于隧道授权
带有显式子域名规范的命令示例:
tunnelto --port 3000 --subdomain my-test-app
这有什么用
在开发中,有几种场景隧道可以节省大量时间:
- 直接在本地调试器中通过断点调试来自支付系统、消息应用或 OAuth 提供商的传入 webhook。
- 在连接到移动网络的真实智能手机上测试移动应用,无需配置 Wi-Fi 路由器。
- 在代码尚未推送到仓库或部署到测试服务器之前,快速向同事展示布局或原型。
- 在发布前验证 HTTPS 证书和安全头。
个人感受
README 中提到了自托管服务器组件的能力,尽管文档缺少详细说明。如果你对完整流量隐私有要求,你需要深入研究代码库并在自有 VPS 上部署中继。
该项目没有太多 star(大约 400 个),提交也不是每天都有,但对于基本任务来说这个工具运行可靠。它启动快速,基本隧道功能无需注册,而且只做一件明确的事情。如果你正在寻找 ngrok 的简单开源替代品,值得查看一下仓库并尝试使用。
相关项目