FunProxy - 使用 Rust 构建跨平台全链路测试抓包署理工具 ...

打印 上一主题 下一主题

主题 2146|帖子 2146|积分 6438

作者:vivo 互联网大前端团队- Song Jiachao
 
在软件开发过程中,软件测试对于保障软件质量和用户满意度起着关键作用。为最大水平上提拔软件品质,我们积极开展全链路测试实践,打造了用Rust语言开发的自研一站式抓包署理工具FunProxy,基于其跨平台、高性能、易于扩展、安全性高等特性,让全链路抓包和环境署理如丝绸般丝滑。
 
一、背景介绍

1.1 什么是全链路测试

 
全链路测试就是“验证整个软件系统在不同组件、服务和模块之间协同工作时的性能、功能和稳固性”。在这里我们举一个非常简单的例子。
 
比如用户在某商城购买商品。
 

 
我们是先打开商城,接着浏览商品,加入购物车,然后提交订单,支付,等待收货,最后完成。在整个购买流程中,我们其实并不是一个功能模块就完玉成部步骤,而是调用了许多系统模块。
 
比如:
全链路测试就是验证一个流程中所有涉及的系统,协同工作时的性能、功能和稳固性。
 
1.2 全链路测试的现状和痛点

 
通过上面的购物流程我们可以梳理出全链路测试的现状和痛点:
 
1. 系统数目众多
 
全链路测试涉及到多个系统、服务和模块的协同工作,系统的多样性增加了测试的复杂性。
 
2. 各系统环境设置不一致
 
各个系统的环境设置可能完全不一样,导致各个系统对接相当麻烦。
 

 
就拿我们刚刚所举出用户购买商品的例子。涉及到商品系统、购物车系统、订单系统、支付系统、和物流系统。因为历史或者技能方案的原因,他们选择的环境管理方式各不雷同。

  • 其中商品和购物车系统可能是由团队 A 负责,他们团队通过 hosts 方式来管理环境。
  • 订单和支付系统,由团队B负责,通过自界说请求头的方式,来进行环境设置。
  • 物流系统由团队 C 负责,通过域名的方式来设置环境。
 
这只是精简版的购物流程,其真真相况可能远比我们的例子更加复杂。这时候如果想要完整的测试一条购物全流程,环境设置照旧相当复杂的。
 
当前测试流程
 
为了能够测试所有的流程:

  • 要安装一个抓包软件
  • 安装抓包软件的证书
  • 设置各种抓包的规则
  • 设置抓包的系统署理
  • 设置hosts
  • 设置终端(安装证书、设置手机署理)
 
这一套流程下来其实需要设置的非常复杂,并且不能共享,每个人在自己的电脑和手机上都需要重新设置一遍。
 

 
二、全链路测试的愿景及目标

 
因为上述背景,我们对vivo的全链路测试提出以下的愿景和目标。
我们的愿景是:让 vivo 的全链路抓包和环境署理,如丝绸般丝滑。
我们的目标是:构建一款跨平台、高性能、易于扩展、安全性高的全链路测试抓包署理工具。
 

 
2.1 技能目标详解

 
跨平台
能够支持几乎所有主流平台,包括但不限于Windows/macOS/Linux/Android/iOS,为什么要兼容这么多平台,因为我们的业务在这些平台上面几乎都有涉及。
 
高性能
面对超高并发量的接口请求,能够轻松应对,确保系统在高负载下的稳固运行。
 
易拓展
提供机动的架构和工具,支持官方和用户根据个人需要对工具进行拓展。
 
安全性高
通过全面的安全测试,确保产品在各个层级的安全性,包括数据传输、存储和访问控制,防止潜在的安全威胁和数据泄漏。
 

 
三、技能选型

3.1 为何选择 Rust

 
我们首选了 Rust 语言作为我们的基础语言,紧张原因如下:

  • Rust 是系统级别的通用编程语言,上至web 下至OS 统统能轻松驾驭,并且能够保证内存安全和并发安全;
  • Rust有丰富的工具链,比如rustup,cargo等等,开发体验非常棒;
  • Rust有非常巨大和生动的社区,社区贡献了非常多好用的各种库。
 
