rathole - 安全、稳定、高性能的内网穿透工具,用 Rust 语言编写。
先博一下眼球,让各位有兴趣继续看下去:
- TCP/UDP 最大吞吐量比 frp 高几倍
- 内存占用从 60~70MiB 减少到 10MiB 以下( Rust vs Go ,这种结果并不意外)。
- 二进制文件精简,且支持编译时开关特性裁剪,最小二进制在 x86_64 上大小只有 500KiB 左右。
- 连接延迟和 frp 基本相同,但能承载更高并发。
如果你对性能和内存的测试数据感兴趣,可以直接拉到帖子下面的图表感受一下。
下面写写我为什么要做这个工具,和我开发的时候在想什么。
frp 是优秀的基于内网穿透反向代理工具,方便易用,集成了很多功能。
但我对一个内网穿透工具的期望不太一样,我相信一个工具应该专注做一件事,通过简单优雅的设计接口来提供扩展能力。
我仔细思考了如何设计这样一个工具,它应该:
-
有安全和优雅的服务模型 服务端和客户端各自只负责自己的配置,并对外暴露配置 API (目前支持服务配置热重载,HTTP API 正在开发)。每个转发服务强制且单独鉴权。这样可以在易用性、安全性、灵活性间达到平衡:
- 通过支持外置配置管理程序(比如使用 rsync 安全地同步配置),使单租户时像 frp 一样易用。
- 服务配置分离。服务端 /客户端不需要有额外的信任关系
- 每个服务使用单独的 Token 鉴权,同时也提供了所有服务的默认 Token 设置项。这样可以支持租户身份的任意划分,同时又支持单个用户时快速编写配置的需要。
-
保持简单和专注 rathole 专注于内网穿透本身,而不是提供路由、复杂的鉴权和多租户管控、和各种运输层和应用层协议交互。这些需求应该通过和其他工具的组合实现,而不是集成到 rathole 中。这可以带来性能上的好处和更广泛的适用性,比如部署到嵌入式设备(路由器、工控机)中。
- 比如基于域名的路由可以和 nginx 组合使用来优雅的实现。
- 复杂的鉴权和多租户管控可以通过 API 来让外部程序实现一个 Dashboard 。实际上实现一个安全、高性能、且满足所有用户管理需求的单一内置 Dashboard 是不可能的事情。
- 如果需要特殊的运输层和应用层协议承载流量,则应该通过对应的隧道工具实现。
相比于 frp ,除了数据上的优势,rathole 还有更多的可能性:
- 低资源占用和特性可裁剪使其可能运行在中低端路由器、物联网设备上
- 高性能使其更容易支撑高并发或者大流量的场景,更稳定
未来
rathole 已经持续开发了一段时间,必要的特性已经趋于完善和稳定。我觉得是时候发布出来,让大家体验使用和反馈。
目前已经决定的开发计划有 HTTP API (或其他形式的 API )。API 实现后,能够支持 Dashboard 和复杂动态管理需求的开发。
最后,如果你还没有查看 项目 README ,这里是一个方便的链接。
性能测试
测试的具体数字随机器变化,测试方法见此,主要用 iperf3 测试 TCP/UDP 吞吐量, vegeta + nginx 测试 HTTP 吞吐量,同时检测内存占用

