1340 字
7 分钟
安卓容器路由策略分析
概述
安卓容器内的路由策略如下所示。
ip rule0: from all lookup local10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system11000: from all iif lo oif rmnet0 uidrange 0-0 lookup rmnet011000: from all iif lo oif wlan0 uidrange 0-0 lookup wlan016000: from all fwmark 0x10063/0x1ffff iif lo lookup local_network16000: from all fwmark 0x10064/0x1ffff iif lo lookup rmnet016000: from all fwmark 0x10068/0x1ffff iif lo lookup wlan017000: from all iif lo oif rmnet0 lookup rmnet017000: from all iif lo oif wlan0 lookup wlan018000: from all fwmark 0x0/0x10000 lookup legacy_system19000: from all fwmark 0x0/0x10000 lookup legacy_network20000: from all fwmark 0x0/0x10000 lookup local_network23000: from all fwmark 0x64/0x1ffff iif lo lookup rmnet023000: from all fwmark 0x68/0x1ffff iif lo lookup wlan031000: from all fwmark 0x0/0xffff iif lo lookup wlan031999: from all lookup main32000: 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 rmnet011000: 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_network16000: from all fwmark 0x10064/0x1ffff iif lo lookup rmnet016000: 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 rmnet017000: from all iif lo oif wlan0 lookup wlan0- 匹配 : 非 ROOT 用户 但明确指定输出接口的流量
- 策略 :
- 目标接口是
rmnet0→ 查rmnet0表 - 目标接口是
wlan0→ 查wlan0表
- 目标接口是
- 意义 :普通应用通过接口绑定的兜底策略
6. 传统系统/网络流量(优先级 18000-20000)
18000: from all fwmark 0x0/0x10000 lookup legacy_system19000: from all fwmark 0x0/0x10000 lookup legacy_network20000: 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 rmnet023000: 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 优先)
- 可能包含 4G 默认路由(如您的
10. 终极拦截(优先级 32000)
32000: from all unreachable- 作用 :所有未匹配流量返回
Network Unreachable - 意义 :防止路由泄露的兜底策略
关键结论:为什么默认走 Wi-Fi
- 核心规则
31000将所有 未标记本地流量 导向wlan0表 - 更高优先级规则(如
23000)可覆盖此行为 - 4G 的默认路由(在
main表)优先级为31999,低于31000,故无标记流量永远不会使用它
✅ 实现 UID 走 rmnet0 的方案
步骤(需要 root 权限):
-
给 UID 打标记
iptables -t mangle -A OUTPUT -m owner --uid-owner APP_UID -j MARK --set-mark 0x64- 替换
APP_UID为目标应用 UID(如微信:u0_a123) - 使用标记
0x64(已被系统预定义为 rmnet0)
- 替换
-
确保标记生效 (绕过冲突规则)
iptables -t mangle -A OUTPUT -m mark --mark 0x64 -j ACCEPT -
验证路由规则 (无需新增规则!)
系统已有预定义:23000: from all fwmark 0x64/0x1ffff iif lo lookup rmnet0- 标记
0x64的流量自动查rmnet0表
- 标记
-
确认 rmnet0 表有默认路由
ip route show table rmnet0- 若无默认路由,需添加:
ip route add default via 172.16.2.1 dev rmnet0 table rmnet0
- 若无默认路由,需添加:
⚠️ 注意事项
-
标记值冲突 :避免使用
0x68(Wi-Fi)、0x63(本地网络) -
持久化 :脚本需在每次重启后执行(推荐用 Magisk 模块)
-
DNS 分流 :如有问题,额外处理 DNS:
iptables -t mangle -A OUTPUT -p udp --dport 53 -m owner --uid-owner APP_UID -j MARK --set-mark 0x64