并且最近使用 Rust 构建应用的公司越来越多,比如我们公司的 Blue OS ,就是行业首个系统框架由 Rust 语言编写的操纵系统,这也是我们坚定不移的选择Rust的紧张原因之一。
 

 
3.2 为何选择 Tauri

 
选择了 Rust ,我们顺其自然的选择了 Rust 多端开发框架 Tauri。Tauri 是一个基于 Rust 构建的跨平台应用框架。
 
紧张有以下几个优势:

  • 独立的前端工程:Tauri 支持任何前端框架,所以你不需要改变你的技能栈;
  • 最小化体积:使用操纵系统本地的网页渲染器,Tauri 应用的体积可以达到最小 600KB;
  • 跨平台:同一套代码可以编译运行到几乎所有的OS系统中;
  • 高安全性:Tauri 团队的首要目标,推动 Tauri 的首要任务和最大的创新。
  • 历程间通讯:用 JavaScript 编写前端,用 Rust 编写应用程序逻辑,并使用 Swift 和 Kotlin 在系统中深入集成;
  • 由 Rust 驱动:以性能和安全性为中心,Rust 是下一代应用程序的语言。
 
使用Tauri框架,让我们不仅能获得Rust的安全性高效性,还能享受Web开发的认识感和机动性。
 

 
四、方案介绍

 
通过刚才的技能方案,我们打造出了FunProxy 一站式署理工具。FunProxy 是一款用 Rust 开发的纯自研的一站式抓包 & 署理工具,全平台支持,天生更安全,天生更流畅!!!
主打一个方便、快捷和无界限。
 

 
4.1 优势及亮点

 
FunProxy 紧张的优势及亮点如下:

  • 全功能抓包本领
  • 全平台独立应用支持
  • 云端 hosts
  • 云端 Rules
  • 协同抓包
  • 极致性能
 

 
4.1.1 全功能抓包本领

 
协议
支持HTTP/1.x和HTTP/2协议、WebSocket、TLS 1.1-1.3的加密协议
 
工具
支持重写、断点、数据对比、模仿超时、全局搜索、筛选、对比
 
文件
支持导入导出会话、支持Fun格式的文件,HAR格式文件、Charles格式文件
 

 
4.1.2 全平台独立应用支持

 
我们支持几乎所有的主流操纵系统,例如Windows/macOS/Linux/Android/iOS/另有网页版本,并且多操纵系统可以相互共同,FunProxy 让署理打破界限。
 

 
4.1.3 云端 hosts

 
hosts维护是一个大的痛点,因为各个系统的hosts会经常变化,导致有些同学的hosts因为没有及时同步变动,而出现问题。所以我们提供了云端hosts功能。云端hosts 可以让项目中的hosts由一人设置,人人共享。保证hosts能够及时同步到FunProxy的各个用户。
 
云端hosts支持静态长途两种hosts。
 
静态 hosts:系统中的hosts文件格式一样,逐一对应。
 
长途hosts:可以提供一个链接,我们会长途去拉取这个hosts,在FunProxy运行的时候再去加载这个Hosts。
 
顺便说一句:FunProxy 所有的hosts都是虚拟hosts,并不会修改系统hosts,保证系统hosts的干净
 

 
4.1.4 云端规则

 
同云端 hosts 一样,规则也可以设置到云端让所有人共享。
 

 
所有的规则都有一些公共的设置。比如规则名称匹配模式匹配链接
我们的匹配模式支持通配符正则表达式。几乎可以适配所有的链接。
同时我们也提供了检测工具,帮助大家检测链接是否被匹配上。
 

 
目前规则紧张有三个分类:分别是长途映射,本地映射,息争密。
 
