網路堆疊設定工具

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

Symlinks 會顯示由 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 Compatibility Test Suite (CTS) 中接受測試。
  • 直接執行公用程式 (例如/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

ndc 用於與 netd 守護程進行通訊,後者會在 Android 上執行大部分的網路設定。包裝函式可允許下列指令:

  • 建立及刪除 OEM 網路 (oemXX)。
  • 將供應商管理的介面新增至原始設備製造商 (OEM) 網路。
  • 新增路徑至 OEM 網路。
  • 在全球和供應商介面上啟用或停用 IP 轉送。

tc

tc 指令可用於供應商介面上的流量排序和調整。