Android 作業系統包含標準 Linux 網路實用程序,例如ifconfig
、 ip
和ip6tables
。這些實用程式駐留在系統映像上,並支援整個 Linux 網路堆疊的配置。在運行 Android 7.x 及更低版本的裝置上,允許供應商程式碼直接呼叫這些二進位文件,這會帶來以下問題:
- 由於網路實用程式在系統映像中更新,因此它們不提供穩定的實現。
- 網路實用程式的範圍如此廣泛,很難在保證可預測行為的同時發展系統映像。
在運行 Android 8.0 及更高版本的裝置上,供應商分區在系統分區接收更新時保持不變。為了實現這一目標,Android 8.0 提供了定義穩定的版本化介面的能力,同時也使用 SELinux 限制來將供應商和系統映像的相互依賴性保持在已知的良好集合內。
供應商可以使用平台提供的網路設定公用程式來設定 Linux 網路堆疊,但這些實用程式尚不包含 HIDL 介麵包裝器。為了定義這樣的接口,Android 8.0 包含了netutils-wrapper-1.0
工具。
Netutils 包裝器
netutils
包裝公用程式提供了不受系統分區更新影響的 Linux 網路堆疊配置的子集。 Android 8.0 包含 1.0 版包裝器,它允許您傳遞與包裝實用程式相同的參數,安裝在/system/bin
的系統分區中,如下所示:
u:object_r:system_file:s0 /system/bin/ip-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/ip6tables-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/iptables-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/ndc-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:netutils_wrapper_exec:s0 /system/bin/netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/tc-wrapper-1.0 -> netutils-wrapper-1.0
符號連結顯示由netutils
包裝器包裝的網路實用程序,其中包括:
-
ip
-
iptables
-
ip6tables
-
ndc
-
tc
要在 Android 8.0 及更高版本中使用這些實用程序,供應商實作必須遵守以下規則:
- 供應商程序不得直接執行
/system/bin/netutils-wrapper-1.0
;嘗試這樣做將會導致錯誤。 -
netutils-wrapper-1.0
包裝的所有實用程式都必須使用其符號連結啟動。例如,將先前執行此操作的供應商代碼 (/system/bin/ip <FOO> <BAR>
) 變更為/system/bin/ip-wrapper-1.0 <FOO> <BAR>
。 - 平台 SELinux 策略禁止在沒有網域轉換的情況下執行包裝器。此規則不得更改,並已在Android 相容性測試套件 (CTS)中進行測試。
- 平台 SELinux 策略也禁止從供應商程序直接執行實用程式(例如
/system/bin/ip <FOO> <BAR>
)。此規則不得更改並在 CTS 中進行測試。 - 任何需要啟動包裝器的供應商網域(進程)都必須在 SELinux 策略中新增下列網域轉換規則:
domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper)
。
Netutils 包裝過濾器
封裝的實用程式可用於配置 Linux 網路堆疊的幾乎所有方面。但是,為了確保可以維持穩定的介面並允許更新系統分區,僅允許命令列參數的某些組合;其他命令將被拒絕。
供應商介面和鏈
包裝器具有供應商介面的概念。這些介面通常由供應商代碼管理,例如蜂窩數據介面。通常,其他類型的介面(例如 Wi-Fi)由 HAL 和框架管理。包裝器透過名稱(使用正規表示式)識別供應商接口,並允許供應商代碼對其執行許多操作。目前,供應商介面有:
- 名稱以“oem”後跟數字結尾的接口,例如
oem0
或r_oem1234
。 - 目前 SOC 和 OEM 實作使用的接口,例如
rmnet_data[0-9]
。
通常由框架管理的介面名稱(例如wlan0
)永遠不是供應商介面。
包裝器具有類似的供應商鏈概念。它們用在iptables
指令中,也可以用名稱來辨識。目前,供應商鏈:
- 以
oem_
開頭。 - 由目前 SOC 和 OEM 實作使用,例如以
nm_
或qcom_
開頭的鏈。
允許的命令
下面列出了目前允許的命令。限制是透過執行的命令列上的一組正規表示式來實現的。有關詳細信息,請參閱system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
。
ip
ip
指令用於設定 IP 位址、路由、IPsec 加密和許多其他網路參數。包裝器允許執行以下命令:
- 從供應商管理的介面中新增和刪除 IP 位址。
- 配置 IPsec 加密。
iptables/ip6tables
iptables
和ip6tables
指令用於設定防火牆、封包修改、NAT 和其他按封包處理。包裝器允許執行以下命令:
- 新增和刪除供應商鏈。
- 在任何引用進入 (
-i
) 或離開 (-o
) 供應商介面的資料包的鏈中新增和刪除規則。 - 從任何其他鏈中的任何點跳到供應商鏈。
國家資料中心
ndc
用於與在 Android 上執行大多數網路配置的netd
守護程式進行通訊。包裝器允許執行以下命令:
- 建立和銷毀 OEM 網路 (
oemXX
)。 - 將供應商管理的介面加入 OEM 網路。
- 新增到 OEM 網路的路由。
- 全域和供應商介面上啟用或停用 IP 轉送。
TC
tc
指令用於在供應商介面上設定流量排隊和整形。