长途映射在长途映射这个功能上,我们可以设置长途主机的相关信息,如许就可以将需要转发的链接转发到对应的服务器上面。
本地映射在本地映射模式中,支持直接修改本地映射的内容,同时我们提供了强大的代码编辑器功能,帮助大家在编写本地映射内容的时候, 能够有比较好的代码提示。
解密功能这个功能对于许多加密传输网站测试尤为紧张。因为每个网站的加解密方式可能不一样,所有我们提供了运行时函数。用户可以自己编写JavaScript或者Python运行函数,动态的根据传入的参数进行对应的加解密计算。
动态函数解析让 FunProxy 几乎能解所有的密文,如许我们在检察接口的时候就非常的方便,不用再去解密工具中检察。
同时也请大家放心,我们的解密工具有着非常高的安全性,保证只有项目管理员授权的人才能检察,大家也不用担心自己的解密方法被别人盗取。
 

 
4.1.5 协同抓包

 
通过 FunProxy 左下角提供的分享功能,可以让当前抓包的所有数据及时同步给所有拥有这个链接的人。所有的操纵都能同步到所有端,无需下载,让大家更加方便的进行数据包的共享。
 

 
4.1.6 极致性能

 
我们对比了市场上主流的抓包软件,无论从安装包大小、启动时间、安装空间、使用内存来说,FunProxy 都有非常大的优势。
 

 
4.2 技能架构

 
FunProxy是基于Tauri框架进行跨平台的开发,我们封装了fun-core 和fun-mitm两个焦点库。
fun-core紧张是所有端的公共本领,比如设置文件,存储等。
fun-mitm紧张负责所有端的man in the middle 也就是中间人的功能,提供抓包的焦点本领。
tauri-plugin-funproxy因为有些端的功能可能需要调用系统特定的本领,在移动端我们封装了tauri-plugin-funproxy来调用移动端的特定本领,比如VPN。
其他在各个桌面端我们封装了各个系统的焦点crates来调用桌面端的特定本领。其他本领则是通过Rust直接调用。
为了提供云端本领,我们使用Go语言搭建了一个服务。包括:项目管理、用户管理、升级管理、健康检查、云端Host、云端规则、云端工具等等功能。服务只是一个增值功能,所有的FunProxy都可以离线运行。
同时为了保证各端APP焦点本领的正常,使用了playwright搭建了主动化测试本领。重点测试的功能有:登录、署理、抓包、升级、权限、兼容性、性能等。
最后通过vitepress搭建FunProxy的文档功能。方便用户使用和检察。包括:介绍、使用说明、常见问题、更新日记、API、贡献指南、问题反馈等。
 

 
五、焦点实现

5.1 MITM

 
这是FunProxy的MITM(Man-in-the-Middle,中间人)方案。所谓的中间人,就是在服务端和客户端之间加入一个节点,这个节点负责吸收客户端发送的内容,通过自己的规则然后再转发到服务端。我们这里用HTTP和HTTPS举例:
 

 
HTTP中间人方案:
客户端通过发送HTTP内容到FunProxy,FunProxy拿到HTTP内容后,在转发到服务器中。服务器处置惩罚完成后再将信息发送给FunProxy,FunProxy在转发给客户端。这就完成了一个请求的中间人吸收和转发方案。
 
由于HTTP都是明文传输,所以比较简单。HTTPS就比较复杂了,涉及到SSL证书的认证,具体的大家可以看图上的流程。
 
了解完了中间人的过程。下面我们根据刚才分析的过程,可以计划出Fun-MITM的模块需要包罗哪些模块。
 
CA模块:负责根证书的生成和加载,以及各个网站证书的认证
Client:这个Client就是模仿真实用户发送请求的谁人客户端
Server:这个Server就是拦截用户请求的谁人服务端
http_handler:更改请求和响应的内容
socket_handker:处置惩罚socket请求
 

 
  1. let mitm = Proxy::builder()
  2.     .with_addr(addr)
  3.     .with_client(client)
  4.     .with_ca(ca)
  5.     .with_http_handler(custom_handler.clone())
  6.     .with_websocket_handler(custom_handler.clone())
  7.     .with_graceful_shutdown(async {
  8.         close_rx.await.unwrap_or_default();
  9.     })
  10.     .build();
复制代码
 
[code]pub struct WantsHandlers {  al: AddrOrListener,  client: Client,  ca: CA,  http_handler: H,  websocket_handler: W,  websocket_connector: Option,  server: Option,  graceful_shutdown: F,}impl ProxyBuilder {  /// Set the HTTP handler.  pub fn with_http_handler(      self,      http_handler: H2,  ) -> ProxyBuilder {  }  /// Set the WebSocket handler.  pub fn with_websocket_handler(      self,      websocket_handler: W2,  ) -> ProxyBuilder {  }  /// Set the connector to use when connecting to WebSocket servers.  pub fn with_websocket_connector(self, connector: Connector) -> Self {      }  /// Set a custom server builder to use for the proxy server.  pub fn with_server(self, server: Builder) -> Self {  }  /// Set a future that when ready will gracefully shutdown the proxy server.  pub fn with_graceful_shutdown

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表