【mitmproxy】通过 mitmproxy 的本地捕获代理模式获取 OpenCode 发起的 AI API 请求的详细信息

文章目录

    • 前言
    • 一、理解核心原理
      • [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 解析失败、网络连接异常

解决方案:

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

检测方法:

bash 复制代码
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(双向认证)

相关推荐
IT摆渡者1 小时前
linux 系统安全检查
运维·网络·经验分享·笔记
学习3人组2 小时前
OEE(设备综合效率)的标准定义、公式、损失分类、以及在工位触屏/MES里怎么采集和统计
大数据·网络·数据库
时空自由民.2 小时前
蓝牙协议栈介绍
linux·网络·单片机
ggabb2 小时前
月壤之下:人类驻月先行者
网络
b55t4ck3 小时前
FortiWeb CVE-2025-64446漏洞深入复现分析
网络·安全·iot
wanhengidc3 小时前
可持续性 云手机运行
运维·服务器·网络·安全·智能手机
YOU OU3 小时前
网络编程(Java)
网络
mifengxing3 小时前
操作系统(四)
linux·服务器·网络·操作系统
时空系4 小时前
第4篇:如果...那么——让程序做选择 Rust中文编程
开发语言·网络·rust