1340 字
7 分钟
安卓容器路由策略分析

概述#

安卓容器内的路由策略如下所示。

Terminal window
ip rule
0: from all lookup local
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
11000: from all iif lo oif rmnet0 uidrange 0-0 lookup rmnet0
11000: from all iif lo oif wlan0 uidrange 0-0 lookup wlan0
16000: from all fwmark 0x10063/0x1ffff iif lo lookup local_network
16000: from all fwmark 0x10064/0x1ffff iif lo lookup rmnet0
16000: from all fwmark 0x10068/0x1ffff iif lo lookup wlan0
17000: from all iif lo oif rmnet0 lookup rmnet0
17000: from all iif lo oif wlan0 lookup wlan0
18000: from all fwmark 0x0/0x10000 lookup legacy_system
19000: from all fwmark 0x0/0x10000 lookup legacy_network
20000: from all fwmark 0x0/0x10000 lookup local_network
23000: from all fwmark 0x64/0x1ffff iif lo lookup rmnet0
23000: from all fwmark 0x68/0x1ffff iif lo lookup wlan0
31000: from all fwmark 0x0/0xffff iif lo lookup wlan0
31999: from all lookup main
32000: from all unreachable

​​ 规则优先级和结构说明 ​​#

  • 规则按优先级(数值升序)排列,数值 ​​ 越小优先级越高 ​
  • 关键字段解析:
    • lookup [表名]:指定使用的路由表
    • fwmark [值/掩码]:匹配防火墙标记
    • iif:输入接口(lo表示本地生成的流量)
    • oif:输出接口
    • uidrange:用户 ID 范围

逐条分析ip rule策略#

​​1. 最高优先级规则(本地流量)​​#

0: from all lookup local
  • ​ 作用 ​​:所有流量 ​​ 优先查询 local 路由表 ​
  • ​ 说明 ​​:处理本地广播、回环等特殊地址,优先级最高(数值 0)

​2. 系统关键流量(优先级 10000)​​#

10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
  • ​ 匹配 ​​:标记为 0xc0000(掩码 0xd0000)的流量
  • ​ 目的 ​​:系统核心进程流量(如系统服务),强制走 legacy_system

​​3. ROOT 用户接口绑定(优先级 11000)​​#

11000: from all iif lo oif rmnet0 uidrange 0-0 lookup rmnet0
11000: from all iif lo oif wlan0 uidrange 0-0 lookup wlan0
  • ​ 场景 ​​:​​ROOT 用户 ​​(UID 0)的流量
  • ​ 强制绑定 ​​:
    • 目标接口是 rmnet0 → 查 rmnet0
    • 目标接口是 wlan0 → 查 wlan0
  • ​ 意义 ​​:确保系统进程流量严格绑定指定接口

​4. 标记流量的接口绑定(优先级 16000)​​#

