V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
airbotgo
V2EX  ›  问与答

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

  •  
  •   airbotgo · 2023-07-20 08:07:55 +08:00 · 4431 次点击
    这是一个创建于 500 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Android 系统
    有 A 、B 两个节点,流量默认走节点 A ,某应用 x 单独走节点 B 。

    这种分流可以实现吗?什么工具能够做到?
    注:应用 x 的连接由不同的域名组成,可能经常变动。
    17 条回复    2023-09-07 01:15:43 +08:00
    yfugibr
        1
    yfugibr  
       2023-07-20 08:17:11 +08:00
    https://github.com/MatsuriDayo/NekoBoxForAndroid

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

    airbotgo
        10
    airbotgo  
    OP
       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
        11
    x77  
       2023-07-20 11:52:54 +08:00
    @airbotgo

    VPN 的机制是这样,如果在底层流量附加更多的信息可能需要操作系统支持,操作系统没有支持的话就很比较难,任何客户端做这个事情都一样的。
    ysc3839
        12
    ysc3839  
       2023-07-20 12:10:26 +08:00 via Android
    @x77 Linux 应该是可以用 tun packet 信息查到对应程序的,没记错的话 clash tun 也能正常使用 process name 规则。
    主要问题是 Android 给不给使用上述 Linux 接口,不给的话大概只能 root 实现了。
    rebecca554owen
        13
    rebecca554owen  
       2023-07-22 07:24:59 +08:00 via Android
    开两个 clash ,clash3.0.3 只开启 http 与 socks5 ,给 tg 连接 A 节点使用,clash META 开启 VPN ,给其他 APP 使用。
    haohaolee
        14
    haohaolee  
       2023-07-22 19:02:11 +08:00 via Android
    @x77 其实不然。Android 和 Linux 不一样,Android 每个应用都是不同的 user ,这样的话用 iptables 就可以做到区分不同应用了。实际上,很早 Android 就有按照不同应用进行流量统计的功能了。
    我猜想 VPN Service 本身对此也有支持
    x77
        15
    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
        16
    shulin  
       2023-07-23 15:00:51 +08:00 via Android
    A 和 B 都需要具备公网 ip 并部署 socks5 代理协议的情况下可以使用这个软件实现 https://play.google.com/store/apps/details?id=com.lazybean.vpnperapp
    Kobayashi
        17
    Kobayashi  
       2023-09-07 01:15:43 +08:00 via Android
    @airbotgo 不是配置里 process-name 写应用包名就行了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 03:54 · PVG 11:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.