mitmproxy 命令速查表 - 抓包调试工具命令大全
浏览器的 DevTools 只能看到自家浏览器发出去的包,想截获 App、SDK 或定时任务的真实 HTTPS 流量,得靠中间人代理。本表覆盖 mitmproxy/mitmdump/mitmweb 三种模式与端口、流量过滤表达式、请求/响应拦截与编辑、addon 脚本,以及解密 HTTPS 必须装的 CA 证书。调不出浏览器又拿不到抓包数据时最有用。读完能捕获、过滤,甚至改写线上接口请求。
典型使用场景
面向要抓包复现线上问题的后端与客户端开发者:把手机或测试机的流量引到本机 mitmproxy,用过滤表达式在成百上千条流里定位那一条,看请求头、请求体与响应体,必要时改头改体再重放。mitmweb 适合让非命令行同事一起看,mitmdump 适合接入脚本与 CI 记录流量。本表覆盖启动模式(普通 / transparent / upstream)、过滤表达式组合、交互快捷键与脚本化改包、以及 CA 证书安装路径。
启动与模式 7
mitmproxymitmwebmitmdumpmitmproxy -p 8080mitmproxy --mode transparentmitmproxy --mode upstream:http://proxy:8080mitmproxy --listen-host 0.0.0.0过滤表达式 11
~u example.com~d example.com~m GET~c 200~h "Content-Type: json"~b "error"~q~s~t "text/html"~u example.com & ~m GET~u example.com | ~u test.com交互操作 10
?qerwW/nIF脚本与修改 5
mitmproxy -s script.pymitmdump -s script.py -w outfilemitmproxy --set blocklist=example.commitmproxy --set modify_headers="~q|Host:example.com"mitmproxy --set modify_body="~q|regex|replace"HTTPS 证书 4
mitmproxy --set ssl_insecure=true访问 http://mitm.it 下载证书~/.mitmproxy/mitmproxy-ca-cert.pemsecurity add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain cert.pem参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-p / --listen-host | 监听端口与地址;默认只听本机,要接真机就得 --listen-host 0.0.0.0 | mitmproxy --listen-host 0.0.0.0 |
~u / ~d / ~m / ~c | 按 URL、域名、方法、状态码过滤;& 连接为 AND,| 连接为 OR | ~u example.com & ~m GET |
--set modify_headers / modify_body | 无脚本改头改体,语法是 过滤器|头名:值 或 过滤器|正则|替换 | mitmproxy --set modify_body="~q|regex|replace" |
-s script.py / -w outfile | 加载 addon 脚本;配合 -w 把流量同时落盘便于事后分析 | mitmdump -s script.py -w outfile |
易错点与避坑指南
现象设备配好代理后 App 完全断网,浏览器也打不开任何 HTTPS 页面。
原因客户端没装 CA 证书,HTTPS 握手被拦截后校验失败。
处置让客户端访问 http://mitm.it 下载证书,或直接用 ~/.mitmproxy/mitmproxy-ca-cert.pem 安装并信任。
现象非本机设备(手机)连不上代理,mitmproxy 没有任何流量进来。
原因默认只监听回环地址,没有对外网卡开放。
处置加 --listen-host 0.0.0.0(或 -p 指定端口),并确认设备与主机在同一网段、防火墙放行。
现象App 报 SSL handshake failed / network error,但命令行抓包却正常。
原因部分 App 启用了证书固定(pinning),只信任系统预装的 CA。
处置对测试包关闭 pinning,或改抓解包后的明文流量;同时用 --set ssl_insecure=true 放行上游自签证书。
现象改了 modify_body 但抓包里内容没变化。
原因modify_body 只作用于匹配的流,条件写得过于笼统时不生效,且需指明请求侧还是响应侧。
处置用 ~q / ~s 或更完整的过滤器限定方向,配合 -s script.py 写 addon 更可控。
排障路径
1确认代理端口真的在监听
mitmproxy -p 8080启动后客户端代理主机填本机 IP、端口填 8080;连不上先回到这一条。
2把可疑域名直接拉黑,验证拦截是否生效
mitmproxy --set blocklist=example.com命中 blocklist 的请求会被阻断,能快速确认代理链路本身是通的。
3把可疑请求头改掉再观察客户端反应
mitmproxy --set modify_headers="~q|Host:example.com"语法是 过滤器|头名:值;配合交互界面按 r 重放可立即观察结果。
命令示例
启动模式与监听地址
mitmproxy
mitmweb
mitmdump
mitmproxy -p 8080
mitmproxy --listen-host 0.0.0.0
mitmproxy --mode transparent
mitmproxy --mode upstream:http://proxy:8080默认只听本机,外部设备要连必须显式加 --listen-host 0.0.0.0;mitmdump 适合接入脚本与 CI。
过滤表达式与组合
~u example.com
~d example.com
~m GET
~c 200
~b "error"
~q
~s
~u example.com & ~m GET
~u example.com | ~u test.com& 是与、| 是或;~q 只看请求、~s 只看响应,用来把噪声压到只剩目标请求。
无脚本改头改体与拦截域名
mitmproxy --set modify_headers="~q|Host:example.com"
mitmproxy --set modify_body="~q|regex|replace"
mitmproxy --set blocklist=example.com
mitmproxy --set ssl_insecure=true语法是「过滤器|目标|替换」;~q 限定请求、~s 限定响应,省略过滤器则作用于全部流量。
脚本化改包并把流量落盘
mitmproxy -s script.py
mitmdump -s script.py -w outfile-w 在转储的同时把流量写入文件,便于事后重放分析;交互界面里 w 与 W 分别保存单条与持续落盘。
常见坑与注意事项
- 不加 --listen-host 0.0.0.0 时只监听本机,手机与测试机一定连不上,表现是完全没流量进来。
- 设备上的代理主机必须填本机局域网 IP,填 127.0.0.1 指向的是设备自己。
- HTTPS 抓包必须在客户端安装并信任 http://mitm.it 下载的 CA 证书,证书文件在 ~/.mitmproxy/mitmproxy-ca-cert.pem。
- --mode transparent 需要额外的路由或防火墙配置,不当配置会让客户端直接断网。
- modify_headers / modify_body 的作用域前缀写错(把 ~q 写成 ~s)时改包静默失效,改完没变化先核对这一处。
提示
- HTTPS 抓包需要在客户端安装 mitmproxy 的 CA 证书。
- 透明代理模式需要配置 iptables 或路由,适合移动端抓包。
- 脚本用 Python 编写,可以实现复杂的请求修改逻辑。
常见问题
手机连不上本机的代理,怎么排查?
三步。默认只监听本机地址,必须加 --listen-host 0.0.0.0 才会接外部连接;用 mitmproxy -p 8080 确认端口,并确认手机上的代理主机填的是本机在局域网里的 IP 而不是 127.0.0.1;设备侧也要装好 CA 证书,从 http://mitm.it 下载。HTTPS 页面报 SSL handshake failed 而命令行抓包正常,通常就是设备没装或没信任那张 ~/.mitmproxy/mitmproxy-ca-cert.pem。
过滤表达式能组合吗,语法是什么?
可以,用 & 与 | 连接,& 是与、| 是或。单个算子包括 ~u 按 URL、~d 按域名、~m 按方法、~c 按状态码、~h 按请求头、~b 按请求体或响应体、~t 按 Content-Type、~q 仅请求、~s 仅响应。例如 ~u example.com & ~m GET 是只看该域名的 GET 请求,~u example.com | ~u test.com 是两个域名的合集。表达式在 mitmdump 下写在启动参数里,在交互界面中用 / 搜索同样按这套语法。
不用写脚本,怎么直接改请求头或请求体?
用 --set 系列的 modify_headers 与 modify_body,语法是「过滤器|目标|替换」:mitmproxy --set modify_headers="~q|Host:example.com" 改头,mitmproxy --set modify_body="~q|regex|replace" 用正则改体,中间的过滤器不写就是作用于全部流量。前缀 ~q 表示只作用在请求上,改响应则用 ~s。改完没变化通常是把 ~q 写成了 ~s,或者正则里包含未转义的特殊字符导致整条表达式没匹配上。
上下游都接了代理时该怎么配置?
用 --mode upstream:http://proxy:8080,把 mitmproxy 放在客户端与上游代理之间,这样既能看清客户端发出的请求,也能看到上游的应答。上游证书本身有问题时(自签名或链不完整),可以加 --set ssl_insecure=true 忽略上游证书验证,否则握手阶段就会失败。透明代理模式 --mode transparent 则需要额外的路由或防火墙配合,不适用于「只是要挂到已有代理后面」的场景。
抓到流量之后怎么快速看出问题在哪?
交互界面里:/ 搜索定位到那条流,e 编辑请求或响应直接看字段,r 重放一次请求看是否稳定复现,I 开关拦截模式只放行选中的一条,w 与 W 分别保存单条与流式落盘以便事后分析,? 随时查全部快捷键。只想验证某个域名是否被拦截时,用 mitmproxy --set blocklist=example.com 把可疑域名拉黑,观察客户端反应是否符合预期。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。