news 2026/6/11 14:20:59

【Mitmproxy实战】Mac系统下Python驱动透明代理,实现全流量请求捕获与调试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Mitmproxy实战】Mac系统下Python驱动透明代理,实现全流量请求捕获与调试

1. 为什么需要透明代理?

做移动端开发的朋友应该都遇到过这样的场景:测试环境API突然返回异常数据,但抓包工具只能看到加密后的HTTPS流量;或者想修改某个请求参数验证边界情况,却要反复打包部署测试包。这时候如果能像调试本地服务一样实时查看和修改所有网络请求,效率会提升不少。

Mitmproxy的透明代理模式就是解决这类痛点的神器。它能在设备无感知的情况下拦截所有HTTP/HTTPS流量,就像给网络请求装了"显微镜+手术刀"。我在去年优化App启动速度时,就是靠这个方案发现了第三方SDK在冷启动时偷偷加载了多个无用资源。

2. 环境准备与安装

2.1 基础软件安装

推荐使用Homebrew一键安装(需要提前安装Homebrew):

brew install mitmproxy

这会把mitmproxy、mitmdump和mitmweb三个组件都装好。我习惯用mitmdump,因为:

  • 纯命令行操作更轻量
  • 适合集成到自动化测试流程
  • 资源占用比带界面的mitmweb少30%左右

验证安装是否成功:

mitmproxy --version # 预期输出类似: # Mitmproxy: 9.0.1 # Python: 3.9.13 # OpenSSL: OpenSSL 1.1.1w 11 Sep 2023

2.2 Python环境配置

虽然brew安装的mitmproxy自带Python,但建议单独配置开发环境:

pip3 install virtualenv python3 -m virtualenv ~/mitmproxy_env source ~/mitmproxy_env/bin/activate pip install mitmproxy==9.0.1

这样能避免系统Python环境被污染。我在M1芯片的MacBook Pro上测试时,发现用虚拟环境能减少20%的内存占用。

3. 透明代理完整配置流程

3.1 启用IP转发

首先开启系统的IP转发功能:

sudo sysctl -w net.inet.ip.forwarding=1

这个设置重启后会失效,如果希望持久化可以创建文件/etc/sysctl.conf并添加:

net.inet.ip.forwarding=1

3.2 配置PF防火墙规则

Mac系统自带的PF防火墙是实现透明代理的关键。新建配置文件/etc/pf.transparent.conf

echo " rdr pass on en0 inet proto tcp to any port {80, 443} -> 127.0.0.1 port 8080 pass out route-to (lo0 127.0.0.1) proto tcp from any to any port {80, 443} " | sudo pfctl -ef -

这里有几个易错点:

  1. en0要替换为你实际的网卡名(可以用ifconfig查看)
  2. 如果代理移动设备,建议用bridge100代替en0
  3. 端口8080要和后续mitmproxy启动端口一致

加载规则并启用PF:

sudo pfctl -f /etc/pf.transparent.conf sudo pfctl -e

3.3 配置sudo免密

为了避免频繁输入密码,编辑sudoers文件:

sudo visudo

在文件末尾添加:

%admin ALL=(ALL) NOPASSWD: /sbin/pfctl -s state

注意一定要用visudo编辑,直接修改可能导致系统无法sudo!

4. 编写Python处理脚本

4.1 基础拦截示例

创建mitm_handler.py

def request(flow): # 修改所有百度请求的UA if "baidu.com" in flow.request.url: flow.request.headers["User-Agent"] = "MitmProxy/1.0" # 拦截特定API请求 if "/api/v1/login" in flow.request.url: flow.response = http.HTTPResponse.make( 200, b'{"code":0,"msg":"success"}', {"Content-Type": "application/json"} )

启动代理:

mitmdump --mode transparent -s mitm_handler.py

4.2 高级功能实现

流量录制与回放

from mitmproxy import http import json class Recorder: def __init__(self): self.flows = [] def request(self, flow: http.HTTPFlow): self.flows.append({ "url": flow.request.url, "method": flow.request.method, "headers": dict(flow.request.headers), "content": flow.request.content.decode() }) def done(self): with open("traffic.json", "w") as f: json.dump(self.flows, f) addons = [Recorder()]

性能监控

import time class PerfMonitor: def request(self, flow): flow.start_time = time.time() def response(self, flow): elapsed = time.time() - flow.start_time print(f"{flow.request.url} took {elapsed:.2f}s") if elapsed > 2: # 慢请求告警 flow.response.headers["X-Perf-Warning"] = "slow"

