網絡堆棧配置工具

Android 作業系統包含標準 Linux 網路實用程序,例如ifconfigipip6tables 。這些實用程式駐留在系統映像上,並支援整個 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”後跟數字結尾的接口,例如oem0r_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

iptablesip6tables指令用於設定防火牆、封包修改、NAT 和其他按封包處理。包裝器允許執行以下命令:

  • 新增和刪除供應商鏈。
  • 在任何引用進入 ( -i ) 或離開 ( -o ) 供應商介面的資料包的鏈中新增和刪除規則。
  • 從任何其他鏈中的任何點跳到供應商鏈。

國家資料中心

ndc用於與在 Android 上執行大多數網路配置的netd守護程式進行通訊。包裝器允許執行以下命令:

  • 建立和銷毀 OEM 網路 ( oemXX )。
  • 將供應商管理的介面加入 OEM 網路。
  • 新增到 OEM 網路的路由。
  • 全域和供應商介面上啟用或停用 IP 轉送。

TC

tc指令用於在供應商介面上設定流量排隊和整形。