极简的基于终端的 HTTP/HTTPS 拦截代理。
https://github.com/user-attachments/assets/94f9c9ae-5842-4b19-9f5b-84dedb9430e6
Roxy 是一个轻量级的 HTTP 和 HTTPS 拦截代理,带有用 Rust 编写的终端用户界面(TUI)。 它能在请求到达服务器之前,从你的终端内实时捕获、检查并修改请求。 可以把它看作是一个极简的、终端原生的 Burp Suite 替代品,用于日常流量分析。
CONNECT 提供完整的 MITM 支持,证书自动生成。$EDITOR 即时修改被拦截的请求。--host 和 --port 设置监听地址,并决定哪些主机被拦截或直通。从源码构建需要:
| 要求 | 说明 |
|---|---|
| Rust 1.85 或更新版本 | 使用 rustc --version 检查。 |
| C 编译器 | gcc 或 clang。 |
$EDITOR | 仅请求编辑功能需要。 |
git clone https://github.com/vid4l-07/Roxy.git
cd Roxy
cargo build --release
二进制文件将位于 target/release/roxy。
cargo install --git https://github.com/vid4l-07/Roxy.git
二进制文件将位于 ~/.cargo/bin/roxy。
[!note] 如果启用了 HTTPS 直通,则不需要 HTTPS 支持。
| 内容 | 位置 | 说明 |
|---|---|---|
| CA 证书和密钥 | ~/.config/roxy/ca.crt、~/.config/roxy/ca.key | 首次拦截 HTTPS 请求时惰性创建。 |
| 每个主机的叶子证书 | /tmp/roxy_certs/<host>.crt、/tmp/roxy_certs/<host>.key | 按需签发并缓存。每当生成新 CA 时缓存会被清除。 |
Roxy 生成一个名为 Roxy CA 的自签名 CA。
[!Warning] 在客户端信任该 CA 之前,每个 HTTPS 请求都将验证失败。
在你的浏览器或系统中安装 ~/.config/roxyca.crt。
你也可以从内置网页 http://roxy(或 http://<host>:<port>)下载它。
Firefox / Chrome:
Settings → Privacy & Security → Certificates → View Certificates。~/.config/roxy/ca.crt。系统 CA 存储 适用于 curl 等工具。
# Debian / Ubuntu
sudo cp ~/.config/roxy/ca.crt /usr/local/share/ca-certificates/roxy.crt
sudo update-ca-certificates
# Fedora / RHEL / Arch
sudo cp ~/.config/roxy/ca.crt /etc/pki/ca-trust/source/anchors/roxy.crt
sudo update-ca-trust extract
要再次移除它,请删除该文件并重新运行相应的命令。
rm -rf ~/.config/roxy
Roxy 将在下一次 HTTPS 请求时生成新的 CA,并移除它缓存的所有叶子证书。 你将需要再次信任新的 CA。记得从浏览器和系统存储中移除旧的 CA。
| 选项 | 描述 |
|---|---|
-h, --host <HOST> | 监听主机。默认为 127.0.0.1。 |
-p, --port <PORT> | 监听端口。默认为 8080。 |
--passthrough | 对所有主机以不解密的方式隧道传输 HTTPS。 |
--passthrough-host <HOSTS> | 与 --passthrough 相同,但仅针对列出的主机。 |
--intercept-https <HOSTS> | 即使在直通模式下也拦截这些主机。 |
--help | 打印帮助信息。 |
# Pass every host through untouched except the one you want to inspect
roxy --passthrough --intercept-https <HOSTS>
| 按键 | 操作 |
|---|---|
q | 退出 |
Tab | 在 Proxy 和 Repeater 屏幕之间切换 |
? | 打开当前屏幕的帮助弹窗 |
| 按键 | 操作 |
|---|---|
i | 切换拦截开/关 |
Enter | 转发被拦截的请求 |
e | 在外部编辑器中编辑请求 |
u | 撤销编辑 |
U | 重做编辑 |
r | 将请求发送到 Repeater |
↑/k | 向上滚动 |
↓/j | 向下滚动 |
| 按键 | 操作 |
|---|---|
Enter | 发送当前请求 |
e | 在外部编辑器中编辑请求 |
u | 撤销编辑 |
U | 重做编辑 |
r | 重命名当前标签页 |
n | 下一个 repeater 标签页 |
p | 上一个 repeater 标签页 |
x | 关闭当前标签页 |
z | 在聚焦面板上切换缩放 |
↑/k | 向上滚动 |
↓/j | 向下滚动 |
←/h / →/l | 在 Request 和 Response 面板之间切换焦点 |
H | 减小 Request 面板宽度 |
L | 增大 Request 面板宽度 |
当你按下 e 时,原始请求会被写入一个临时文件,并使用由 $EDITOR 定义的二进制文件打开。编辑它,保存,然后退出。
修改后的请求会替换原始请求,并且 Content-Length 会自动重新计算。
127.0.0.1:8080 上接受连接,可通过 --host 和 --port 配置,并在各自的异步任务中处理每个连接。CONNECT 请求 会以 200 Connection Established 应答,TLS 在本地使用为所请求主机签发的证书终止,解密后的请求作为常规 HTTP 请求读取。与直通选项匹配的主机会被转发到真实服务器,而不终止 TLS。Host 头解析目的地。tokio::mpsc 通道推送到 TUI,连接在 oneshot 通道上等待,直到用户转发它。请求可以按原样转发、先编辑,或发送到 Repeater。webpki-roots 验证的 TLS),写入请求,并将原始响应流式传回客户端。Enter 时重发存储的请求,根据捕获请求时使用的协议选择传输方式,并将响应与请求并排显示。TUI 和代理从不直接共享状态。它们仅通过事件通道通信,因此当请求被拦截时界面仍保持响应。
欢迎任何贡献。如果你发现 bug 或想帮助开发新功能,你可以:
Roxy 在 MIT License 下发布。© 2026 Hugo Vidal Martinez。