mitmproxy 命令速查表 - 抓包调试工具命令大全

浏览器的 DevTools 只能看到自家浏览器发出去的包,想截获 App、SDK 或定时任务的真实 HTTPS 流量,得靠中间人代理。本表覆盖 mitmproxy/mitmdump/mitmweb 三种模式与端口、流量过滤表达式、请求/响应拦截与编辑、addon 脚本,以及解密 HTTPS 必须装的 CA 证书。调不出浏览器又拿不到抓包数据时最有用。读完能捕获、过滤,甚至改写线上接口请求。

开发工具·共 37 条命令·最后更新 2026-07-21
mitmproxy抓包代理

典型使用场景

面向要抓包复现线上问题的后端与客户端开发者:把手机或测试机的流量引到本机 mitmproxy,用过滤表达式在成百上千条流里定位那一条,看请求头、请求体与响应体,必要时改头改体再重放。mitmweb 适合让非命令行同事一起看,mitmdump 适合接入脚本与 CI 记录流量。本表覆盖启动模式(普通 / transparent / upstream)、过滤表达式组合、交互快捷键与脚本化改包、以及 CA 证书安装路径。

启动与模式 7

mitmproxy
启动交互式界面
mitmweb
启动 Web 界面
mitmdump
命令行模式(类似 tcpdump)
mitmproxy -p 8080
指定端口
mitmproxy --mode transparent
透明代理模式
mitmproxy --mode upstream:http://proxy:8080
上游代理模式
mitmproxy --listen-host 0.0.0.0
监听所有地址

过滤表达式 11

~u example.com
URL 包含 example.com
~d example.com
域名包含 example.com
~m GET
方法为 GET
~c 200
状态码 200
~h "Content-Type: json"
请求头包含
~b "error"
请求体或响应体包含
~q
仅请求
~s
仅响应
~t "text/html"
Content-Type 匹配
~u example.com & ~m GET
组合过滤(AND)
~u example.com | ~u test.com
组合过滤(OR)

交互操作 10

?
查看帮助
q
退出
e
编辑请求/响应
r
重放请求
w
保存到文件
W
流式保存到文件
/
搜索
n
创建新请求
I
拦截模式开关
F
设置焦点跟随

脚本与修改 5

mitmproxy -s script.py
加载脚本
mitmdump -s script.py -w outfile
脚本+保存流量
mitmproxy --set blocklist=example.com
拦截域名
mitmproxy --set modify_headers="~q|Host:example.com"
修改请求头
mitmproxy --set modify_body="~q|regex|replace"
修改请求体

HTTPS 证书 4

mitmproxy --set ssl_insecure=true
忽略上游证书验证
访问 http://mitm.it 下载证书
客户端安装 CA 证书
~/.mitmproxy/mitmproxy-ca-cert.pem
CA 证书路径
security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain cert.pem
macOS 安装证书

参数矩阵

参数作用示例
-p / --listen-host监听端口与地址;默认只听本机,要接真机就得 --listen-host 0.0.0.0mitmproxy --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. 1确认代理端口真的在监听

    mitmproxy -p 8080

    启动后客户端代理主机填本机 IP、端口填 8080;连不上先回到这一条。

  2. 2把可疑域名直接拉黑,验证拦截是否生效

    mitmproxy --set blocklist=example.com

    命中 blocklist 的请求会被阻断,能快速确认代理链路本身是通的。

  3. 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们