⚠️ Warning
本文只探究安卓透明代理的实现技术,仅供学习交流,不提供代理工具的二进制文件分发。
请严格遵守您(读者)所在的国家和地区的相关方面的法律法规,对于擅自基于本文所述方法从事的违法犯罪活动,笔者不承担任何法律责任。
本文内容有一定技术门槛,请确保您已学习过相关知识。如您看不懂本文的内容,就说明您不是本文的受众群体。
如您不同意上述条例,请立即关闭本网页。否则默认您已同意。
引
代理工具的运行没有什么难度,但是路由问题十分棘手。PC 端我们通常可以设置系统代理或者干脆直接 tun 模式实现网卡级的透明代理。
安卓上面不好直接设置系统代理,而且事实上也没有多少软件去使用系统代理。所以安卓上通常是用 tun 实现的代理。但是安卓有一点和 PC 不同,它在非 root 下并不能去修改路由表,那就无法接管流量了。所以在安卓上通常使用 VPN 功能来实现流量的接管。
但是对于有 root 权限的设备,我们完全可以搞一些更高级打洞玩法。我今天要讲的就是一款 Magisk / KernelSU / APatch 模块,Box for root 。这个模块可以通过 root 实现 iptables 的自动配置。
安装
本文重点不在 root 的实现,有关 root 的实现方案可以很容易地在网上找到。本文使用 KernelSU 作为 root 实现方案。
Github 上有两个类似的仓库,一个叫 box_for_magisk
,还有一个叫 box4magisk
。笔者没有去探究两者的关系,两者功能类似,但是前者更新频率较快,而且作者还配套开发了前端,所以本文以前者为例。
在 KernelSU 中刷入模块,并安装上管理软件。
在刷模块的时候,会问你是否下载内核。建议按音量上键下载一下,或者手动下载好内核后放在 /data/adb/box/bin/
下。但手动下载的时候请注意将内核改为 clash
sing-box
xray
v2fly
hysteria
中的一个,因为 Box for root 是支持切换内核的,所以没有智能到可以自动识别二进制文件的名字。
下载内核的过程中请保持国际联网通畅。什么蛋鸡循环问题。
记得授予 BoxForRoot 管理软件的 root 权限,不然会提示找不到模块。
安装完成后建议重启手机,确保模块生效。
配置
先把默认配置关掉,点右下角设置。笔者习惯使用 sing-box ,其它内核配置方法类似。
下面的配置项根据自己需要去选择。这里我打开了 quic 和 ipv6 ,关闭了 geox 因为我使用自己准备的规则集,关闭了 crontab 因为我不需要周期任务。网络模式我更建议使用 mixed 或 tun 模式。
然后就是具体的配置文件的修改了。在 /data/adb/box
下存放着各种内核的配置文件。
Box_for_root 默认提供了一个 sing-box 的配置文件:
{
"log": {
"level": "panic",
"output": "/data/adb/box/run/sing-box.log",
"timestamp": true
},
"dns": {
"servers": [
{
"tag": "AdGuard",
"address": "94.140.14.14"
},
{
"tag": "local",
"address": "",
"detour": "direct"
},
{
"tag": "rcode",
"address": "rcode://success"
}
],
"rules": [
{
"outbound": "any",
"server": "local",
"disable_cache": true
}
],
"strategy": "prefer_ipv4"
},
"inbounds": [
{
"type": "tproxy",
"tag": "tproxy-in",
"listen": "::",
"listen_port": 9898,
"sniff": true
},
{
"type": "tun",
"tag": "tun-in",
"interface_name": "utun9",
"address": [
"172.18.0.1/30",
"fdfe:dcba:9876::1/126"
],
"mtu": 9000,
"stack": "system",
"auto_route": true,
"strict_route": true,
"auto_redirect": true,
"sniff": true,
"sniff_override_destination": false,
"include_android_user": [
0,
10
],
"include_package": [],
"exclude_package": []
},
{
"type": "redirect",
"tag": "redirect-in",
"listen": "::",
"listen_port": 9797,
"sniff": true,
"sniff_override_destination": false
}
],
"outbounds": [
{
"type": "selector",
"tag": "default",
"outbounds": [
"direct",
"block"
]
},
{
"type": "dns",
"tag": "dns"
},
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
}
],
"route": {
"rules": [
{
"port": 53,
"outbound": "dns"
}
],
"final": "default"
},
"experimental": {
"clash_api": {
"external_controller": "127.0.0.1:9090",
"external_ui": "dashboard",
"cache_file": "cache.db",
"store_selected": true
}
}
}
由于安卓上有一些特殊的特性,所以建议直接在这个基础上进行修改。具体的区别体现在,在 VPN 的实现中, inbounds
的 tun
中可以不写
"auto_redirect": true,
"strict_route": true,
"include_android_user": [
0,
10
]
,因为 VPN 功能可以直接实现网卡级的流量接管。而我们现在需要做的是利用 root 去实现这个功能,所以必须写上。当然这些配置在安装时的预设配置里面已经有了。
关于 sing-box 的配置文件的编写,请参考sing-box 官方配置手册,本文不介绍。
启动!!
然后在 BoxForRoot 主页启动就可以了。如果你保留了 clash_api
的相关配置,点击下面的 Dashboard 即可看到监控面板。如果你在 outbound
里配置了 selector
类型的选项,就可以在这个界面实现节点的切换。
结语
有了 root ,我们可以实现有很多有趣的事情。但是 root 也是双刃剑,一定要谨防那些恶意模块。在自己理解原理的基础上做进一步深入。