mitmproxy 完全上手指南:像黑客一样看网络流量
想象一下:你点了一杯奶茶,店员把制作过程全透明地展示给你看——mitmproxy 就是网络世界的"透明厨房"。它让你看清每一个 HTTP/HTTPS 请求从发出到返回的完整旅程,还能随时"动手脚"。
一、mitmproxy 是什么?
mitmproxy(Man-In-The-Middle Proxy,中间人代理)是一套开源的交互式网络流量拦截与分析工具。简单来说,它就像一个网络世界的翻译官兼窃听器——所有经过它的 HTTP/HTTPS/WebSocket 流量,你都能看、能改、能保存、能回放。
它包含三个核心工具,对应三种使用场景:
打个比方:mitmproxy 像 Vim(高效但需学习),mitmweb 像 VS Code(直观易用),mitmdump 像 curl(命令行利器)。
二、安装:一分钟搞定
Windows(推荐)
- 访问 mitmproxy.org(https://mitmproxy.org/) 下载安装包
- 强烈建议同时安装 Windows Terminal(https://aka.ms/terminal) 以获得最佳终端显示效果
# 验证安装
mitmproxy --version
macOS
brew install --cask mitmproxy
Linux
推荐下载官方独立二进制包(避免发行版仓库版本滞后):
# 或使用 uv 安装(推荐)
uv tool install mitmproxy
Docker(跨平台通用)
docker run --rm -it -p 8080:8080 mitmproxy/mitmproxy
三、核心概念:先搞懂这些再动手
3.1 代理模式:mitmproxy 的"工作姿势"
mitmproxy 支持多种代理模式,就像同一个人可以穿不同衣服干不同活:

| | |
|---|
| 常规代理 | mitmproxy | |
| 本地捕获 | mitmproxy --mode local | |
| WireGuard | mitmweb --mode wireguard | |
| 反向代理 | mitmdump --mode reverse:https://example.com | |
| 透明代理 | mitmdump --mode transparent | |
新手建议:从常规代理模式开始,配置简单、最稳定。
3.2 证书:HTTPS 拦截的"通行证"
HTTPS 流量是加密的,mitmproxy 要"看懂"内容,必须扮演"中间人"角色——它自己生成证书,分别与客户端和服务器建立 TLS 连接。
首次使用必做:
这个证书安装过程,就像你给 mitmproxy 发了一张"网络交警证",浏览器才会信任它出具的"临时通行证"。
证书文件位置:~/.mitmproxy/
| |
|---|
mitmproxy-ca-cert.pem | |
mitmproxy-ca-cert.p12 | |
mitmproxy-ca-cert.cer | |
四、快速上手:从启动到抓到第一个包
4.1 启动 mitmproxy(终端交互版)
# 默认启动,监听 8080 端口
mitmproxy
# 指定端口
mitmproxy -p 8888
# 只拦截特定域名
mitmproxy --set intercept="~d example.com"
启动后你会看到一个终端界面:
4.2 启动 mitmweb(浏览器图形版)
mitmweb
自动打开浏览器,访问 http://127.0.0.1:8081,即可看到图形界面。左侧是请求列表,右侧是详情面板。
4.3 启动 mitmdump(命令行记录版)
# 实时查看流量
mitmdump
# 保存到文件
mitmdump -w traffic.mitm
# 只显示特定流量
mitmdump "~d api.example.com"
4.4 配置浏览器代理
Chrome/Edge(命令行启动):
# Windows
chrome.exe --proxy-server="127.0.0.1:8080"
# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="127.0.0.1:8080"
Firefox: 设置 → 网络设置 → 手动代理配置 → HTTP 代理填 127.0.0.1,端口 8080
系统全局代理(Windows): 设置 → 网络和 Internet → 代理 → 手动设置代理 → 地址 127.0.0.1,端口 8080
4.5 验证是否成功
- 在 mitmproxy/mitmweb 界面中应该能看到这条请求
五、实用技巧:让 mitmproxy 为你干活
5.1 过滤流量:大海捞针的筛子
mitmproxy 的过滤器非常强大,语法简洁:
~d example.com # 匹配域名
~m GET # 匹配 HTTP 方法
~u /api/v1 # 匹配 URL 路径
~s # 只显示有响应的请求
~q # 只显示请求(无响应)
~b "password" # 匹配 body 内容
~h "Content-Type" # 匹配 header
~c 200 # 匹配状态码
组合使用:
~d api.example.com & ~m POST # api.example.com 的 POST 请求
~d google.com | ~d github.com # google 或 github 的请求
!(~q & ~t "text/html") # 排除 text/html 的请求
5.2 修改请求/响应:实时"动手脚"
在 mitmproxy 交互界面中:
- 按
e 编辑,选择 request headers 或 response body - 修改内容后保存,mitmproxy 会自动发送修改后的请求/响应
命令行批量修改(无需交互):
# 修改请求头
mitmdump --modify-headers "/~q/Host/example.org"
# 修改响应体,将 foo 替换为 bar
mitmdump --modify-body "/~s/foo/bar"
# 添加自定义响应头
mitmdump --modify-headers "/~s/X-Debug/enabled"
5.3 Map Local:用本地文件替换线上资源
前端开发神器——把线上 JS/CSS 替换为本地修改版:
# 将 example.com/main.js 替换为本地文件
mitmdump --map-local "|example.com/main.js|~/projects/fix/main.js"
# 将整个静态目录映射到本地
mitmdump --map-local "|example.com/static|~/local-static"
5.4 Map Remote:请求转发到另一个地址
# 把所有 .jpg 请求重定向到占位图
mitmdump --map-remote "|.*\.jpg$|https://placedog.net/640/480?random"
# 把测试环境 API 指向本地
mitmdump --map-remote "|//api.example.org/|//localhost:3000/"
5.5 录制与回放:时间的"倒带键"
# 录制流量
mitmdump -w session.mitm
# 回放客户端请求(模拟用户操作)
mitmdump -nC session.mitm
# 服务端回放(用保存的响应直接返回,不访问真实服务器)
mitmdump --server-replay session.mitm
# 过滤后保存
mitmdump -nr session.mitm -w filtered.mitm "~m POST"
5.6 使用 Python 脚本:无限扩展
mitmproxy 最强大的地方在于可以用 Python 脚本自定义行为:
# add_header.py
from mitmproxy import http
def response(flow: http.HTTPFlow) -> None:
flow.response.headers["X-Proxy-By"] = "mitmproxy"
运行:
mitmdump -s add_header.py
常用脚本场景:
六、高级模式:按需选用
6.1 本地捕获模式(Local Capture)
无需配置浏览器代理,直接捕获本机进程流量:
# 捕获本机所有流量
mitmproxy --mode local
# 只捕获 curl 的流量
mitmproxy --mode local:curl
# 捕获指定 PID 的进程
mitmproxy --mode local:1234
# 排除特定进程
mitmproxy --mode local:!chrome
这个模式就像给指定 App 装了一个"专属监控",其他应用的流量完全不受影响。
6.2 WireGuard 模式:手机抓包神器
mitmweb --mode wireguard
- 启动后会在
~/.mitmproxy/wireguard.conf 生成配置
无需在手机上安装证书到系统目录(部分手机需 Root),也无需配置代理,是最优雅的手机抓包方案。
6.3 反向代理模式
# 把访问本地 8080 的请求转发到 example.com
mitmdump --mode reverse:https://example.com
# 同时监听 80 和 443
mitmdump --mode reverse:https://example.com@80 --mode reverse:https://example.com@443
适用场景:
七、避坑指南:新手常见问题
7.1 看不到任何流量
- 确认 mitmproxy 监听的 IP 和端口与代理设置一致
- 查看 mitmproxy 事件日志,确认有
client connect 消息 - 检查网络是否启用了客户端隔离(client isolation)
7.2 HTTPS 网站显示证书错误
- 确认已访问 mitm.it(http://mitm.it) 并正确安装 CA 证书
- iOS 设备:安装后还需在"设置 → 通用 → 关于本机 → 证书信任设置"中启用完全信任
- Android 7.0+:应用默认不信任用户安装的证书,需使用 WireGuard 模式或 Root 后安装到系统证书目录
7.3 某些 App 无法代理
- 部分 App 会绕过系统代理设置(尤其是 Android App)
- 解决方案:使用
--mode local 或 --mode wireguard - 部分 App 使用证书固定(Certificate Pinning),需额外工具绕过
7.4 内存占用过高
- mitmproxy/mitmweb 默认将所有流量保存在内存中
- 长时间抓包请使用
mitmdump 并配合 -w 写入文件 - 使用
--set stream_large_bodies=5m 开启大文件流式传输
八、常用命令速查表
# ========== 基础启动 ==========
mitmproxy # 终端交互界面
mitmweb # Web 界面
mitmdump # 命令行输出
# ========== 常用选项 ==========
-p 8888 # 指定监听端口
--set intercept="~d api.example.com" # 设置拦截规则
-w file.mitm # 保存流量到文件
-r file.mitm # 从文件读取流量
-n # 不启动代理(仅处理文件)
# ========== 修改流量 ==========
--modify-headers "/~q/Host/example.com"
--modify-body "/~s/old/new"
--map-local "|url|local-path"
--map-remote "|url|new-url"
# ========== 回放 ==========
-C file.mitm # 客户端回放
--server-replay file.mitm # 服务端回放
# ========== 脚本 ==========
-s script.py # 加载 Python 脚本
# ========== 代理模式 ==========
--mode local # 本地捕获
--mode wireguard # WireGuard VPN
--mode reverse:https://target.com # 反向代理
--mode transparent # 透明代理(Linux/macOS)
小结
mitmproxy 是网络调试领域的"瑞士军刀"——它不仅能看清流量,还能改流量、存流量、回放流量。无论是前端调试 API、安全研究员分析通信协议,还是开发者排查网络问题,mitmproxy 都能胜任。
一句话总结:装一个 mitmproxy,等于同时拥有抓包工具 + 代理服务器 + 请求修改器 + 自动化测试框架。
参考资料
- mitmproxy 官方文档(https://docs.mitmproxy.org/stable/)
- mitmproxy GitHub(https://github.com/mitmproxy/mitmproxy)
- mitmproxy 安装包下载(https://mitmproxy.org/)
人生忠告:工具再强大,也比不上你动手试一次的收获。打开终端,输入 mitmproxy,配置好浏览器代理,访问一个网站——你会发现,网络世界从未如此透明。
阅读原文:点击这里
该文章在 2026/7/30 10:25:06 编辑过