文章目录
-
- 前言
- 一、理解核心原理
-
- [1.1 什么是 mitmproxy?](#1.1 什么是 mitmproxy?)
- [1.2 工作原理](#1.2 工作原理)
- 二、环境准备
-
- [2.1 安装 mitmproxy](#2.1 安装 mitmproxy)
- 三、启动代理服务
-
- [3.1 命令行方式(快速开始)](#3.1 命令行方式(快速开始))
- [3.2 参数详解](#3.2 参数详解)
- [3.3 配置文件方式(推荐✨)](#3.3 配置文件方式(推荐✨))
- 四、捕获流量实战
-
- [4.1 启动 OpenCode](#4.1 启动 OpenCode)
- [4.2 发送测试请求](#4.2 发送测试请求)
- [4.3 查看捕获结果](#4.3 查看捕获结果)
- 五、问题诊断与解决
-
- [5.1 观察错误现象](#5.1 观察错误现象)
- [5.2 系统性排查思路](#5.2 系统性排查思路)
-
- [🔍 原因一:本地网络配置问题](#🔍 原因一:本地网络配置问题)
- [🔍 原因二:目标服务器访问不稳定](#🔍 原因二:目标服务器访问不稳定)
- [🔍 原因三:Cloudflare 反爬机制](#🔍 原因三:Cloudflare 反爬机制)
- [🔍 原因四:TLS 握手兼容性问题](#🔍 原因四:TLS 握手兼容性问题)
前言
本文详细介绍如何使用 mitmproxy 的本地捕获代理模式,获取 OpenCode 发起的 AI API 请求的详细信息。我们将从原理讲解开始,逐步完成安装、配置、调试和问题排查的全过程。
一、理解核心原理
1.1 什么是 mitmproxy?
mitmproxy(Man-in-the-Middle Proxy)是一个强大的中间人代理工具,能够:
- 🔍 拦截 HTTP/HTTPS 流量
- 📝 查看 请求和响应的详细内容
- ✏️ 修改 传输中的数据
1.2 工作原理
OpenCode → mitmproxy(本地代理) → 目标服务器
↑ ↓
捕获所有请求和响应数据
通过配置应用使用 mitmproxy 作为代理,所有网络请求都会经过该工具,从而实现对流量的完整监控和分析。
💡 提示 :更多详细信息请参考 mitmproxy 官方文档
二、环境准备
2.1 安装 mitmproxy
使用 pip 快速安装:
bash
pip install mitmproxy
安装完成后,你将获得三个命令行工具:
mitmproxy- 终端界面版本mitmweb- Web 界面版本(推荐)mitmdump- 命令行转储版本
三、启动代理服务
3.1 命令行方式(快速开始)
执行以下命令启动本地代理:
bash
mitmweb --mode local:opencode --web-port 8081 --showhost \
--ssl-insecure \
--set upstream_cert=false \
--set connection_strategy=lazy \
--set tls_version_client_min=UNBOUNDED \
--set tls_version_server_min=UNBOUNDED \
--verbose
3.2 参数详解
| 参数 | 作用 | 说明 |
|---|---|---|
--mode local:opencode |
本地代理模式 | 绑定到 opencode 进程 |
--web-port 8081 |
Web 界面端口 | 访问 http://127.0.0.1:8081 查看流量 |
--showhost |
显示主机头 | 在 URL 列中显示域名,便于识别 |
--ssl-insecure |
忽略证书错误 | 跳过 SSL 证书验证(简写 -k) |
--set upstream_cert=false |
不验证上游证书 | 避免证书链验证失败 |
--set connection_strategy=lazy |
延迟连接策略 | 推迟建立上游连接,支持离线重放 |
--set tls_version_*_min=UNBOUNDED |
放宽 TLS 限制 | 兼容旧版本 TLS 协议 |
--verbose |
详细日志模式 | 输出完整的调试信息 |
📖 完整参数说明参见 官方配置文档
3.3 配置文件方式(推荐✨)
为便于长期维护,创建配置文件 ~/.mitmproxy/config.yaml:
yaml
# ========== 代理模式配置 ==========
# 要生成的代理服务器类型。可以多次传递。Mitmproxy 支持 "regular"(HTTP)、"local"、"transparent"、"socks5"、"reverse:SPEC"、"upstream:SPEC "和 "wireguard[:PATH]"代理服务器。默认值:['regular']
mode:
- local:opencode
# 绑定代理服务器的端口(可根据具体模式重设,参见 `mode`)。默认情况下,端口与模式有关。默认的常规 HTTP 代理服务器端口为 8080。默认值:None
listen_port: 8080
# 网络用户界面端口。默认值:8081
web_port: 8081
# ========== 安全与连接配置 ==========
# 使用主机头来构建要显示的 URL。
# 此选项默认已禁用,因为恶意应用程序可能会发送误导性的主机头来规避您的分析。如果不担心此问题,请启用此选项以获得更好的流量显示。
showhost: true
# 不验证上游服务器的 SSL/TLS 证书。如果启用此选项,将跳过证书验证,而 mitmproxy 本身将容易受到 TLS 拦截的攻击
ssl_insecure: true
# 上游证书。连接到上游服务器以查询证书详细信息。默认值:True
upstream_cert: false
# 连接策略。设置为懒惰时,mitmproxy 会尽量推迟建立上游连接。这样就可以在离线时使用服务器重放。选项:eager, lazy。默认值:eager
connection_strategy: lazy
# 忽略主机列表(空表示全部捕获),转发所有流量而不进行处理。
ignore_hosts: []
# ========== TLS 版本配置 ==========
# # 设置客户端连接的最小 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。选项值:UNBOUNDED, SSL3, TLS1, TLS1_1, TLS1_2, TLS1_3。默认值:TLS1_2
tls_version_client_min: UNBOUNDED
# 设置客户端连接的最大 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。默认值:UNBOUNDED
tls_version_client_max: UNBOUNDED
# 设置服务器连接的最小 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。默认值:TLS1_2
tls_version_server_min: UNBOUNDED
# 设置服务器连接的最大 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。默认值:UNBOUNDED
tls_version_server_max: UNBOUNDED
# ========== 日志配置 ==========
# 日志详细程度。选项:error, warn, info, alert, debug。默认值:info
termlog_verbosity: debug
# 事件日志详细程度。选项:error, warn, info, alert, debug。默认值:info
console_eventlog_verbosity: debug
# ========== Web 界面显示列 ==========
web_columns:
- timestamp # 时间戳
- tls # TLS 信息
- icon # 协议图标
- path # 请求路径
- method # 请求方法
- status # 响应状态码
- size # 数据大小
- time # 耗时
启动命令简化为:
bash
mitmweb
系统会自动打开浏览器访问 http://127.0.0.1:8081

捕获的流量表格新增了显示列timestamp:

四、捕获流量实战
4.1 启动 OpenCode
在命令行中输入:
bash
opencode
4.2 发送测试请求
选择大语言模型,输入提示词,按回车键发送请求。

4.3 查看捕获结果
回到 mitmproxy Web 界面,你可以看到:
✅ 成功的请求示例:
- 生成会话标题的请求:


- 偶尔成功的 API 调用:

❌ 失败的请求示例:
经过多次测试发现,大部分请求会报错:unknown certificate verification error


五、问题诊断与解决
5.1 观察错误现象
- ❌ server disconnect
- ❌ client disconnect
- ❌ Cannot send received data, channel was already closed
- ❌ Server TLS handshake failed. connection closed

5.2 系统性排查思路
🔍 原因一:本地网络配置问题
症状: DNS 解析失败、网络连接异常
解决方案:
- 使用网络诊断工具(如腾讯电脑管家)进行网络修复

🔍 原因二:目标服务器访问不稳定
检测方法:
bash
ping opencode.ai -t
观察是否有丢包或延迟波动:

🔍 原因三:Cloudflare 反爬机制
关键线索:
- 成功请求的目标 IP 为
172.65.90.*(Cloudflare 边缘节点) - 连接建立后迅速被服务器断开(
server disconnect) - 偶发性成功,大部分请求失败
技术分析:
Cloudflare 的 Bot Management 会检测:
- TLS 指纹(JA3/JA4)是否匹配正常浏览器
🔍 原因四:TLS 握手兼容性问题
错误信息: Server TLS handshake failed. connection closed
可能原因:
-
服务器要求特定 TLS 版本或加密套件
-
mitmproxy 的 TLS 实现与服务器不完全兼容
-
服务器启用了 mTLS(双向认证)