惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
量子位
D
DataBreaches.Net
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
B
Blog
The Cloudflare Blog
D
Docker
I
InfoQ
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
腾讯CDC
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
S
SegmentFault 最新的问题
GbyAI
GbyAI
有赞技术团队
有赞技术团队

树 - 洞

SMTP2GO 拯救你的 25 端口限制 | 树 SMTP2GO 拯救你的 25 端口限制 | 树 Bilibili Linux 客户端 VAAPI 硬解折腾全记录 | 树 Bilibili Linux 客户端 VAAPI 硬解折腾全记录 | 树 震惊!insmtr 的 MySQL 数据库居然被勒索软件攻击了! | 树 震惊!insmtr 的 MySQL 数据库居然被勒索软件攻击了! | 树 再探阿里云 DNS 对 CloudFront 的解析情况 | 树 再探阿里云 DNS 对 CloudFront 的解析情况 | 树 为单板机配置超简单 VNC 环境 改良版 | 树 为单板机配置超简单 VNC 环境 改良版 | 树 Ubuntu 22.04 Rust OpenCV 注意事项 | 树 Redmi AX6000 hanwckf U-Boot 安装 OpenWrt 24 | 树 为单板机配置超简单 VNC 环境 | 树 Ubuntu 22.04 Rust OpenCV 注意事项 | 树 Redmi AX6000 hanwckf U-Boot 安装 OpenWrt 24 | 树 为单板机配置超简单 VNC 环境 | 树 在 WSL 中使用 ISE | 树 在 WSL 中使用 ISE | 树 Jetson AGX Orin CH340 驱动安装 | 树 Jetson AGX Orin CH340 驱动安装 | 树 在 Ubuntu 22.04 上运行 PX4-Autopilot 1.13 | 树 在 Ubuntu 22.04 上运行 PX4-Autopilot 1.13 | 树 在 Thunderbird 里使用沉浸式翻译插件 | 树 在 Thunderbird 里使用沉浸式翻译插件 | 树 搭建自定义域名邮箱 | 树 - 洞 搭建自定义域名邮箱 | 树 - 洞 再见,曾经热爱的算法竞赛 | 树 - 洞 再见,曾经热爱的算法竞赛 | 树 - 洞
Android Box for root 透明代理 | 树
insmtr · 2024-12-17 · via 树 - 洞
⚠️ 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 的实现中, inboundstun 中可以不写

"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 也是双刃剑,一定要谨防那些恶意模块。在自己理解原理的基础上做进一步深入。