#http2 #debugging #grpc #traffic #proxy #connection #capturing

app proxide

Proxide是一个用于捕获HTTP/2和gRPC流量的调试代理

5个版本

0.2.3 2022年9月6日
0.2.0-alpha.12020年6月8日
0.1.2 2020年5月29日
0.1.1 2020年5月28日
0.1.0 2020年5月23日

#1853 in 网络编程

每月 26次下载

MIT/Apache

345KB
6K SLoC

Proxide

HTTP2/gRPC调试代理

crates.io CI

Demo

安装

请参阅版本页面以获取Windows和Linux的二进制版本。

Proxide也可以通过crates.io直接安装

cargo install proxide

入门

除了以下说明之外,Proxide还通过--help命令行参数提供(希望)全面的帮助。

使用Proxide监控客户端流量的方式有很多。主要的选择在于Proxide如何拦截客户端流量以及用户是否想要实时监控流量或记录流量以供以后分析。

以下示例假设用户想要使用Proxide UI实时监控流量。将monitor替换为capture -f output_file允许用户直接将流量捕获到文件以供以后分析。

直接连接到Proxide

运行Proxide最直接的方式是让客户端直接连接到Proxide,并将这些连接重定向到远程服务器。

proxide monitor -l 5555 -t example.com:8080

Proxide将自动将出站authority信息重写为目标服务器的信息,使重定向在HTTP/2协议级别上是透明的。但是,如果客户端在其实际有效负载中包含服务器地址,或者如果服务器在其响应中包含其地址,则这些信息不会被更改,从而使代理的存在对各方可见,并可能导致通信中断。

CONNECT代理

在客户端能够使用真实服务器地址,但仍然通过Proxide路由流量的情况下,可以将Proxide用作CONNECT代理。如果没有指定目标服务器,这将自动发生。

proxide monitor -l 5555

充当CONNECT代理时,客户端需要配置为通过代理路由其流量。具体配置方式取决于客户端。许多客户端支持http_proxy环境变量为此目的。

http_proxy=http://localhost:5555 ./grpc_application

查看捕获的流量

之前捕获的文件(以及导出的会话)可以使用 proxide view 查看。

proxide view capture.bin

解码 gRPC

当使用 Proxide 分析 gRPC 流量时,能够解码消息会很有帮助。Proxide 需要服务和消息定义才能进行解码。这些定义可以通过 --grpc 选项提供给 Proxide。此选项与 monitorview 命令一起使用。

proxide view capture.bin --grpc /project/src/*.proto

解码 TLS

请注意,信任 CA 证书可能会损害系统安全。请仔细考虑这一点的全部影响。

拦截和解析 TLS 流量需要 Proxide 对客户端执行中间人攻击。TLS 设计是为了防止这种攻击,因此用户需要执行一些设置才能允许这样做。

首先,Proxide 需要一个 CA 证书。此证书用于生成发送给客户端的 服务器证书。服务器证书在 Proxide 拦截客户端连接时即时生成,但所有证书都由 CA 证书签名。通过 config ca 命令生成此类 CA 证书是最简单的方法。

proxide config ca --create

此命令创建一个 proxide_ca.crtproxide_ca.key 对。如果这些文件存在,Proxide 将在监控或捕获流量时自动使用它们。

第二个障碍是确保客户端不会拒绝 Proxide 创建的服务器证书。这可以通过让客户端忽略证书问题或指定 Proxide CA 证书为客户端的可信根 CA 证书来完成。

如何执行此操作的具体细节取决于客户端和平台。例如,在 Windows 上,许多客户端使用 Windows 证书存储。Proxide 可以通过 --trust 选项将根 CA 添加到此存储。如果证书已添加到平台证书存储,建议在调试会话结束后从该存储中删除它。这可以通过 --revoke 选项完成。

proxide config ca --trust

(这可以在最初创建证书时与 --create 标志一起使用。)

状态

Proxide 目前处于开发中

基本的解码功能正常,但仍然缺少一些“生产质量”功能。

  • 更好的 TUI 工具。
    • 搜索/突出显示支持。
    • 手动切换到不同的编码器(原始、头部、gRPC)。
  • 支持图形 UI 集成时的流 JSON/Protobuf 等. 输出。
    • 在集成测试中已使用一些 支持 此功能。
  • 支持从带有线程-id 标头的本地请求获取堆栈跟踪。
  • 支持 HTTP/1.x 升级
  • 支持 HTTP/1.x

依赖关系

~24–37MB
~665K SLoC