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 redes de Linux. En dispositivos con Android 7.x e inferiores, el código del proveedor puede llamar a estos binarios directamente, lo que presenta los siguientes problemas:
- Debido a que las utilidades de red se actualizan en la imagen del sistema, no proporcionan una implementación estable.
- El alcance de las utilidades de red es tan amplio que es difícil evolucionar la imagen del sistema garantizando al mismo tiempo un comportamiento predecible.
En dispositivos con Android 8.0 y superior, la partición del proveedor sigue siendo la misma mientras la partición del sistema recibe una actualización. Para lograr esto, Android 8.0 brinda la capacidad de definir una interfaz versionada y estable y al mismo tiempo usar restricciones de SELinux para mantener la interdependencia del proveedor y la imagen del sistema en un buen conjunto conocido.
Los proveedores pueden utilizar las utilidades de configuración de red proporcionadas por la plataforma para configurar la pila de redes de Linux, pero estas utilidades aún no incluyen un contenedor de interfaz HIDL. Para definir dicha interfaz, Android 8.0 incluye la herramienta netutils-wrapper-1.0
.
Envoltorio Netutils
La utilidad contenedora netutils
proporciona un subconjunto de la configuración de la pila de red de Linux que no se ve afectada por las actualizaciones de las particiones del sistema. Android 8.0 contiene la versión 1.0 de los contenedores, que le permite pasar los mismos argumentos que las utilidades empaquetadas, 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 incluidas en el contenedor netutils
, que incluyen:
-
ip
-
iptables
-
ip6tables
-
ndc
-
tc
Para utilizar estas utilidades en Android 8.0 y versiones posteriores, las implementaciones de los proveedores deben cumplir con las siguientes reglas:
- Los procesos del proveedor no deben ejecutar
/system/bin/netutils-wrapper-1.0
directamente; Si intenta hacerlo, se producirá un error. - Todas las utilidades incluidas en
netutils-wrapper-1.0
deben iniciarse utilizando sus enlaces simbólicos. Por ejemplo, cambie el código del 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 la plataforma SELinux. Esta regla no se debe cambiar y se prueba en Android Compatibility Test Suite (CTS) .
- La ejecución de utilidades directamente (por ejemplo,
/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 se debe cambiar y se prueba en CTS. - Cualquier dominio (proceso) de proveedor que necesite iniciar 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 contenedores Netutils
Las utilidades empaquetadas se pueden utilizar para configurar casi cualquier aspecto de la pila de redes de Linux. Sin embargo, para garantizar que sea posible mantener una interfaz estable y permitir actualizaciones en la partición del sistema, sólo se permiten ciertas combinaciones de argumentos de la línea de comando; otros comandos serán rechazados.
Interfaces y cadenas de proveedores
El contenedor tiene un concepto de interfaces de proveedor . Se trata de interfaces que normalmente se gestionan mediante código de proveedor, como las interfaces de datos móviles. Normalmente, los HAL y el marco gestionan 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
or_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 proveedor.
El contenedor tiene un concepto similar al de las cadenas de proveedores . Estos se utilizan en los comandos iptables
y también se reconocen por su nombre. Actualmente, las cadenas de proveedores:
- Comience con
oem_
. - Se utilizan en implementaciones SOC y OEM actuales, por ejemplo, cadenas que comienzan en
nm_
oqcom_
.
Comandos permitidos
Los comandos permitidos actualmente se enumeran a continuación. Las restricciones se implementan mediante 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 utiliza para configurar direcciones IP, enrutamiento, cifrado IPsec y una serie de otros parámetros de red. El contenedor permite los siguientes comandos:
- Agregue y elimine direcciones IP de interfaces administradas por proveedores.
- Configure el cifrado IPsec.
iptables/ip6tables
Los comandos iptables
e ip6tables
se utilizan para configurar firewalls, 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 haga referencia 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.
ncd
ndc
se utiliza para comunicarse con el demonio netd
que realiza la mayor parte de la configuración de red en Android. El contenedor permite los siguientes comandos:
- Crea y destruye 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 del proveedor.
tc
El comando tc
se utiliza para configurar las colas de tráfico y la configuración en las interfaces de los proveedores.