Android网络调试实战:用ip rule和ip route搞定双Wi-Fi/有线并发的流量分流
Android多网络流量分流实战基于策略路由的精准控制当你的Android设备同时连接公司Wi-Fi、个人热点和有线网络时是否遇到过这些困扰自动化测试工具误走个人热点消耗流量视频会议卡顿因为错误选择了低速网络或者需要特定应用始终走最稳定的有线连接传统路由机制在这种多网络并发场景下往往力不从心而策略路由正是解决这类问题的利器。1. 理解Android多网络架构与策略路由基础现代Android设备早已突破单网络连接的局限。从Android 5.0开始系统便支持同时维护多个网络的独立路由表、DNS和网关配置。这种架构为网络分流提供了可能但也带来了新的挑战——系统如何智能地为不同流量选择最优路径策略路由Policy Routing与传统路由的关键区别在于决策维度的丰富性。它不仅考虑目标地址还能基于数据包特征源/目的IP、端口、协议类型网络接口wlan0、eth0等物理接口状态应用标识UID、GID等进程属性自定义标记通过iptables设置的fwmark在Linux内核中策略路由通过两个核心组件实现路由表系统默认包含local(255)、main(254)、default(253)和unspec(0)四张表支持用户自定义1-252编号的附加表路由规则按优先级(pref)排序的匹配规则决定数据包应查询哪张路由表# 查看系统现有路由规则 adb shell ip rule 0: from all lookup local 10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system 32000: from all unreachable2. 实战配置构建双Wi-Fi流量分流系统假设我们有一台测试设备同时连接公司内网Wi-Fiwlan0IP段192.168.1.0/24个人手机热点wlan1IP段192.168.43.0/24目标让测试工具包com.example.testapp专属走热点网络其他流量保持原路径。2.1 创建专属路由表首先为热点网络创建新路由表编号10# 添加新路由表 echo 10 custom_table /etc/iproute2/rt_tables # 配置默认网关假设热点网关为192.168.43.1 ip route add default via 192.168.43.1 dev wlan1 table 10 # 添加本地网络路由 ip route add 192.168.43.0/24 dev wlan1 scope link table 102.2 标记目标应用流量通过iptables给测试应用的出站数据打标记# 标记测试应用的出站数据假设其UID为10123 iptables -t mangle -A OUTPUT -m owner --uid-owner 10123 -j MARK --set-mark 0x1 # 可选防止标记被重置 iptables -t mangle -A POSTROUTING -o wlan1 -j CONNMARK --save-mark iptables -t mangle -A PREROUTING -i wlan1 -j CONNMARK --restore-mark2.3 绑定标记与路由表创建策略规则将标记流量导向专属路由表ip rule add fwmark 0x1 lookup 10 ip rule add from 192.168.43.0/24 lookup 10 # 刷新路由缓存 ip route flush cache2.4 验证分流效果# 查看测试应用产生的连接 adb shell su -c nsenter -t $(pidof com.example.testapp) -n netstat -tunp # 路由追踪验证路径 adb shell su -c nsenter -t $(pidof com.example.testapp) -n traceroute 8.8.8.83. 高级场景三网融合的智能路由策略当引入有线网络eth0形成三网并存时我们需要更精细的策略控制。以下是一个生产级配置示例流量类型匹配条件目标网络优先级视频会议UDP 5000-6000端口有线网络1000软件更新特定域名解析公司Wi-Fi2000SSH管理源IP为管理段保留当前路由3000默认路由无特殊标记个人热点40000实现代码片段# 创建视频会议专用表(20) ip route add default via 10.0.0.1 dev eth0 table 20 iptables -t mangle -A OUTPUT -p udp --dport 5000:6000 -j MARK --set-mark 0x20 ip rule add fwmark 0x20 lookup 20 pref 1000 # DNS策略路由 iptables -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 0x30 ip rule add fwmark 0x30 lookup main pref 20004. 疑难排查与性能优化当策略路由不生效时建议按以下流程排查规则优先级冲突检查ip rule list | sort -n路由表完整性验证ip route show table 10标记有效性测试iptables -t mangle -L -v -n网络命名空间隔离nsenter -t $PID -n ip route show常见陷阱与解决方案VPN干扰添加规则ip rule add to VPN服务器IP lookup mainIPv6泄漏禁用IPv6或同步配置ip -6 ruleDNS污染配合iptables -t nat重定向DNS查询移动网络切换监听CONNECTIVITY_CHANGE广播动态更新规则性能优化建议减少规则数量合并相似策略避免频繁刷新路由缓存对静态规则使用pref high持久化定期清理僵尸规则ip rule del pref N在实际项目中我曾遇到过一个棘手案例某金融APP在双Wi-Fi环境下总是错误选择高延迟网络。最终发现是系统默认的10063标记规则优先级过高通过以下命令解决ip rule del pref 13000 ip rule add fwmark 0x10063 lookup legacy_network pref 15000