复制成功
请遵守本站 许可

在Android设备上以系统级运行Clash

1485 字
7 分钟
Chongxi
Chongxi Author
2025-08-26 08:00:00

免责声明#

caution

本文内容仅限技术研究学习目的,旨在帮助开发者等深入了解网络代理,流量路由等运作机制。任何不当使用造成的后果均与本文作者无关。严禁用于商业用途。

您必须确保所有操作均遵守您所在国家 / 地区的法律法规。本文坚决反对并谴责任何使用网络代理技术绕过正当网络管控、访问非法内容或从事任何非法活动的行为。

本文涉及到的操作需要修改 Android 系统底层,具有潜在风险(如设备变砖,数据丢失,系统不稳定等)。所有操作均基于您自愿选择并自行承担全部风险。本文作者不对任何因遵循本文步骤导致的设备问题或法律纠纷负责。

本文面向具备足够知识背景和风险认知的用户,尝试前请确保您已了解关于 root 等基本概念。如果您不知道您在做什么,请自觉停止操作。

INTRO#

在开始之前,我们简单对比一下常规代理与box4magiskCHIZI-0618/box4magisk

CLASH FOR ANDROID#

以最常见的Clash for Android为例,他通常通过调用 Android 系统提供的VPN Service API工作。

当您在 CFA(Clash For Android)中启动代理时,应用会向系统申请创建一个虚拟 VPN 接口,此时会要求用户授权。随后 Android 会将设备上几乎所有应用程序的流量都重定向到此接口。

CFA 本质上其实是个壳,用于更方便与用户交互,本质其实是 Clash 核心在处理流量。

Clash 内核会根据您配置的规则来检查所有经过的流量,根据规则匹配结果,决定该流量走向。

BOX4MAGISK#

box4magisk借助 magisk/kernelSU/APatch 将 clash 部署在data/adb/,使其深度集成在 Android 系统的网络栈,实现了更高权限的流量接管。

由于他不依赖VPN Service API,因此完全不占用 VPN 槽位,通过透明代理,使其能绕过大多数检测。

PRINCIPLE#

TRANSPARENT PROXY#

Transparent Proxy,也就是透明代理。简单来讲,就是让应用程序无法检测其存在,让应用认为他在直接连接互联网。其劫持实现主要如下

TUN#

TUN设备是软件实现的虚拟网络设备。他不像eth0wlan0那样是真实的硬件。他就像一个虚拟的网线接口,一端插在系统的网络栈,一端插在 Clash 核心。

其工作原理主要为:

系统根据iptables规则,把所有需要被代理的网络流量发送到TUN设备。Clash 内核则从另一端读取这些原始数据包进行处理,随后经过TUN回到系统内核,并出口到目的地。

TUN 设备在网络层工作,处理IP 数据包使其能够接管所有基于 IP 的流量。

TUN2SOCKS#

众所周知,Clash 一般监听在 SOCKS5/HTTP 端口,守听的是预期符合代理协议的数据。但 TUN 里给出的数据则是原始网络数据包,压根不是一回事。

TUN2SOCKS作为其中的桥梁,达到了翻译的效果。他负责读取 TUN 来的原始数据包,以客户端身份将其打包为标准的 SOCKS5 协议格式,并将其发送给 Clash 内核,这样 Clash 就可以正常处理这些流量了。

  • 对于 Clash 来说,它只是为叫做tun2socks的本地客户的提供代理服务,并不知道其接管的流量来自系统全局。
  • 对于应用程序来说,它以为自己是直接连接到互联网,并不知道自己的流量被 TUN 劫持并转译。

IPTABLES#

系统流量默认可不会自己跑进 TUN,在 Box4magisk 中,使用到了iptables让流量走向 TUN。

我们先来了解下iptables,这是 Linux 系统内置的数据包过滤和操作工具,不过在这里,他的核心作用不是防火墙,而是对流量进行路由。

Box4magisk 在启动时,会添加一系列规则达到REDIRECTTProxy到 TUN 设备的目的。

接下来我们会举一个例子,来更好理解他们协同工作时的流量走向#

  1. app 试图连接xice.cx:443
  2. iptables立即截获此 TCP 请求,根据规则,将流量引至 TUN 设备
  3. TUN 会将流量引至tun0
  4. tun2socks会从tun0中读取到这个原始 TCP 请求,并将其打包为SOCKS5协议的CONNET blog.chongxo.us 443发给 localhost 的 Clash 端口。
  5. Clash 接收到该请求后,根据代理规则进行出口。

从远程服务器返回的数据则会以以上方式反向走一遍。

PREREQUISITES#

  • 一台已获取 Root 权限的 Android 设备
  • 获取 Magisk 模块文件

这里我们使用Surfing作为演示,这是 fork 自box4magisk的项目,有集成式一体服务、即刷即用的特色。

您也可以选择原始的box4magisk进行配置,后续 Chongxi 会考虑写关于这个的 blog。

GitMetaio/Surfing

LET’S GO#

  • 在 Magisk 安装 Surfing,此时您无重启设备的必要。
  • /data/adb/box_bll/clash/config.yaml中,您可以添加您的远程代理配置 URL20250826-1.jpg 您也可以根据里面的注释自行修改配置,修改后重启您的设备。
  • 打开您的浏览器,输入http://127.0.0.1:9090/ui/#/即可打开 WebUI 控制台,在这里您可以详细设置您的 Surfing。 20250826-2.jpg
  • 关于启停 关闭 Magisk 模块后即可停止。

Surfing 的部署到此完毕。

CONCLUSION#

至此,我们通过 Box4Magisk 模块,我们超越了普通应用的限制,将 Clash 深植于系统底层,实现了真正全局、无感的网络代理。

同时,我们也深入理解了其背后的工作原理,让「魔法」变成了可控的「技术」。

center large

这里是 Chongxi,期待与您的下一次见面

Thanks For Watching.

在Android设备上以系统级运行Clash

作者: Chongxi
发布于: 2025-08-26
许可协议: CC BY-NC-SA 4.0
分享博文信息 (Copy All)
Contents