这篇文章上次修改于 354 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
透明代理不能解决任何与证书相关的问题

前言

安卓上基于透明代理对特定APP抓包中使用的是redsocks2,本文演示如何使用clash实现同样的效果

你以为是Clash For Android,错,这里使用的是Core版本

就原理上来说,和前一篇文章并无区别,Clash的优势在于其支持多种类型的代理,拥有更细粒度的配置能力

这样在不开VPN的情况下挂海外代理也很方便,APP也检查不到(好像有一些不好的用途,不过我真的只是抓包...

20231204补充

如果在中途切换了网络,请重新清理原iptables然后重新执行一次iptables.sh

即需要确保先有网,再执行转发规则,当然如果你是在网关设备做转发那就执行一次即可

20230802补充

脚本中没有对ipv6处理,所以有部分ipv6的请求可能抓不到,所以有个简单的方案就是把ipv6干掉,所以请把下面的脚本加入iptables.sh

sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1

另外把clash中ipv6的配置注释掉即可

感谢Abbbbbi的反馈

文件准备

从下面获取需要的文件

或者用这个懒人包,下载后解压

md5: 9B765C7E759F3FC0C8DD103C2E20B9CD

步骤

文件准备好后,按以下几步操作即可(均在root下执行):

  1. 修改config.yaml中的代理配置,改成你的抓包软件的代理
  2. 连接手机,完成adb配对,然后运行push.bat即可;或者选择自己手动写脚本把文件推送到/data/local/tmp
  3. 启动clash,第一次运行会下载Country.mmdb,压缩包里已经准备好了

    /data/local/tmp/clash-linux-arm64 -d /data/local/tmp
  4. 设置iptables规则

    /data/local/tmp/clean.sh && /data/local/tmp/iptables.sh
  5. 转发9090端口,这个在config.yaml配置的,也可以考虑配置为0.0.0.0:9090,就不用adb forward

    adb forward tcp:9090 tcp:9090
  6. 访问web版clash控制台,这里随便谷歌到的一个: http://clash.razord.top/

    这个网站需要代理才能访问,访问之后关掉代理即可,另外为了避免浏览器插件带来的影响,建议隐身模式下访问

如果链接不了controller,请尝试将http换成https

或者试试这个(【也可以手机上直接访问这个】):http://yacd.haishan.me/

这里选择好要使用的代理即可,这个操作只需要做一次,后面启动clash就会默认这个代理了

如果前面config.yaml配置的是0.0.0.0,那么弹出下图时可以填手机ip

  1. 现在抓包软件应该就能看到数据包了

  2. 结束抓包,记得清理iptables,或者重启手机

    /data/local/tmp/clean.sh

在完成首次配置之后,后续只需要两个步骤即可,即运行clash和启用iptables,记得分两个shell操作

/data/local/tmp/clash-linux-arm64 -d /data/local/tmp
/data/local/tmp/clean.sh && /data/local/tmp/iptables.sh

补充:

Q: 怎么按uid/用户过滤
A: iptables.sh添加这样的内容即可,即-m owner --uid-owner u0_a428,也可以写成10428这样

  • iptables -t mangle -A OUTPUT -j clash_local

变更为

  • iptables -t mangle -A OUTPUT -m owner --uid-owner u0_a428 -j clash_local

iptables.sh修改后重新push一次,然后clean后再次执行即可

需要注意的是isolatedProcess的uid可能不一样,比如是u0_i9008,那么增加一条上面的规则即可

Q: 如何给clash增加多个代理
A: 当前config.yaml配置已有示例,只是要注意重新push配置文件后,要重新运行clash

udp抓包

上面的配置完成后,对于tcp包应当都是可以抓到的,ipv6暂时不管了...

那么能不能抓到udp包呢?

经过测试,发现使用Charles的话似乎是不行的,应该是本身没有提供支持

但是mitmproxy说是支持的,有一个rawudp是设定,默认是开着的

mitmproxy代理类型设置为socks5,然后可以正常抓包,不过没有udp

经过观察,发现udp包是有转发给mitmproxy的,只是提示nsupported SOCKS5 request

可以定位到对应的代码位置

可以看到异常的时候,对应的前四个字节都是05030001,而根据socks5协议的说明,这里应该就是代表udp

这里应该是mitmproxy对这种情况缺乏支持完善,改改也许能适配?这样一来抓包数据就能相当完整了

参考