一个用 Go 编写的轻量级 HTTP/HTTPS 拦截代理和流量分析工具,带有基于 Web 的 UI,可实时检查、过滤、着色和注释捕获的流量。


HTTP Breakout Proxy 既可作为 HTTP 和 HTTPS MITM 代理,也可作为实时可视化工具。
它捕获两个软件组件之间的请求和响应,让开发者能够:
该代理嵌入了一个功能完整的 UI,可通过任何现代 Web 浏览器访问,无需外部工具即可进行实时分析。
captures.json(或指定文件)中。status:4 status:5 → 高亮 HTTP 错误url:/api/ → 高亮 API 请求/\.css$/ → 对 URL 进行正则匹配method:GET、status:404、header:Content-Type=application/json)/login/)curl 命令(格式化为终端使用)python requests 代码片段(干净的 JSON 表示)httpbreakout -l 127.0.0.1:8080
git clone https://github.com/jbsouthe/http-breakout-proxy.git
cd http-breakout-proxy
go build -o http-breakout-proxy
这将生成一个包含已编译代理和嵌入 UI 资源的单一可执行文件。
# 以默认配置运行(代理 + UI)
./http-breakout-proxy
默认情况下,二进制文件绑定到 127.0.0.1:8080 用于代理(以及可选的 UI —— 参见 CLI 标志)。在浏览器中打开 UI 以检查捕获。
# 通过代理发送 HTTPS 请求(代理监听 127.0.0.1:8080)
curl -x http://127.0.0.1:8080 https://example.com
捕获的流量将出现在 Web UI 中。
使用
./http-breakout-proxy -h列出所有可用标志和用法描述。
UI 针对调查工作流进行了优化。
METHOD URL [STATUS],但可以分配自定义名称。curl、复制为 Python requests、下载响应正文、重命名、删除。method:、status:、host:、url:、body:、req.body:、resp.body:、header:、req.header:、resp.header:。/pattern/flags(例如 /bearer\\s+\\S+/i)。header:name=value,其中 name 或 value 可以是正则表达式。示例:
method:POST status:2 host:api.example.com/token\\s*[:=]\\s*\\S+/ireq.header:authorization=/bearer/ibody:/\\"success\\"\\s*:\\s*true/i启用中间人模式时:
-ca(默认 ./ca)目录中。ca.pem 或类似文件)添加到发送请求的客户端(或系统)的信任存储中。在许多平台上,这需要管理员权限。安全注意事项: 仅在受控环境中安装 CA。不要在与敏感无关流量的系统中信任此 CA。
如果启用了持久化(通过 -f 或配置的路径):
captures.json)。捕获项序列化为 JSON,包含以下字段(非详尽):
id — 唯一序列标识符time — 时间戳(ISO 8601)method、urlrequest_headers、response_headersrequest_body、response_body — 必要时截断至 -max-bodyresponse_status、duration_msname — 可选用户标签notes、deleted — 用于 SSE 事件和 UI 状态的控制元数据curl 命令,包括标头和正文(跳过逐跳标头)。url、headers 和可选 data 的小型 requests 代码片段。Content-Type 推断。设计考虑:
Host、Content-Length、Connection)在生成的 replay 命令中被省略。GET /api/captures — 列出捕获(JSON 数组)。DELETE /api/captures — 清空所有捕获。GET /api/captures/{id} — 检索单个捕获。DELETE /api/captures/{id} — 删除特定捕获。PATCH /api/captures/{id} — 更新捕获元数据;body 示例:{ "name": "My label" }。GET /api/pause — 返回 { "paused": true|false }。POST /api/pause — 设置暂停状态;body 示例:{ "paused": true }。GET /events — 用于实时捕获通知和控制事件的服务器推送事件(SSE)流。//go:embed ui/* 和 fs.Sub 来提供静态文件服务。这会产生一个单一的可部署产物。Content-Encoding 并尝试在显示前解压 gzip 和 deflate 正文。原始字节保留以确保代理透明性。io.LimitReader 读取,以检测截断并保护内存使用。推荐的分发模型:
CGO_ENABLED=0、-trimpath、-ldflags "-s -w")。.tar.gz,Windows 使用 .zip),并包含 README.md 和 LICENSE。goreleaser 自动化跨平台构建和发布产物。示例构建命令:
# Linux x86_64
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o dist/http-breakout-proxy-linux-amd64 .
# macOS (arm64)
GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o dist/http-breakout-proxy-darwin-arm64 .
[Unit]
Description=HTTP Breakout Proxy
After=network.target
[Service]
ExecStart=/opt/http-breakout-proxy/http-breakout-proxy -l 0.0.0.0:8080
Restart=on-failure
User=proxy
Group=proxy
[Install]
WantedBy=multi-user.target
在 ~/Library/LaunchAgents 中创建一个 plist 文件,并使用 launchctl 加载。
捕获的正文显示为二进制乱码
正文被压缩(例如 gzip)。确保你运行的是包含自动解压缩功能的构建版本;UI 会在可用时显示解压后的 JSON/文本。
HTTPS 流量不显示 / 连接错误
客户端不信任生成的 CA。将 ca/ca.pem 安装到客户端/系统信任存储中,并标记为可信以进行 TLS 拦截。
清空捕获后 UI 显示过时的选择
升级到在 cleared SSE 事件上清除 selectedId 的客户端,或调用 GET /api/captures 端点刷新状态。
DELETE /api/captures 返回 405
确保服务器处理器接受对 /api/captures 的 DELETE 方法,并且没有因尾部斜杠不匹配而导致问题。
当启用 MITM 时,此工具执行 TLS 拦截。仅在你有权检查流量的受控环境中使用。生成的 CA 具有强大权限:请像对待任何其他根 CA 私钥一样,对其私钥保密。不要将 CA 安装到共享或生产信任存储中。
欢迎贡献。请为错误或功能请求提交 issue。对于代码贡献:
本项目根据 MIT 许可证 分发。详情请参阅 LICENSE。
作者:John Southerland (GitHub: jbsouthe)
项目:http-breakout-proxy — 旨在用于调试、开发以及学习 HTTP 行为。
| 标志 | 默认值 | 描述 |
|---|
-l | 127.0.0.1:8080 | 代理监听的地址,同时也是 UI 应用地址。 |
-mitm | true | 启用 HTTPS 中间人(MITM)拦截模式(生成本地 CA 用于拦截 TLS)。 |
-ca | ./ca | 启用 MITM 且选择持久化时,存储生成的 CA 证书和密钥的目录。 |
-f | ./captures.json | 可选的捕获持久化路径或目录(例如 ./captures.json)。 |
-max-body | 1048576 | 每个正文存储/显示的最大字节数;更大的正文将被截断并附加标记。 |
-buffer-size | 1000 | 内存中捕获的循环缓冲区容量。 |
-v | false | 启用详细日志以进行调试。 |