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

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

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

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

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

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

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

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

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

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

    但是 IP 层网络又没有规范要求数据包标上进程 ID ,这个需求就变成标准之外的设计,如果这么用 VPN 接口(本地客户端拿流量,而非标准连远端服务器)的需求旺盛,操作系统估计可能支持一下,我觉得可以看看 Google Android 的未来计划,VPN 客户端自己没必要折腾分流,感觉设计不太合理。
    shulin
        16
    shulin  
       280 天前 via Android
    A 和 B 都需要具备公网 ip 并部署 socks5 代理协议的情况下可以使用这个软件实现 https://play.google.com/store/apps/details?id=com.lazybean.vpnperapp
    Kobayashi
        17
    Kobayashi  
       234 天前 via Android
    @airbotgo 不是配置里 process-name 写应用包名就行了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1917 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.