Android 系统如何按应用进行分流?

2023-07-20 08:07:55 +08:00
 airbotgo
Android 系统
有 A 、B 两个节点,流量默认走节点 A ,某应用 x 单独走节点 B 。

这种分流可以实现吗?什么工具能够做到?
注:应用 x 的连接由不同的域名组成,可能经常变动。
4577 次点击
所在节点    问与答
17 条回复
yfugibr
2023-07-20 08:17:11 +08:00
https://github.com/MatsuriDayo/NekoBoxForAndroid

clash 的 process-name 规则也可以试试,不确定有没有用
vcn8yjOogEL
2023-07-20 08:20:54 +08:00
用工作资料可以同时运行两个 VPN
Goooooos
2023-07-20 09:13:29 +08:00
@yfugibr NB4A 应该是目前 android 可定制性较高的了,路由规则可以指定应用,同时也可以指定使用哪个代理
CFA 不支持 mixin ,v2rayNG 只能支持一个 outboundtag
airbotgo
2023-07-20 09:19:24 +08:00
@yfugibr
@Goooooos
NekoBoxForAndroid 在稳定性、流畅性上表现如何?我看支持的协议还算比较全,但用的人不多啊?
Goooooos
2023-07-20 09:23:09 +08:00
开启日志有机会导致缓存暴增,进程卡死。清下缓存就好,目前最新版暂时没遇到。
其他问题暂时没发现
yfugibr
2023-07-20 09:25:28 +08:00
@airbotgo #4 你可以试试,大部分人还是倾向于小白式配置的 clash
Goooooos
2023-07-20 10:51:49 +08:00
目前用法:
1. 192.168.0.0/16 路由到家里的 wireguard 代理
2. 指定应用使用特定的代理,例如一些 H 漫 APP 屏蔽了日本 IP
3. 部分机场使用链式代理,落地代理配置为 warp 增加安全性,当然也增加了延迟
x77
2023-07-20 11:23:35 +08:00
比较难实现,难点在于不好区分流量来自哪个应用。

虽然可以只让 A 、B 走 VPN ,但是 VPN 客户端拿到的数据是 A 和 B 的混合在一起的流量,而且,VPN 客户端拿到的 IP 层数据是不带应用信息。对于客户端来说,没有信息来区分流量是 A 的还是 B 的,也就没法给 A 和 B 设置不同的网路节点(走一样的节点很容易)。

最简单的办法是跑两个 VPN 客户端,但是 Android 系统只允一个 VPN 在运行。其次可以一次只接管一个应用,也就是一次只控制 A 或 B 其中一个的网路,但是不能同时控制两个的。再次就是最难的方案,从 IP 层流量中找到能够区分 A 或 B 的特征数据,进行区分。
airbotgo
2023-07-20 11:40:29 +08:00
@Goooooos 我看了下这个项目的介绍页面,作者留下了微信、支付宝的打赏信息。
这不相当于实名的翻墙工具吗?
不敢尝试。

airbotgo
2023-07-20 11:48:30 +08:00
@x77 目前 Clash for Android 提供了一个功能,可以设置某些 app 走或者不走翻墙流量,但是目前设置走某个具体的节点。
可能在实现上确实有难度,所以没有提供。我翻到上游 Clash 项目作者 Dreamacro 回答过这个问题:
https://github.com/Dreamacro/clash/issues/376
https://github.com/Dreamacro/clash/issues/171
x77
2023-07-20 11:52:54 +08:00
@airbotgo

VPN 的机制是这样,如果在底层流量附加更多的信息可能需要操作系统支持,操作系统没有支持的话就很比较难,任何客户端做这个事情都一样的。
ysc3839
2023-07-20 12:10:26 +08:00
@x77 Linux 应该是可以用 tun packet 信息查到对应程序的,没记错的话 clash tun 也能正常使用 process name 规则。
主要问题是 Android 给不给使用上述 Linux 接口,不给的话大概只能 root 实现了。
rebecca554owen
2023-07-22 07:24:59 +08:00
开两个 clash ,clash3.0.3 只开启 http 与 socks5 ,给 tg 连接 A 节点使用,clash META 开启 VPN ,给其他 APP 使用。
haohaolee
2023-07-22 19:02:11 +08:00
@x77 其实不然。Android 和 Linux 不一样,Android 每个应用都是不同的 user ,这样的话用 iptables 就可以做到区分不同应用了。实际上,很早 Android 就有按照不同应用进行流量统计的功能了。
我猜想 VPN Service 本身对此也有支持
x77
2023-07-22 20:45:56 +08:00
@haohaolee
- 系统才有,给到应用层的接口( VpnService )没有,VpnService 只能选择(劫持或不劫持,两种模式二选一)哪些应用。
- iptable 的思路也可以排除,因为 Android VPN 独立路由,没法按应用设置路由。另外,Android 应用没权限改路由表。
- root ,如果用户接受则是个方案,那就走 linux 的方式去搞了。

其实搞 VPN 按应用分流最适合的就是系统支持,客户端去做这个事情成本很高,主要是没有系统没有给应用层提供用来分流的信息。而系统层轻轻松松就可以实现,系统层的信息是完整的,它知道数据包是那个进程发出来的。

但是 IP 层网络又没有规范要求数据包标上进程 ID ,这个需求就变成标准之外的设计,如果这么用 VPN 接口(本地客户端拿流量,而非标准连远端服务器)的需求旺盛,操作系统估计可能支持一下,我觉得可以看看 Google Android 的未来计划,VPN 客户端自己没必要折腾分流,感觉设计不太合理。
shulin
2023-07-23 15:00:51 +08:00
A 和 B 都需要具备公网 ip 并部署 socks5 代理协议的情况下可以使用这个软件实现 https://play.google.com/store/apps/details?id=com.lazybean.vpnperapp
Kobayashi
2023-09-07 01:15:43 +08:00
@airbotgo 不是配置里 process-name 写应用包名就行了吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/958159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX