mitmproxy:抓包调试这件事,它做到了极致

mitmproxy:抓包调试这件事,它做到了极致

文章目录

  • mitmproxy:抓包调试这件事,它做到了极致
    • 它到底能干什么
    • 实际使用场景
    • 技术上有什么亮点
    • 和 Charles、Fiddler 比怎么样
    • 怎么装

mitmproxy:抓包调试这件事,它做到了极致

做 Web 开发的都知道,抓包调试是基本功。浏览器自带的 DevTools 能看请求,但遇到 HTTPS、代理、WebSocket 这些场景,就有点力不从心了。mitmproxy 这个项目专门解决这类问题,GitHub 上 Star 已经到了 4.4 万,算是抓包工具里的老牌选手了。

它到底能干什么

简单说,mitmproxy 是一个支持 SSL/TLS 的交互式代理服务器。所有经过它的 HTTP/HTTPS 流量,你都能看到、能改、能重放。

它不是一个工具,而是三个:

mitmproxy是带终端界面的版本,打开就是一个 TUI 应用,实时显示所有经过代理的请求和响应。你可以用键盘快捷键翻看详情,也能直接在终端里拦截和修改请求。

mitmdump是命令行版本,类似 tcpdump 但专门针对 HTTP。适合写脚本做自动化处理,比如批量抓取接口数据、自动修改请求参数、记录所有 API 调用。

mitmweb提供了一个 Web 界面,浏览器打开就能用。对不习惯终端操作的人来说更友好。

三个工具共享同一个内核,功能完全一致,只是交互方式不同。你完全可以白天用 mitmweb 看流量,晚上写脚本用 mitmdump 跑自动化。

实际使用场景

我身边用 mitmproxy 最多的是这几类人:

前端开发调试:本地起个代理,把线上接口的响应改掉,测试各种边界情况。不用改后端代码,也不用搭 mock server。

移动端抓包:手机配置代理指向电脑,所有 App 的网络请求都能看到。调试 App 接口、排查网络问题很方便。

安全测试:拦截 HTTPS 流量,修改请求内容,测试服务端的校验逻辑。安全研究人员基本人手一个。

API 文档生成:用 mitmdump 录制一遍接口调用,自动生成请求和响应的记录,省得手动写文档。

技术上有什么亮点

mitmproxy 是 Python 写的,但它不是那种慢吞吞的 Python 工具。它基于 asyncio 做异步 IO,处理并发连接的性能不错。支持 HTTP/1、HTTP/2 和 WebSocket,覆盖了目前主流的协议。

它的扩展机制做得挺好。你可以用 Python 写插件,挂载到请求和响应的各个阶段。官方提供了一些现成的插件,比如自动给请求加 header、把响应保存到文件、根据条件过滤流量等。

证书管理是个麻烦事,但 mitmproxy 处理得比较省心。第一次启动会自动生成 CA 证书,你只需要在设备上信任这个证书就行。文档里有各平台的详细配置步骤。

和 Charles、Fiddler 比怎么样

Charles 和 Fiddler 是 GUI 工具,上手快,但不够灵活。mitmproxy 的优势在于可编程,你可以用代码控制代理行为,这对自动化测试和批量处理来说是刚需。

另外 mitmproxy 完全开源,MIT 协议。Charles 要收费,Fiddler 的免费版功能有限。如果你是个人开发者或者小团队,mitmproxy 是更实际的选择。

当然也有不足。终端界面对新手不太友好,上手需要一点学习成本。Web 界面 mitmweb 好一些,但功能没有 Charles 那么直观。如果你只是偶尔抓个包看看,浏览器 DevTools 够用的话,没必要折腾 mitmproxy。

怎么装

Python 环境下直接 pip 安装:

pip install mitmproxy

装完运行mitmproxy就能启动。macOS 和 Linux 都能直接用,Windows 上建议用 WSL。

非 Python 用户也可以下载官方的预编译二进制包,不用装 Python 环境。

如果你经常做 Web 开发或者安全测试,值得花半天时间把它配置好。一旦用熟了,调试效率会提升不少。

Python 环境。

如果你经常做 Web 开发或者安全测试,值得花半天时间把它配置好。一旦用熟了,调试效率会提升不少。