Rust写的TCP隧道工具,400行代码实现自建内网穿透

ekzhang/bore 是一个用 Rust 编写的 TCP 隧道工具,用途是把本地端口映射到公网服务器上,从而穿透 NAT 防火墙。截至目前,项目获得 11k+ Star。

正文顶部截图

bore 的功能很集中:将本地端口暴露到公网,不多不少,仅此而已。整份代码约 400 行,包含客户端和服务端两部分,基于 Rust 的 Tokio 异步运行时构建。作者 Eric Zhang 对项目的定位是 “That’s all it does: no more, and no less.”

README区域截图

与 localtunnel 和 ngrok 同类,bore 也是做内网穿透。关键区别在于,bore 不依赖第三方 SaaS 服务,完全可以自托管。ngrok 近年来逐步收紧免费额度,从早期的免注册使用,演变到必须绑定账号、配置 token、限制连接数,自建方案的需求随之上升,bore 正好填上了这个空缺。

安装方式覆盖了主流平台。

macOS 用户直接通过 Homebrew 安装:

brew install bore-cli

Linux 方面,Arch Linux 可通过 AUR 获得,Gentoo 有 gentoo-zh overlay 支持。其他系统从 releases 页面下载预编译二进制文件,解压后放到 PATH 路径即可。通过 Cargo 从源码编译也只需一条命令:

cargo install bore-cli

Docker 镜像同样可用,适合在容器编排环境中集成:

docker run -it --init --rm --network host ekzhang/bore <ARGS>

使用上分为客户端和服务端两个角色。

客户端执行 bore local,将本地端口转发到远程服务器。下面这行命令把本机 8000 端口映射到公网:

bore local 8000 --to bore.pub

完成后,localhost:8000 即映射到 bore.pub:<PORT>,远程端口号由服务器随机分配。如果需要固定端口,加上 --port 参数指定。--local-host 可暴露局域网内的其他主机,不局限于本机回环地址。--secret 参数用于身份验证,防止他人占用你的隧道。

服务端启动同样简单:

bore server

一行命令在内网机器上搭建 bore 服务。可配置端口范围(--min-port--max-port)、绑定地址(--bind-addr)以及隧道监听地址(--bind-tunnels)。其中 --bind-tunnels 适合控制面走内网、数据面走公网的场景,让控制通道和隧道连接的网卡分开。

作者维护了一个公共服务 bore.pub 供大家免费使用。对数据安全或可用性有更高要求,建议自行部署服务端。

协议设计上,控制端口固定在 7835。客户端先经该端口向服务端发送 “Hello” 消息,请求代理指定的远程端口。服务端确认后开始监听外部 TCP 连接。当外部连接到来时,服务端生成一个 UUID 发回客户端,客户端再用该 UUID 建立一条独立的 TCP 流发送 “Accept” 消息。随后服务端在两连接之间做双向数据转发。外部连接在服务端只保留 10 秒,超时未建立对应隧道则自动丢弃,防止内存泄漏。

安全性方面,私有部署的 bore server 可通过 --secret 参数启用身份验证,客户端在每次 TCP 连接上需要通过 HMAC 挑战码证明持有正确的 secret。注意 secret 仅用于初始握手阶段,后续数据传输默认不加密。secret 也可以通过 BORE_SECRET 环境变量传入,避免在命令行中明文暴露。

bore 使用 MIT 许可证开源。项目体量小、代码清晰,想了解 Rust 网络编程或 TCP 隧道工作机制,这是一个合适的参考。

MIT 许可证开源。项目体量小、代码清晰,想了解 Rust 网络编程或 TCP 隧道工作机制,这是一个合适的参考。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