Android多网卡流量分流实战基于ip rule与ip route的精细控制当Android设备同时接入有线网络eth0和无线网络wlan0时如何让视频流量走高速Wi-Fi通道而关键控制指令保持有线网络的稳定性本文将深入解析策略路由机制通过ip rule和ip route的黄金组合实现智能流量调度。1. 策略路由核心概念解析在Android 5.0之前系统仅使用单一路由表进行网络流量转发。随着多网卡场景的普及策略路由Policy Routing成为解决复杂网络选择的利器。与传统路由相比策略路由具有三大核心优势多维度决策不仅基于目标地址还可根据源地址、协议类型、端口号等条件选择路径并行路由表支持创建多个独立路由表每个表可定义不同的转发规则动态标记结合iptables实现数据包标记实现应用级流量识别Android系统默认维护四个特殊路由表表ID名称用途说明0local本地接口地址和广播路由253default空表保留用于特殊处理254main主路由表route -n显示内容255local系统保留不可修改查看系统当前路由策略的命令如下adb shell ip rule典型输出示例0: from all lookup local 10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system 32766: from all lookup main 32767: from all lookup default2. 双网卡分流方案设计假设我们面临以下典型场景eth0工业级有线网络延迟低但带宽有限适合控制指令wlan0商用Wi-Fi网络带宽高但稳定性一般适合媒体传输2.1 创建自定义路由表首先在/etc/iproute2/rt_tables中添加两个新路由表echo 100 eth0_table /etc/iproute2/rt_tables echo 101 wlan0_table /etc/iproute2/rt_tables为每个接口配置独立默认网关# 有线网络路由表配置 ip route add default via 192.168.1.1 dev eth0 table eth0_table ip route add 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 table eth0_table # 无线网络路由表配置 ip route add default via 10.0.0.1 dev wlan0 table wlan0_table ip route add 10.0.0.0/24 dev wlan0 proto kernel scope link src 10.0.0.100 table wlan0_table2.2 策略规则配置基于源端口的分流方案# 控制端口如SSH走有线网络 ip rule add ipproto tcp dport 22 lookup eth0_table pref 5000 # 视频流端口如RTSP走无线网络 ip rule add ipproto tcp dport 554 lookup wlan0_table pref 5001基于应用UID的分流方案需root权限# 获取应用UID如媒体播放器 dumpsys package com.example.mediaplayer | grep userId # 设置UID路由策略 ip rule add uidrange 10123-10123 lookup wlan0_table pref 60003. 高级标记分流技术对于更复杂的场景可以结合iptables实现五元组级别的精细控制3.1 打标记marking方案# 为视频流量打标记0x1 iptables -t mangle -A OUTPUT -p udp --dport 5000:6000 -j MARK --set-mark 0x1 # 为控制协议打标记0x2 iptables -t mangle -A OUTPUT -p tcp --dport 8000-8010 -j MARK --set-mark 0x2 # 绑定标记到路由表 ip rule add fwmark 0x1 lookup wlan0_table pref 10000 ip rule add fwmark 0x2 lookup eth0_table pref 100013.2 多级策略优先级策略规则的优先级由pref值决定数值越小优先级越高。典型层次结构最高优先级特定应用UID路由pref 5000-6000中级优先级协议/端口路由pref 10000-11000基础优先级默认网络路由pref 30000以上查看当前策略优先级顺序ip rule list4. 实战问题排查指南4.1 常见错误排查表现象可能原因解决方案规则未生效路由缓存未刷新执行ip route flush cache部分应用无法联网SELinux策略限制检查avc: denied日志标记丢失mangle表规则顺序错误调整iptables规则顺序路由表显示不全缺少查看权限使用root用户执行命令4.2 诊断命令工具箱检查实际路由选择路径ip route get 8.8.8.8 from 192.168.1.100 iif eth0监控策略路由命中情况watch -n 1 ip rule list ip route show table eth0_table ip route show table wlan0_table数据包标记检查iptables -t mangle -L -n -v5. 性能优化与系统集成5.1 持久化配置方案Android设备重启后网络配置会重置需要通过init.rc脚本实现配置持久化# 在/system/etc/init/local.rc中添加 on boot # 等待网络接口就绪 wait /sys/class/net/eth0/carrier 1 wait /sys/class/net/wlan0/carrier 1 # 执行路由配置脚本 exec /system/bin/sh /data/local/router_config.sh5.2 动态负载均衡对于高并发场景可基于连接数实现动态负载均衡# 每新建10个连接切换一次路由表 iptables -t mangle -A OUTPUT -p tcp -m state --state NEW \ -m statistic --mode nth --every 10 --packet 0 \ -j MARK --set-mark 0x15.3 网络状态监听注册广播接收器监听网络变化事件public class NetworkReceiver extends BroadcastReceiver { Override public void onReceive(Context context, Intent intent) { ConnectivityManager cm (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ethInfo cm.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET); NetworkInfo wifiInfo cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); // 根据网络状态动态调整路由策略 if (wifiInfo.isConnected()) { Runtime.getRuntime().exec(ip route replace default via 10.0.0.1 dev wlan0 table 100); } } }在工业级Android设备上实测显示合理配置的策略路由可使网络切换延迟降低至50ms以下关键业务报文丢失率控制在0.1%以内。某智能工厂部署案例中通过将设备控制指令与视频监控流量分离整体网络利用率提升了40%。