Android WiFi 以太网同时上内外网

Android WiFi 以太网同时上内外网

其实标题也可以叫「Android 双网卡同时上内外网」,都是一样的原理。现在更多的双网卡是WiFi + 以太网,这里就以这个为标题了。都知道Android底层就是Linux,网络访问和Ubuntu没有什么大的区别。比如Ubuntu 16.04,同时连接以太网和WiFi时,两个网段就可以同时访问。这里有记录Ubuntu 16.04 双网卡 同时上内外网。但是Android需要双网卡同时访问内外网时,会有一些问题。ROM里如果默认了以太网优先级高得话,那么就没有办法走WiFi的网段;反之亦然。一共有两个问题需要改,一是在以太网和WiFi同时工作时,改Android系统源码使得优先级低的网卡也不至于被ifconfig down了;另外一个是两个网卡都是up的时候,内外网段能够同时访问;

修改网络优先级代码,保证双网卡同时up状态

不同的Android版本改动方式有所不同,我这里记录关相关的内容Android中设置Ethernet为默认网络类型。也可以参考留言对高版本的Android源码修改;
这里我就不修改,以手动方式up被系统down了的网卡;

修改路由表和策略使得双网卡同时上网

Ubuntu 16.04之所以能双网卡同时工作,在于双网卡同时连网时,系统会自动配置路由表,使用route命令能查看。其实Android上也能自动配置,使用busybox route查看到的和Ubuntu 16.04查看到的,并没有太大我差别,但是就是ping不通。这里有和我遇到同一个问题的同志Wifi + Ethernet workable at the same time on Android。ping时指定网卡也能ping通。

ping -I eth0 192.168.1.103

但是,这样就会麻烦一些,上层应用APP就得单独使用JNI调用到底层创建绑定eth0的方式来访问。这是什么原因导致了Android和Ubuntu 16.04的不同呢?路由表看似一样,其实Android中用了多张路由表,使用busybox route查看到的路由表,并没有被Android优先使用,所以会导致奇怪的现象。当然还有一个策略,路由表+策略才是Android中的网络红绿灯。这个文章有详细的介绍Android策略路由。

我用的是NanoPC-T2这个板子,默认WiFi优先级高于以太网,两个网都连接上之后,使用busybox ifconfig查看的是如下景象:(假定:wlan0网段:192.168.43.xxxeth0网段:192.168.1.xxx)
Android WiFi 以太网同时上内外网_第1张图片
由于我没有改ROM代码,所以这里要手动up起来eth0,如下命令:

busybox ifconfig eth0 192.168.1.110 up  

这样就启动了以太网。接下来就ping一下试试:
Android WiFi 以太网同时上内外网_第2张图片

接下来就是重头戏了,之前一直没有接触过的,多张路由表以及策略。运行这个命令,可以添加到路由表中了:

ip route add 192.168.1.0/24 dev eth0 proto static scope link table wlan0

这样就可以ping通了,不需要加-I指定网卡了。
Android WiFi 以太网同时上内外网_第3张图片

白名单

假定:wlan0网段:192.168.43.xxxeth0网段:192.168.1.xxx,所有其他ip均走wlan0,但是其中一个ip(比如:128.32.22.0)走eth0。那么就需要用到白名单,需要再添加一个:
待续

你可能感兴趣的:(Android WiFi 以太网同时上内外网)