網絡堆棧配置工具

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命令用於在供應商接口上配置流量排隊和整形。