Strumenti di configurazione dello stack di rete

Il sistema operativo Android contiene utilità di rete Linux standard come ifconfig , ip e ip6tables . Queste utilità risiedono nell'immagine del sistema e consentono la configurazione dell'intero stack di rete Linux. Sui dispositivi con Android 7.x e versioni precedenti, il codice del fornitore può chiamare direttamente questi file binari, il che presenta i seguenti problemi:

  • Poiché le utilità di rete vengono aggiornate nell'immagine del sistema, non forniscono un'implementazione stabile.
  • L'ambito delle utilità di rete è così ampio che è difficile evolvere l'immagine del sistema garantendo allo stesso tempo un comportamento prevedibile.

Sui dispositivi con Android 8.0 e versioni successive, la partizione del fornitore rimane la stessa mentre la partizione di sistema riceve un aggiornamento. Per raggiungere questo obiettivo, Android 8.0 offre la possibilità di definire un'interfaccia stabile e con versione utilizzando anche le restrizioni SELinux per mantenere l'interdipendenza tra fornitore e immagine di sistema entro un insieme noto di validità.

I fornitori possono utilizzare le utilità di configurazione di rete fornite dalla piattaforma per configurare lo stack di rete Linux, ma queste utilità non includono ancora un wrapper di interfaccia HIDL. Per definire tale interfaccia, Android 8.0 include lo strumento netutils-wrapper-1.0 .

Involucro di Netutils

L'utilità wrapper netutils fornisce un sottoinsieme della configurazione dello stack di rete Linux che non è influenzato dagli aggiornamenti della partizione di sistema. Android 8.0 contiene la versione 1.0 dei wrapper, che consente di passare gli stessi argomenti delle utilità racchiuse, installate nella partizione di sistema in /system/bin come segue:

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

I collegamenti simbolici mostrano le utilità di rete racchiuse nel wrapper netutils , che includono:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Per utilizzare queste utilità in Android 8.0 e versioni successive, le implementazioni del fornitore devono rispettare le seguenti regole:

  • I processi del fornitore non devono eseguire direttamente /system/bin/netutils-wrapper-1.0 ; i tentativi in ​​tal senso daranno luogo a errori.
  • Tutte le utilità racchiuse da netutils-wrapper-1.0 devono essere avviate utilizzando i relativi collegamenti simbolici. Ad esempio, modificare il codice del fornitore che eseguiva questa operazione in precedenza ( /system/bin/ip <FOO> <BAR> ) in /system/bin/ip-wrapper-1.0 <FOO> <BAR> .
  • L'esecuzione dei wrapper senza transizione del dominio è vietata nella policy della piattaforma SELinux. Questa regola non deve essere modificata e viene testata nell'Android Compatibility Test Suite (CTS) .
  • Anche l'esecuzione diretta delle utilità (ad esempio /system/bin/ip <FOO> <BAR> ) dai processi del fornitore è vietata nelle policy SELinux della piattaforma. Questa regola non deve essere modificata ed è testata nel CTS.
  • Qualsiasi dominio (processo) del fornitore che necessita di avviare un wrapper deve aggiungere la seguente regola di transizione del dominio nella policy SELinux: domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper) .

Filtri wrapper Netutils

Le utilità incapsulate possono essere utilizzate per configurare quasi ogni aspetto dello stack di rete Linux. Tuttavia, per garantire che sia possibile mantenere un'interfaccia stabile e consentire aggiornamenti alla partizione di sistema, sono consentite solo determinate combinazioni di argomenti della riga di comando; gli altri comandi verranno rifiutati.

Interfacce e catene di fornitori

Il wrapper ha un concetto di interfacce del fornitore . Si tratta di interfacce generalmente gestite dal codice del fornitore, come le interfacce dati cellulari. In genere, altri tipi di interfacce (come il Wi-Fi) sono gestiti dagli HAL e dal framework. Il wrapper riconosce le interfacce del fornitore in base al nome (utilizzando un'espressione regolare) e consente al codice del fornitore di eseguire molte operazioni su di esse. Attualmente, le interfacce del fornitore sono:

  • Interfacce i cui nomi terminano con "oem" seguito da un numero, ad esempio oem0 o r_oem1234 .
  • Interfacce utilizzate dalle attuali implementazioni SOC e OEM, come rmnet_data[0-9] .

I nomi delle interfacce generalmente gestite dal framework (come wlan0 ) non sono mai interfacce del fornitore.

Il wrapper ha un concetto simile alle catene di fornitori . Questi vengono utilizzati nei comandi iptables e sono riconosciuti anche dal nome. Attualmente, le catene di venditori:

  • Inizia con oem_ .
  • Sono utilizzati dalle attuali implementazioni SOC e OEM, ad esempio, catene che iniziano con nm_ o qcom_ .

Comandi consentiti

I comandi attualmente consentiti sono elencati di seguito. Le restrizioni vengono implementate tramite una serie di espressioni regolari sulle righe di comando eseguite. Per i dettagli, fare riferimento a system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp .

ip

Il comando ip viene utilizzato per configurare indirizzi IP, routing, crittografia IPsec e una serie di altri parametri di rete. Il wrapper consente i seguenti comandi:

  • Aggiungi e rimuovi indirizzi IP dalle interfacce gestite dal fornitore.
  • Configura la crittografia IPsec.

iptables/ip6tables

I comandi iptables e ip6tables vengono utilizzati per configurare firewall, manipolazione di pacchetti, NAT e altre elaborazioni per pacchetto. Il wrapper consente i seguenti comandi:

  • Aggiungi ed elimina catene di fornitori.
  • Aggiungi ed elimina regole in qualsiasi catena che si riferisce ai pacchetti che entrano ( -i ) o escono ( -o ) da un'interfaccia del fornitore.
  • Passa a una catena di venditori da qualsiasi punto di qualsiasi altra catena.

ndc

ndc viene utilizzato per comunicare con il demone netd che esegue la maggior parte della configurazione di rete su Android. Il wrapper consente i seguenti comandi:

  • Crea e distruggi reti OEM ( oemXX ).
  • Aggiungi interfacce gestite dal fornitore alle reti OEM.
  • Aggiungi percorsi alle reti OEM.
  • Abilita o disabilita l'inoltro IP a livello globale e sulle interfacce del fornitore.

tc

Il comando tc viene utilizzato per configurare l'accodamento e la modellazione del traffico sulle interfacce del fornitore.