V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
rapiz
V2EX  ›  分享创造

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

  rapiz ·
rapiz1 · 2022-01-04 18:53:16 +08:00 · 23037 次点击
这是一个创建于 1061 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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

  • TCP/UDP 最大吞吐量比 frp 高几倍
  • 内存占用从 60~70MiB 减少到 10MiB 以下( Rust vs Go ,这种结果并不意外)。
  • 二进制文件精简,且支持编译时开关特性裁剪,最小二进制在 x86_64 上大小只有 500KiB 左右
  • 连接延迟和 frp 基本相同,但能承载更高并发

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

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


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

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 吞吐量,同时检测内存占用

http_throughput tcp_bitrate udp_bitrate mem

117 条回复    2023-10-10 08:10:54 +08:00
1  2  
levinit
    101
levinit  
   2022-01-14 08:50:36 +08:00 via iPhone
有类似 frp 的 stcp 模式吗? 不用暴露端口在中转服务器上。
LeeReamond
    102
LeeReamond  
   2022-01-14 13:36:15 +08:00
有关安全性和稳定性有相关测试吗
rapiz
    103
rapiz  
OP
   2022-01-14 15:49:46 +08:00
@levinit 这个实际上是 VPN 需求,建议用 wireguard
rapiz
    104
rapiz  
OP
   2022-01-14 15:51:34 +08:00
@LeeReamond 支持开启 TLS/noise 加密。但被暴露的服务总需要自身足够安全。关于稳定性,目前有高并发测试,表现优秀。长期运行的稳定性,主要是弱网环境下的测试和稳定性,还在补齐和加强。
junyee
    105
junyee  
   2022-01-14 19:49:46 +08:00
frp 是好东西。但是体积确实有些大。

另外把 token 和服务器信息等 以明文暴露在客户端让我很不放心。。
虽然可以服务器挂插件.


对了,p2p 很重要。
rapiz
    106
rapiz  
OP
   2022-01-14 20:33:33 +08:00
@junyee

另外把 token 和服务器信息等 以明文暴露在客户端让我很不放心。。
虽然可以服务器挂插件.

这个你应该说的是 frp 吧? rathole 在设计时就考虑要配置分离了
LeeReamond
    107
LeeReamond  
   2022-01-15 04:53:49 +08:00
@rapiz 很棒,有兴趣在生产服务上测试! frp 实际应用中的一种主流场景是 stcp 持有 token 才能正常访问,不知道有没有实现类似功能。
40EaE5uJO3Xt1VVa
    108
40EaE5uJO3Xt1VVa  
   2022-01-16 16:32:28 +08:00
我们几乎重写了 frp
Decent
    109
Decent  
   2022-05-01 23:07:56 +08:00
遇到一个比较奇怪的现象:
相同环境下,用 frp + TLS + v2 开网页响应速度很快,但是峰值速率最多 15 Mbps 。
用 rathole + TLS + v2 网页响应会稍微慢点,但是峰值能去到 100 Mbps 。
v2defy
    110
v2defy  
   2022-11-21 14:50:44 +08:00
大佬,rathole 的 http api 还在做吗
rapiz
    111
rapiz  
OP
   2022-11-24 14:26:31 +08:00
@v2defy 前大半年在实习,歇了一阵子,会做的!
rapiz
    112
rapiz  
OP
   2022-11-24 14:27:33 +08:00
@Decent 可以考虑开一下配置文件里的 TCP nodelay 。另外,看起来使用的异步框架 tokio 比 go corountine 的调度 delay 会更高一些
TweakiOS
    113
TweakiOS  
   2022-12-04 07:56:39 +08:00 via iPhone
这个名字其实挺好的,就是老鼠洞嘛!
另外外行人问下,client 和 server 之间隧道打通之后是否可以双向跑服务,现在看起来主要是外网访问内网,理论上是否内网也可以把 server 当作代理或网关呢?还是一定得用别的工具来实现从内到外的访问?谢谢!
promiser3d
    114
promiser3d  
   2023-06-20 10:34:46 +08:00
确实是个好东西,不知道后续还有进一步的开发计划不
ccpbisi
    115
ccpbisi  
   2023-07-12 17:10:55 +08:00
老哥我有点疑问,你有没有研究过商业内网穿透,感觉那些内网穿透有种更加稳定的感觉,之前用神卓,感觉很稳定比 frp 稳定很多
Ju33Huang22
    116
Ju33Huang22  
   2023-08-14 14:00:19 +08:00
试了一下,rathole 确实要比 frp 的性能更高,速度提升了不少 ^_^
ryc111
    117
ryc111  
   2023-10-10 08:10:54 +08:00
好久以前看到的帖子,今天有个需求就配置了一下

- 和 frp 的 client side config 不一样,需要 c-s 同时配置,爬了下楼,看到了 lz 的想法觉得这样也不错。

- 测试了一下极限性能(我网络速度下的性能) frp 大概跑 200M, rathole 能到 600M 多,极限带宽的确增加不少,虽然我主要用来连 vscode ssh 到远程服务器两者差别不大。

- 都是 docker 部署,和 frp 差不多。加几行 service 写个 toml 就成了,非常好配置。

赞。已 star !
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2628 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 21ms · UTC 07:06 · PVG 15:06 · LAX 23:06 · JFK 02:06
Developed with CodeLauncher
♥ Do have faith in what you're doing.