我用 Rust 重写(并重新设计)了 frp,性能和资源占用有很大改善

2022-01-04 18:53:16 +08:00
 rapiz

rathole - 安全、稳定、高性能的内网穿透工具,用 Rust 语言编写。


先博一下眼球,让各位有兴趣继续看下去:

如果你对性能和内存的测试数据感兴趣,可以直接拉到帖子下面的图表感受一下

你可以先看看 README ,其中介绍了特性、配置和用法


下面写写我为什么要做这个工具,和我开发的时候在想什么。

frp 是优秀的基于内网穿透反向代理工具,方便易用,集成了很多功能。

但我对一个内网穿透工具的期望不太一样,我相信一个工具应该专注做一件事,通过简单优雅的设计接口来提供扩展能力。

我仔细思考了如何设计这样一个工具,它应该:

相比于 frp ,除了数据上的优势,rathole 还有更多的可能性:

未来

rathole 已经持续开发了一段时间,必要的特性已经趋于完善和稳定。我觉得是时候发布出来,让大家体验使用和反馈。

目前已经决定的开发计划有 HTTP API (或其他形式的 API )。API 实现后,能够支持 Dashboard 和复杂动态管理需求的开发。

最后,如果你还没有查看 项目 README ,这里是一个方便的链接

性能测试

测试的具体数字随机器变化,测试方法见此,主要用 iperf3 测试 TCP/UDP 吞吐量, vegeta + nginx 测试 HTTP 吞吐量,同时检测内存占用

23176 次点击
所在节点    分享创造
117 条回复
manfred4527
2022-01-04 20:14:11 +08:00
膜拜大佬
anxn
2022-01-04 20:45:59 +08:00
名字可以再简化一点 这么长不太好记
shyangs
2022-01-04 20:47:52 +08:00
@anxn
Rat_Hole
鼠洞
shoaly
2022-01-04 20:58:14 +08:00
@rapiz 这么神奇么....竟然不是直接的 []byte.....
Alexonx
2022-01-04 21:08:22 +08:00
有无可能在客户端增加配置后能自动同步到服务器端?假设 Token 为默认 Token 的情况下.(或者说这违背了`服务端 /客户端不需要有额外的信任关系`的原则?
rapiz
2022-01-04 21:34:09 +08:00
@Alexonx 目前对于这种用例,我推荐用 rsync 脚本或者 lsyncd 同步配置文件。服务端和客户端的配置可以写到一个文件里。安全地内置这个 Feature 是比较难的。如果简单的让服务器信任发来的配置,选择的某种验证一旦被攻破,风险会比较大。举个例子,攻击者可以直接开服务器的 80 端口,然后通过 let's encrypt 的验证签一个对应域名的 HTTPS 证书出来。所以像 rsync 和 lsyncd 这种直接走 ssh ,安全性和 ssh 等同,是最优雅的方式。后面要不要做,怎么做我还要再想想。
zagfai
2022-01-04 22:46:39 +08:00
简单看了下,所以这速度也是受到了中间服务器的限制而不是直接的 P2P ?那这个不是跟直接 ssh 的反向隧道一个意义?
irytu
2022-01-04 23:35:26 +08:00
在 tg 群里看过大佬推过 赞👍
kappa
2022-01-05 00:02:16 +08:00
@Reficul
> Go 的 JSON 库默认会把[]byte 转换到 Base64 后放进 JSON

哪看的?
Goooler
2022-01-05 00:14:38 +08:00
你这个头像很 square 哦
ufan0
2022-01-05 00:22:38 +08:00
单从命名来说,要火的节奏。
littlewing
2022-01-05 00:52:42 +08:00
性能提升应该不是语言本身带来的吧,而是你优化的结果,或者说,go 版本经过优化,同样也可以达到这个吞吐量
区别就在于内存占用了
Losgif
2022-01-05 08:46:18 +08:00
@laincat 实际上可以有了,不过 clash 得自己封装一层。
miniliuke
2022-01-05 08:56:45 +08:00
支持一下,但是你是怎么把二进制文件精简到 500K 的,有啥文档不......学习一下
superrichman
2022-01-05 09:15:44 +08:00
没有配置子域名访问的模式吗?
rapiz
2022-01-05 09:17:28 +08:00
@miniliuke 500K 不算一个很惊人的水平,稍微注意一些就能做到。1. 这里有 Rust 程序二进制大小优化的一些技巧。https://github.com/johnthagen/min-sized-rust 2. 开发时谨慎地引入和选择依赖,观察二进制大小的变化。保持核心功能没有大的依赖,非核心功能(不是人人都会用到的)的依赖如果让程序膨胀很多,就提供编译时的控制开关让用户自己选择。Rust Cargo Feature 可以方便地做到这一点 3. 如何编译出这个项目的最小二进制可以看 docs/ 下的编译说明
rapiz
2022-01-05 09:19:46 +08:00
@superrichman 这种场景,我建议使用 nginx 并将转发工具设置为 nginx 的 upstream ,这样无论是性能还是灵活性都比内置这个功能要好。内置 = 重新发明 nginx 。我不觉得我能超越 nginx 😂
CSGO
2022-01-05 09:21:55 +08:00
不是开发,一直在用 frp ,随看不懂,但是 666
codingbody
2022-01-05 10:20:34 +08:00
请教一下 OP ,这个 benchmark 的图是用什么工具画的呀。
rapiz
2022-01-05 10:54:02 +08:00
@codingbody docs.google.com 内存图是 shell 脚本+gnuplot

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/826182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX