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

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