16000: from all fwmark 0x10063/0x1ffff iif lo lookup local_network
16000: from all fwmark 0x10064/0x1ffff iif lo lookup rmnet0
16000: from all fwmark 0x10068/0x1ffff iif lo lookup wlan0
  • ​ 匹配 ​​:带标记的 ​​ 本地生成流量 ​​(iif lo
  • ​ 策略 ​​:
    • 标记 0x10063 → 走 local_network 表(本地网络)
    • 标记 0x10064 → 走 rmnet0 表(4G)
    • 标记 0x10068 → 走 wlan0 表(Wi-Fi)
  • ​ 用途 ​​:VPN、分应用代理等场景

​​5. 接口绑定的兜底规则(优先级 17000)​​#

17000: from all iif lo oif rmnet0 lookup rmnet0
17000: from all iif lo oif wlan0 lookup wlan0
  • ​ 匹配 ​​:​​ 非 ROOT 用户 ​​ 但明确指定输出接口的流量
  • ​ 策略 ​​:
    • 目标接口是 rmnet0 → 查 rmnet0
    • 目标接口是 wlan0 → 查 wlan0
  • ​ 意义 ​​:普通应用通过接口绑定的兜底策略

​​6. 传统系统/网络流量(优先级 18000-20000)​​#

18000: from all fwmark 0x0/0x10000 lookup legacy_system
19000: from all fwmark 0x0/0x10000 lookup legacy_network
20000: from all fwmark 0x0/0x10000 lookup local_network
  • ​ 匹配 ​​:​​ 未标记或特定标记 ​​ 的流量(掩码 0x10000 匹配低 16 位)
  • ​ 策略 ​​:
    • 优先走 legacy_system(系统服务)
    • 其次 legacy_network(传统网络)
    • 最后 local_network(本地网络)
  • ​ 用途 ​​:兼容旧版安卓网络栈

​​7. 精确标记绑定(优先级 23000)​​#

23000: from all fwmark 0x64/0x1ffff iif lo lookup rmnet0
23000: from all fwmark 0x68/0x1ffff iif lo lookup wlan0
  • ​ 匹配 ​​:精确标记值(掩码 0x1ffff = 17 位)
  • ​ 策略 ​​:
    • 标记 0x64 → 强制走 rmnet0 (4G)
    • 标记 0x68 → 强制走 wlan0 (Wi-Fi)
  • ​ 重要性 ​​:​​ 这是实现 UID 分流的关键入口!​
    • 后续可在此优先级添加自定义规则

​​8. 默认流量走向(关键优先级 31000)​​#

31000: from all fwmark 0x0/0xffff iif lo lookup wlan0
  • ​ 匹配 ​​:​​ 所有未标记的本地流量 ​​(掩码 0xffff 匹配低 16 位)
  • ​ 动作 ​​:查 wlan0 路由表
  • ​ 意义 ​​:​​ 这是 Wi-Fi 优先的根本原因!​
    • 无标记流量默认走 wlan0,除非更高优先级规则覆盖

​9. 主路由表兜底(优先级 31999)​​#

31999: from all lookup main
  • ​ 作用 ​​:未匹配前述规则的流量查 main 路由表
  • ​ 说明 ​​:
    • 可能包含 4G 默认路由(如您的 default via 172.16.2.1 dev rmnet0
    • 但实际被更高优先级的 31000 规则覆盖(Wi-Fi 优先)

​​10. 终极拦截(优先级 32000)​​#

32000: from all unreachable
  • ​ 作用 ​​:所有未匹配流量返回 ​Network Unreachable
  • ​ 意义 ​​:防止路由泄露的兜底策略

关键结论:为什么默认走 Wi-Fi#

  1. ​ 核心规则 ​31000 将所有 ​​ 未标记本地流量 ​​ 导向 wlan0
  2. 更高优先级规则(如 23000)可覆盖此行为
  3. 4G 的默认路由(在 main 表)优先级为 31999,低于 31000,故无标记流量永远不会使用它

✅ 实现 UID 走 rmnet0 的方案#

步骤(需要 root 权限):#

  1. ​ 给 UID 打标记 ​

    iptables -t mangle -A OUTPUT -m owner --uid-owner APP_UID -j MARK --set-mark 0x64
    • 替换 APP_UID 为目标应用 UID(如微信:u0_a123
    • 使用标记 0x64(已被系统预定义为 rmnet0)
  2. ​ 确保标记生效 ​​(绕过冲突规则)

    iptables -t mangle -A OUTPUT -m mark --mark 0x64 -j ACCEPT
  3. ​ 验证路由规则 ​​(无需新增规则!)
    系统已有预定义:

    23000: from all fwmark 0x64/0x1ffff iif lo lookup rmnet0
    • 标记 0x64 的流量自动查 rmnet0
  4. ​ 确认 rmnet0 表有默认路由 ​

    ip route show table rmnet0
    • 若无默认路由,需添加:
      ip route add default via 172.16.2.1 dev rmnet0 table rmnet0

⚠️ 注意事项#

  1. ​ 标记值冲突 ​​:避免使用 0x68(Wi-Fi)、0x63(本地网络)

  2. ​ 持久化 ​​:脚本需在每次重启后执行(推荐用 Magisk 模块)

  3. ​DNS 分流 ​​:如有问题,额外处理 DNS:

    iptables -t mangle -A OUTPUT -p udp --dport 53 -m owner --uid-owner APP_UID -j MARK --set-mark 0x64