什么是 mitmproxy?
mitmproxy 是一个面向渗透测试人员和软件开发者、支持 TLS 的交互式拦截 HTTP 代理。把浏览器、手机、命令行工具甚至整个容器指向它,每一个请求和响应都会从这里经过,你能看清一切:请求头、正文、耗时、TLS 细节。你可以把请求在半路停下,改完再放行,重放上百次,或者用几行 Python 自动改写流量。它支持 HTTP/1、HTTP/2、HTTP/3、WebSocket 和原始 TLS,可以作为常规、透明、反向、上游、SOCKS5、WireGuard 或本地捕获代理运行。一个软件包给你三个前端:交互式控制台界面 mitmproxy,同样功能搬进浏览器的 mitmweb,以及命令行版本 mitmdump,相当于 HTTP 版的 tcpdump。
⚡ mitmproxy 的主要功能
🔓 看穿 TLS
mitmproxy 首次运行时会在 ~/.mitmproxy/ 里生成自己的证书颁发机构,并为你访问的每个主机即时签发证书。在客户端上信任一次这个 CA,它的 HTTPS 流量就能一条一条地看清楚。
✋ 拦截与编辑
在控制台里按 i,给它一个过滤器,比如 ~d api.example.com,匹配的请求就会原地停住。e 编辑方法、URL、请求头或正文,a 放它继续上路。
🔁 什么都能重放
r 在控制台里重放单个请求。用 -w 保存一次会话,再用 --client-replay 回放客户端一侧,或者用 --server-replay 以录下的响应应答客户端。
🐍 Python 插件
用 -s script.py 加载脚本,挂进每一个请求、响应、WebSocket 消息或 TLS 握手。改写请求头、模拟接口、去掉跟踪、写日志文件:插件 API 与 mitmproxy 自身功能所用的是同一套。
🧭 所有代理模式
常规、透明、反向(--mode reverse:https://example.com)、上游、SOCKS5、面向手机和虚拟机的 WireGuard,以及只捕获单个应用的本地模式。多次传入 --mode 就能同时运行好几种。
🌐 控制台、网页或无界面
键盘驱动的控制台适合终端和 SSH 会话,mitmweb 在 http://127.0.0.1:8081 提供可点选的流量列表,mitmdump 则用于脚本、CI 任务和长时间无人值守的抓包。
apt upgrade 就能让你保持最新。
📦 从 deb.griffo.io 安装
第 1 步:添加仓库
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt update🆓 有一个永久免费的镜像。 deb-free.griffo.io 永久免费提供软件包 — 无需账号、无需订阅,最多落后上游 2 个月,安全修复立即发布。目前收录 cliamp、Ghostty、lazydocker、Oh My Posh、Uncloud 和 Zed;mitmproxy 不在其中,因此今天只能通过上面的仓库安装 — 提出请求即可将其加入。
第 2 步:安装 mitmproxy
# 安装最新版 mitmproxy
sudo apt install mitmproxy
# 一个软件包,三条命令:mitmproxy、mitmweb 和 mitmdump。
# 它自带 Python 和 OpenSSL,所以不会拉进其他依赖
# 验证安装
mitmproxy --version
mitmdump --version# 安装最新版 mitmproxy
apt install mitmproxy
# 一个软件包,三条命令:mitmproxy、mitmweb 和 mitmdump。
# 它自带 Python 和 OpenSSL,所以不会拉进其他依赖
# 验证安装
mitmproxy --version
mitmdump --version第 3 步:第一次运行
# 启动控制台界面,监听 8080 端口
mitmproxy
# 或者网页界面,会打开 http://127.0.0.1:8081
mitmweb
# 在另一个终端里,让一个请求经过它
curl -x http://127.0.0.1:8080 http://example.com
# 首次运行已在 ~/.mitmproxy/ 里生成了 CA。在已经走代理的
# 客户端上访问 http://mitm.it 为该客户端安装它,
# 或者在本机上让整个系统信任它
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
sudo update-ca-certificates# 启动控制台界面,监听 8080 端口
mitmproxy
# 或者网页界面,会打开 http://127.0.0.1:8081
mitmweb
# 在另一个终端里,让一个请求经过它
curl -x http://127.0.0.1:8080 http://example.com
# 首次运行已在 ~/.mitmproxy/ 里生成了 CA。在已经走代理的
# 客户端上访问 http://mitm.it 为该客户端安装它,
# 或者在本机上让整个系统信任它
cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
update-ca-certificates🎯 基本用法示例
抓取流量:
# 监听另一个端口
mitmproxy --listen-port 9090
# 只让一条命令走代理
HTTPS_PROXY=http://127.0.0.1:8080 curl https://example.com
# 不开界面,把所有流量录进文件
mitmdump -w session.mitm
# 只显示发往某个主机的请求
mitmdump "~d api.example.com"
# 保存 HAR 文件,给浏览器开发者工具或问题报告用
mitmdump --set hardump=./session.har重放与查看:
# 在控制台里打开保存的会话
mitmproxy -r session.mitm
# 不启动代理,打印其中的 POST 请求
mitmdump -n -r session.mitm "~m POST"
# 把录下的请求再发一遍
mitmdump -n --client-replay session.mitm
# 用录下的响应应答客户端,而不是真正的服务器
mitmdump --server-replay session.mitm代理模式与插件:
# 在单个服务器前面做反向代理
mitmproxy --mode reverse:https://example.com --listen-port 8443
# 同一个实例同时提供 SOCKS5 和常规代理
mitmdump --mode socks5 --mode regular
# WireGuard:用手机上的 WireGuard 应用扫描 mitmweb 里的二维码
mitmweb --mode wireguard
# 用 Python 插件改写流量,例如 addon.py 的内容为:
# def response(flow):
# flow.response.headers["x-seen-by"] = "mitmproxy"
mitmdump -s addon.py🔧 工具集成
mitmproxy 站在你已经在用的工具和它们访问的网络之间:
- curl、wget 和大多数命令行工具: 凡是遵循
HTTP_PROXY和HTTPS_PROXY的程序,一个环境变量就能让它经过 mitmproxy,curl -x则可以按单条命令设置 - 浏览器和手机: 把代理设为 8080 端口,打开
http://mitm.it安装对应平台的 CA;或者在 Android 和 iOS 上用 WireGuard 模式,完全不用设置代理 - 浏览器开发者工具:
hardump会写出 HAR 文件,mitmproxy 也能用-r读回 HAR 文件,抓包因此能在它与 Chrome 或 Firefox 之间双向流转 - Python 插件: 用
-s加载的脚本运行在 mitmproxy 自带的 Python 里,可以导入标准库和 mitmproxy 自带的模块,但不能导入为系统python3安装的包 - 测试套件与 CI: 带
--server-replay的mitmdump用录下的响应提供服务,让不稳定的第三方 API 在集成测试里变得可重复
🚀 为什么选择 deb.griffo.io?
- 官方 Ubuntu: noble、questing 和 resolute 的 universe 里是 2022 年的 8.1.1,jammy 上则是更老的 6.0.2
- pipx 或 pip: 版本够新,但绑定在你系统上的某个 Python 上,而且 apt 看不见它
- 上游的 tarball: 与本软件包相同的独立构建,只是要手动解压、手动更新
- deb.griffo.io: 最新版本,并自动更新
- ✅ 比官方源领先好几年: 当前的 mitmproxy 版本而不是 8.1.1,HTTP/3、WireGuard 和本地捕获模式一应俱全
- ✅ 一个包,三条命令:
mitmproxy、mitmweb和mitmdump都会进入你的 PATH,名字与所有教程里用的一致 - ✅ 自动更新: 上游发布后数小时内更新软件包
- ✅ 完整的软件包: 上游官方的自包含 Linux 构建,不加料、不打补丁
- ✅ 没有 Python 依赖: 它自带 Python 和 OpenSSL,因此永远不会与系统的 Python 包冲突,也不用等它们更新
- ✅ 两种架构: amd64 和 arm64,所有版本上都是同一个独立构建
- ✅ 多发行版: 支持 Ubuntu 22.04、24.04、25.10 和 26.04
- ✅ 易于维护: 使用标准 apt 命令即可更新
📦 软件包构建仓库
Ubuntu 软件包在这个 GitHub 仓库中自动构建和维护:
- 🕵️ mitmproxy-debian - 最新版本构建
🔗 相关软件包
deb.griffo.io 同样提供:
- yq - 查询和整理从抓包里取出的 JSON 正文
- Headscale - 自托管的 WireGuard 组网,负责隧道的另一端
- k9s - 为你最终要代理的 Kubernetes 服务准备的终端界面
- lazydocker - 为你正在调试其流量的容器准备的终端界面