Mobile/Ethernet/Wi-Fi不能同时存在。
但是,linux是可以同时支持多网卡存在的。
- 去掉Android Framework中只允许一个网卡存在的逻辑
可以通过修改网卡的优先级,再加上把AndroidFW中关掉低优先级的网卡的代码注释掉来实现。当前还有其他方法来实现,比如让AndroidFW不监听linux的指定种类的网卡事件,也可以避免AndroidFW关闭该种类的网卡。
- 为AndroidFramework没有支持的另外的网卡,配置路由规则(ip rule/ ip route)
/data/misc/net/rt-tables
Linux是在内核2.1开始采用策略性路由机制的
输入ip rule可以看到当前的策略
romulus@romulus-VirtualBox:~/super_repo/super-repo$ ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
ip rule的第一列为路由策略的优先级,0为最小,32767最大。所以,图示的最有效的策略为第一条,内容大概是,从所有ip的网络访问,都去main路由表里面去找路由。
英文版,来自main ip-rule
Priority: 0, Selector: match anything, Action: lookup routing table local
(ID 255). The local table is a special routing table containing high
priority control routes for local and broadcast addresses.
Rule 0 is special. It cannot be deleted or overridden.
Android, 在/data/misc/net/rt-tables里面,可以android route表number和name对应关系。
Ubuntu, 在/etc/iproute2/rt_tables中可以看到对应的关系。
romulus@romulus-VirtualBox:~/super_repo/super-repo$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
我们看到系统启动以后,默认有3张路由表,local/main/default, 分别的number为255/254/253
表255 本地路由表(Local table) 本地接口地址,广播地址,已及NAT地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。
表254 主路由表(Main table) 如果没有指明路由所属的表,所有的路由都默认都放在这个表里,一般来说,旧的路由工具(如route)所添加的路由都会加到这个表。一般是普通的路由。
The main table is the normal routing table containing all
non-policy routes. This rule may be deleted and/or overridden with other
ones by the administrator.
表253 默认路由表 (Default table) 一般来说默认的路由都放在这张表,但是如果特别指明放的也可以是所有的网关路由。The default table is empty(这句话是从man ip-rule找到的)
查看指定route表的命令(可以确认,254号表名为main, 输出内容一样)
romulus@romulus-VirtualBox:~/super_repo/super-repo$ ip route list table 254
default via 192.168.0.1 dev enp0s3 proto static metric 100
169.254.0.0/16 dev enp0s3 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.105 metric 100
romulus@romulus-VirtualBox:~/super_repo/super-repo$
romulus@romulus-VirtualBox:~/super_repo/super-repo$
romulus@romulus-VirtualBox:~/super_repo/super-repo$ ip route list table main
default via 192.168.0.1 dev enp0s3 proto static metric 100
169.254.0.0/16 dev enp0s3 scope link metric 1000
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.105 metric 100
linux网络数据传输时,选择路由的步骤分为两步:
第一步,通过ip rule选择路由表;第二步,在路由表中,选择合适的路由项来作为自己的路由。
因此,配置多网卡路由也有两种方法,分别是通过ip rule和ip route
- ip rule
ip route add to 192.168.2.0/24 table main // 来自 192.168.2.0的数据包,使用 main 路由表中的路由规则
- ip route
ip route add 192.168.43.0/24 dev wlan0 proto static scope link table eth0 // 多网卡,如果当前Android framework的网络是eth0,那么使用的路由表是Ethernet的路由表,Wi-Fi网卡为Android Framework没有识别的另外一个网卡。因此,将发往Wi-Fi网卡的路由规则,加入到名为eth0的路由表中。
如何查看此时的Wi-Fi网卡的路由规则
ip route list table main
192.168.43.0/24 dev wlan0 proto kernel scope link src 192.168.43.3
注:
通过ifconfig eth0 192.168.1.100会将eth0相关的路由项加入main路由表中。但是,默认情况下,系统没有路由策略来使用main路由表。所以,需要添加路由策略来使用mian路由表,或者将该路由项加入其他正在被使用的路由表中。
Android FW会为正在使用的网卡,添加对应的路由策略,可以在netd的代码中查看到相应的逻辑。