- Android默認只支持一個網卡。
Mobile/Ethernet/Wi-Fi不能同時存在。
但是,linux是可以同時支持多網卡存在的。
- 如何在Android上實現多網卡
- 去掉Android Framework中只允許一個網卡存在的邏輯
可以通過修改網卡的優先級,再加上把AndroidFW中關掉低優先級的網卡的代碼註釋掉來實現。當前還有其他方法來實現,比如讓AndroidFW不監聽linux的指定種類的網卡事件,也可以避免AndroidFW關閉該種類的網卡。
- 爲AndroidFramework沒有支持的另外的網卡,配置路由規則(ip rule/ ip route)
- 路由規則簡介
-
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