前言

本文详细介绍如何使用 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 快速安装:

pip install mitmproxy

安装完成后,你将获得三个命令行工具:

  • mitmproxy - 终端界面版本
  • mitmweb - Web 界面版本(推荐)
  • mitmdump - 命令行转储版本

三、启动代理服务

3.1 命令行方式(快速开始)

执行以下命令启动本地代理:

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

# ========== 代理模式配置 ==========
# 要生成的代理服务器类型。可以多次传递。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         # 耗时

启动命令简化为:

mitmweb

系统会自动打开浏览器访问 http://127.0.0.1:8081
在这里插入图片描述
捕获的流量表格新增了显示列timestamp:
在这里插入图片描述


四、捕获流量实战

4.1 启动 OpenCode

在命令行中输入:

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 解析失败、网络连接异常

解决方案:

  1. 使用网络诊断工具(如腾讯电脑管家)进行网络修复
    网络修复工具
🔍 原因二:目标服务器访问不稳定

检测方法:

ping opencode.ai -t

观察是否有丢包或延迟波动:
网络测试

🔍 原因三:Cloudflare 反爬机制

关键线索:

  1. 成功请求的目标 IP 为 172.65.90.*(Cloudflare 边缘节点)
  2. 连接建立后迅速被服务器断开(server disconnect
  3. 偶发性成功,大部分请求失败

技术分析:

Cloudflare 的 Bot Management 会检测:

  • TLS 指纹(JA3/JA4)是否匹配正常浏览器
🔍 原因四:TLS 握手兼容性问题

错误信息: Server TLS handshake failed. connection closed

可能原因:

  1. 服务器要求特定 TLS 版本或加密套件

  2. mitmproxy 的 TLS 实现与服务器不完全兼容

  3. 服务器启用了 mTLS(双向认证)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