Strumenti di configurazione dello stack di rete

Il sistema operativo Android contiene utilità di rete Linux standard come ifconfig, ip e ip6tables. Queste utilità si trovano nell'immagine di sistema e consentono di configurare l'intero stack di rete Linux. Sui dispositivi con Android 7.x e versioni precedenti, il codice del fornitore è autorizzato a chiamare direttamente questi binari, il che presenta i seguenti problemi:

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

Sui dispositivi con Android 8.0 e versioni successive, la partizione del fornitore rimane invariata 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 al contempo le limitazioni SELinux per mantenere l'interdipendenza dell'immagine del fornitore e del sistema in un insieme di elementi validi.

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 dell'interfaccia HIDL. Per definire un'interfaccia di questo tipo, Android 8.0 include lo strumentonetutils-wrapper-1.0.

Wrapper Netutils

L'utilità wrapper netutils fornisce un sottoinsieme della configurazione dello stack di rete Linux che non è interessato 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à con wrapping, 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 link simbolici mostrano le utilità di rete con wrapping del netutils wrapper, tra cui:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

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

  • Le procedure del fornitore non devono eseguire /system/bin/netutils-wrapper-1.0 direttamente; i tentativi in tal senso generano un errore.
  • Tutte le utilità con wrapping di netutils-wrapper-1.0 devono essere avviate utilizzando i relativi link simbolici. Ad esempio, cambia il codice fornitore che lo faceva prima (/system/bin/ip <FOO> <BAR>) in /system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • L'esecuzione dei wrapper senza transizione di dominio è vietata nel criterio SELinux della piattaforma. Questa regola non deve essere modificata e viene testata in Android Compatibility Test Suite (CTS).
  • Eseguire direttamente le utilità (ad es. /system/bin/ip <FOO> <BAR>) dai processi del fornitore è vietata anche nelle norme SELinux della piattaforma. Questa regola non deve essere modificata e viene testata in CTS.
  • Qualsiasi dominio (processo) del fornitore che deve avviare un wrapper deve aggiungere la seguente regola di transizione del dominio nel criterio SELinux:domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper).

Filtri wrapper Netutils

Le utilità con wrapping possono essere utilizzate per configurare quasi tutti gli aspetti dello stack di rete Linux. Tuttavia, per garantire la possibilità di mantenere un'interfaccia stabile e consentire gli aggiornamenti alla partizione di sistema, sono consentite solo determinate combinazioni di argomenti della riga di comando; gli altri comandi vengono rifiutati.

Interfacce e catene di fornitori

Il wrapper ha un concetto di interfacce del fornitore. Si tratta di interfacce tipicamente gestite dal codice del fornitore, come le interfacce di dati di telefonia cellulare. In genere, altri tipi di interfacce (come il Wi-Fi) sono gestiti dagli HAL e dal framework. Il wrapper riconosce le interfacce del fornitore per nome (utilizzando un'espressione regolare) e consente al codice del fornitore di eseguire molte operazioni su di esse. Al momento, le interfacce dei fornitori sono:

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

I nomi delle interfacce in genere gestite dal framework (ad es.wlan0) non sono mai interfacce del fornitore.

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

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

Comandi consentiti

Di seguito sono elencati i comandi attualmente consentiti. Le restrizioni vengono implementate tramite un insieme di espressioni regolari sulle righe di comando eseguite. Per maggiori dettagli, consulta 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:

  • Aggiungere e rimuovere indirizzi IP dalle interfacce gestite dal fornitore.
  • Configura la crittografia IPsec.

iptables e ip6tables

I comandi iptables e ip6tables vengono utilizzati per configurare il firewall, la manipolazione dei pacchetti, la NAT e altri tipi di elaborazione a livello di pacchetto. Il wrapper consente i seguenti comandi:

  • Aggiungere ed eliminare catene di fornitori.
  • Aggiungi ed elimina regole in qualsiasi catena che fa riferimento ai pacchetti in entrata (-i) o in uscita (-o) da un'interfaccia del fornitore.
  • Passare a una catena di fornitori da qualsiasi punto di un'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 le reti OEM (oemXX).
  • Aggiungi interfacce gestite dal fornitore alle reti OEM.
  • Aggiungi percorsi alle reti OEM.
  • Attiva o disattiva il forwarding IP a livello globale e sulle interfacce del fornitore.

tc

Il comando tc viene utilizzato per configurare la coda e la saturazione del traffico sulle interfacce del fornitore.