Herramientas de configuración de pila de red

El sistema operativo Android contiene utilidades de red estándar de Linux, como ifconfig , ip e ip6tables . Estas utilidades residen en la imagen del sistema y permiten la configuración de toda la pila de red de Linux. En los dispositivos que ejecutan Android 7.x y versiones anteriores, el código del proveedor puede llamar a estos archivos binarios directamente, lo que presenta los siguientes problemas:

  • Debido a que las utilidades de red se actualizan en la imagen del sistema, no brindan una implementación estable.
  • El alcance de las utilidades de red es tan amplio que es difícil evolucionar la imagen del sistema mientras se garantiza un comportamiento predecible.

En los dispositivos que ejecutan Android 8.0 y versiones posteriores, la partición del proveedor sigue siendo la misma mientras que la partición del sistema recibe una actualización. Para lograr esto, Android 8.0 brinda la capacidad de definir una interfaz estable y versionada al mismo tiempo que usa las restricciones de SELinux para mantener la interdependencia del proveedor y la imagen del sistema en un conjunto bueno conocido.

Los proveedores pueden usar las utilidades de configuración de red proporcionadas por la plataforma para configurar la pila de red de Linux, pero estas utilidades aún no incluyen un contenedor de interfaz HIDL. Para definir dicha interfaz, Android 8.0 incluye la netutils-wrapper-1.0 .

Envoltura de Netutils

La utilidad contenedora netutils proporciona un subconjunto de la configuración de la pila de red de Linux que no se ve afectado por las actualizaciones de la partición del sistema. Android 8.0 contiene la versión 1.0 de los envoltorios, que le permite pasar los mismos argumentos que las utilidades envueltas, instaladas en la partición del sistema en /system/bin de la siguiente manera:

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

Los enlaces simbólicos muestran las utilidades de red envueltas por el envoltorio netutils , que incluyen:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Para usar estas utilidades en Android 8.0 y versiones posteriores, las implementaciones del proveedor deben cumplir con las siguientes reglas:

  • Los procesos del proveedor no deben ejecutar /system/bin/netutils-wrapper-1.0 directamente; los intentos de hacerlo darán como resultado un error.
  • Todas las utilidades envueltas por netutils-wrapper-1.0 deben iniciarse utilizando sus enlaces simbólicos. Por ejemplo, cambie el código de proveedor que hizo esto antes ( /system/bin/ip <FOO> <BAR> ) a /system/bin/ip-wrapper-1.0 <FOO> <BAR> .
  • La ejecución de contenedores sin transición de dominio está prohibida en la política de SELinux de la plataforma. Esta regla no se debe cambiar y se prueba en el conjunto de pruebas de compatibilidad de Android (CTS) .
  • La ejecución de las utilidades directamente (p. ej., /system/bin/ip <FOO> <BAR> ) desde los procesos del proveedor también está prohibida en las políticas de la plataforma SELinux. Esta regla no debe cambiarse y se prueba en CTS.
  • Cualquier dominio (proceso) de proveedor que necesite lanzar un contenedor debe agregar la siguiente regla de transición de dominio en la política de SELinux: domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper) .

Filtros envoltorios de Netutils

Las utilidades envueltas se pueden usar para configurar casi cualquier aspecto de la pila de red de Linux. Sin embargo, para garantizar que sea posible mantener una interfaz estable y permitir actualizaciones en la partición del sistema, solo se permiten ciertas combinaciones de argumentos de la línea de comandos; otros comandos serán rechazados.

Interfaces y cadenas de proveedores

El contenedor tiene un concepto de interfaces de proveedores . Estas son interfaces típicamente administradas por el código del proveedor, como las interfaces de datos móviles. Por lo general, los HAL y el marco administran otros tipos de interfaces (como Wi-Fi). El contenedor reconoce las interfaces del proveedor por su nombre (usando una expresión regular) y permite que el código del proveedor realice muchas operaciones en ellas. Actualmente, las interfaces de proveedores son:

  • Interfaces cuyos nombres terminan en "oem" seguido de un número, como oem0 o r_oem1234 .
  • Interfaces utilizadas por las implementaciones SOC y OEM actuales, como rmnet_data[0-9] .

Los nombres de las interfaces que normalmente administra el marco (como wlan0 ) nunca son interfaces de proveedores.

El contenedor tiene un concepto similar de cadenas de proveedores . Estos se utilizan en los comandos de iptables y también se reconocen por su nombre. Actualmente, las cadenas de proveedores:

  • Comience con oem_ .
  • Los utilizan las implementaciones SOC y OEM actuales, por ejemplo, cadenas que comienzan en nm_ o qcom_ .

Comandos permitidos

Los comandos permitidos actualmente se enumeran a continuación. Las restricciones se implementan a través de un conjunto de expresiones regulares en las líneas de comando ejecutadas. Para obtener más información, consulte system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp .

ip

El comando ip se usa para configurar direcciones IP, enrutamiento, encriptación IPsec y otros parámetros de red. El contenedor permite los siguientes comandos:

  • Agregue y elimine direcciones IP de las interfaces administradas por proveedores.
  • Configure el cifrado IPsec.

iptables/ip6tables

Los comandos iptables e ip6tables se utilizan para configurar el cortafuegos, la manipulación de paquetes, NAT y otros procesos por paquete. El contenedor permite los siguientes comandos:

  • Agregar y eliminar cadenas de proveedores.
  • Agregue y elimine reglas en cualquier cadena que se refiera a paquetes que entran ( -i ) o salen ( -o ) de una interfaz de proveedor.
  • Salte a una cadena de proveedores desde cualquier punto de cualquier otra cadena.

ndc

ndc se usa para comunicarse con el demonio netd que realiza la mayoría de las configuraciones de red en Android. El contenedor permite los siguientes comandos:

  • Crear y destruir redes OEM ( oemXX ).
  • Agregue interfaces administradas por proveedores a redes OEM.
  • Agregue rutas a redes OEM.
  • Habilite o deshabilite el reenvío de IP globalmente y en las interfaces de los proveedores.

t.c.

El comando tc se utiliza para configurar la puesta en cola y el modelado del tráfico en las interfaces del proveedor.