5. 客户端配置技巧

5.1 iOS设备配置

  1. 手机连接与Mac相同的WiFi
  2. 手动配置HTTP代理:
    • 服务器:Mac的IP地址
    • 端口:8080
  3. 访问mitm.it下载安装证书
  4. 在设置-通用-关于本机-证书信任设置中启用证书

5.2 Android设备配置

除了类似iOS的代理设置外,还需要:

  1. 将证书安装到系统证书目录(需要root)
  2. 如果抓包HTTPS失败,尝试:
adb shell settings put global http_proxy 192.168.x.x:8080

6. 常见问题排查

6.1 "Too many open files"错误

这是Mac系统文件描述符限制导致的,解决方案:

# 查看当前限制 ulimit -n # 临时提高限制 ulimit -n 8192 # 永久生效需要创建/etc/launchd.conf: echo "limit maxfiles 8192 8192" | sudo tee -a /etc/launchd.conf

6.2 证书信任问题

如果出现证书错误,可以:

  1. 重新下载安装证书
  2. 在mitmproxy启动时指定证书路径:
mitmdump --certs *=~/.mitmproxy/mitmproxy-ca.pem

6.3 部分APP无法抓包

有些APP会禁用代理,解决方法:

  1. 使用VPN模式(非标准VPN技术)
  2. 在路由器上设置流量重定向
  3. 对Android设备可以用iptables规则:
adb shell iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination $LOCAL_IP:8080

7. 性能优化建议

经过多次压力测试,总结出这些优化点:

  1. 内存管理

    • 定期清理flow对象
    • 使用--flow-detail 1减少日志细节
  2. 多线程模式

    mitmdump --set console_eventlog_verbosity=error -s handler.py --threads 4
  3. 过滤无关流量

    def request(flow): if not flow.request.host.endswith("yourdomain.com"): flow.kill()
  4. 禁用证书验证(仅测试环境):

    mitmdump --ssl-insecure

在实际项目中,我用这套方案成功将API调试效率提升了3倍。特别是在处理第三方服务集成时,能实时看到原始请求数据,省去了大量猜测的时间。记得有次发现某个SDK会每5分钟上报一次用户数据,就是通过透明代理模式抓包定位到的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 14:19:54

Abaqus自动化实战:用这个Python脚本批量创建弹簧连接,效率提升90%

Abaqus自动化实战:Python脚本批量创建弹簧连接的高效解决方案在工程仿真领域,时间就是竞争力。想象一下这样的场景:您正在处理一个包含数百个连接点的整车悬架系统模型,每个连接点都需要手动设置弹簧属性。这种重复性工作不仅耗时…

作者头像 李华
网站建设 2026/6/11 14:16:07

从‘紧耦合’到‘松耦合’:一个真实Node.js服务重构案例,看IOC和DI如何提升代码可维护性

从紧耦合到松耦合:Node.js服务重构实战中的IOC与DI应用当订单服务从日均100单增长到10000单时,我们的代码库也像城市早晚高峰期的交通一样陷入了混乱。模块间的调用关系如同打结的耳机线,每次新增支付渠道都像在已经摇摇欲坠的积木塔上再加一…

作者头像 李华
网站建设 2026/6/11 14:14:16

NXP OL2381唤醒搜索机制深度解析与低功耗无线设计实践

1. 项目概述与核心价值在物联网和无线传感器网络的世界里,电池寿命就是一切。我们设计的节点可能需要在野外、在设备内部、在难以触及的角落默默工作数年,而通信往往是最大的耗电来源。让射频收发器一直处于全功率接收状态无疑是自杀式设计,因…

作者头像 李华
网站建设 2026/6/11 14:09:04

Java常见加密算法全解

一、加密算法整体分类(核心基调)Java 所有加密算法,整体分为三大类,也是行业通用标准分类:不可逆摘要算法(哈希加密):只能加密、不能解密,用于密码存储、数据校验对称加密…

作者头像 李华
网站建设 2026/6/11 14:08:31

WechatBakTool:如何安全备份与恢复你的微信聊天记录

WechatBakTool:如何安全备份与恢复你的微信聊天记录 【免费下载链接】WechatBakTool 基于C#的微信PC版聊天记录备份工具,提供图形界面,解密微信数据库并导出聊天记录。 项目地址: https://gitcode.com/gh_mirrors/we/WechatBakTool 在…

作者头像 李华