Android多网卡

  • Android默认只支持一个网卡。

Mobile/Ethernet/Wi-Fi不能同时存在。

但是,linux是可以同时支持多网卡存在的。

  • 如何在Android上实现多网卡

-  去掉Android Framework中只允许一个网卡存在的逻辑

可以通过修改网卡的优先级,再加上把AndroidFW中关掉低优先级的网卡的代码注释掉来实现。当前还有其他方法来实现,比如让AndroidFW不监听linux的指定种类的网卡事件,也可以避免AndroidFW关闭该种类的网卡。

- 为AndroidFramework没有支持的另外的网卡,配置路由规则(ip rule/ ip route)

  • 路由规则简介
  1. android route表number和name的对应的文件路径

/data/misc/net/rt-tables

    2. ip rule

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.

3. ip route

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 

4. 为Android网卡添加路由规则

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

 

192.168.43.0/24 dev wlan0 proto kernel scope link src 192.168.43.3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章