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.xxx
, eth0
网段:192.168.1.xxx
)
由于我没有改ROM代码,所以这里要手动up
起来eth0
,如下命令:
busybox ifconfig eth0 192.168.1.110 up
这样就启动了以太网。接下来就ping
一下试试:
接下来就是重头戏了,之前一直没有接触过的,多张路由表以及策略。运行这个命令,可以添加到路由表中了:
ip route add 192.168.1.0/24 dev eth0 proto static scope link table wlan0
这样就可以ping通了,不需要加-I
指定网卡了。
白名单
假定:wlan0
网段:192.168.43.xxx
, eth0
网段:192.168.1.xxx
,所有其他ip均走wlan0
,但是其中一个ip(比如:128.32.22.0)走eth0。那么就需要用到白名单,需要再添加一个:
待续