mitmproxy linux docker 流量捕获

mitmproxy linux docker 流量捕获

容器

拉取 Redroid (root) 容器,并寻找到其网卡名称,如 br-207943f7b031

mitmproxy

安装 mitmproxy,可选 redirect.py 来控制流,在 8888 端口启动即可

transparent --listen-host :: --listen-port 8888 -s redirect.py

nft 设置

加载 Netfilter NAT 相关的内核模块:

sudo modprobe nf_nat
sudo modprobe nf_nat_ipv4 # 针对 IPv4 的 NAT
sudo modprobe nf_nat_ipv6 # 针对 IPv6 的 NAT
sudo modprobe nf_tproxy # 有些系统或场景需要这个模块来支持透明代理的 redirect

# 检查模块是否已加载
lsmod | grep nf_nat
lsmod | grep nf_tproxy

设定一个 chain,引导流量到 8888

# IPv4 HTTP
sudo nft add rule ip nat mitmproxy_prerouting ip saddr 172.26.0.0/16 tcp dport 80 redirect to :8888
# IPv4 HTTPS
sudo nft add rule ip nat mitmproxy_prerouting ip saddr 172.26.0.0/16 tcp dport 443 redirect to :8888

# IPv6 HTTP
sudo nft add rule ip6 nat mitmproxy_prerouting ip6 saddr ::/0 tcp dport 80 redirect to :8888
# IPv6 HTTPS
sudo nft add rule ip6 nat mitmproxy_prerouting ip6 saddr ::/0 tcp dport 443 redirect to :8888

检查 rulelist:

sudo nft list ruleset

应存在引导流量的 chain ,在 ipv4 ipv6 中,各有一个:

chain mitmproxy_prerouting {
ip saddr 172.26.0.0/16 tcp dport 80 redirect to :8888
ip saddr 172.26.0.0/16 tcp dport 443 redirect to :8888
}

添加跳转规则:

# IPv4 jump rule
sudo nft insert rule ip nat PREROUTING iifname "br-207943f7b031" goto mitmproxy_prerouting

# IPv6 jump rule
sudo nft insert rule ip6 nat PREROUTING iifname "br-207943f7b031" goto mitmproxy_prerouting

这样,透明代理构建完成

证书安装

为了捕获 HTTPS 流,需要将 Android 设备的系统证书做修改,信任 mitmproxy 的证书

确保证书文件存在于主机路径:~/.mitmproxy/mitmproxy-ca-cert.cer

如上证书,安装 mitmproxy 运行之后应当出现

使用 adb ,将证书推送到 Redroid 容器的临时目录:

adb push ~/.mitmproxy/mitmproxy-ca-cert.cer /data/local/tmp/

通过 ADB 连接到容器:

adb shell

在容器内执行以下命令,获取证书的哈希值(用于重命名文件):

# 进入临时目录
cd /data/local/tmp

# 计算哈希值(输出为8位十六进制字符串)
HASH=$(openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.cer | head -1)
echo $HASH # 示例输出:c8750f0d

利用 Magisk 的 root 权限将证书复制到系统证书存储:

# 挂载系统分区为可读写
mount -o rw,remount /system

# 复制证书到系统证书目录
cp mitmproxy-ca-cert.cer /system/etc/security/cacerts/

# 重命名证书为 <哈希值>.0
mv /system/etc/security/cacerts/mitmproxy-ca-cert.cer /system/etc/security/cacerts/${HASH}.0

# 设置权限(必须为644)
chmod 644 /system/etc/security/cacerts/${HASH}.0
chown root:root /system/etc/security/cacerts/${HASH}.0

# 重新挂载为只读(可选)
mount -o ro,remount /system

系统分区的 mount 可能存在不同,查看 df,根据 Android 版本选择分区修改

重启容器,使证书生效:

reboot