El sistema operativo Android contiene utilidades de redes estándar de Linux, como ifconfig
, ip
y ip6tables
.
Estas utilidades residen en la imagen del sistema y habilitan la configuración de toda la pila de redes de Linux. En dispositivos con Android 7.x y versiones anteriores, el código del proveedor puede llamar a estos objetos binarios directamente, lo que presenta los siguientes problemas:
- Dado 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 y, al mismo tiempo, garantizar un comportamiento predecible.
En dispositivos con Android 8.0 y versiones posteriores, la partición del proveedor permanece igual mientras que la partición del sistema recibe una actualización. Para lograrlo, Android 8.0 proporciona la capacidad de definir una interfaz estable y con versión, a la vez que usa restricciones de SELinux para mantener la interdependencia de la imagen del proveedor y del sistema en un conjunto conocido como bueno.
Los proveedores pueden usar 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 wrapper de interfaz de HIDL. Para definir una interfaz de este tipo, Android 8.0 incluye la herramienta netutils-wrapper-1.0
.
Wrapper de netutils
La utilidad del wrapper 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 wrappers, que te 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 symlinks muestran las utilidades de red que une el wrapper netutils
, que incluyen lo siguiente:
ip
iptables
ip6tables
ndc
tc
Para usar 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 lo intentas, se producirá un error. - Todas las utilidades que une
netutils-wrapper-1.0
se deben iniciar con sus symlinks. Por ejemplo, cambia el código del proveedor que lo hacía antes (/system/bin/ip <FOO> <BAR>
) a/system/bin/ip-wrapper-1.0 <FOO> <BAR>
. - Ejecutar los wrappers sin transición de dominio está prohibido 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 (CTS) de Android.
- Ejecutar las utilidades directamente (p.ej.,
/system/bin/ip <FOO> <BAR>
) de los procesos del proveedor también está prohibido en las políticas de SELinux de la plataforma. Esta regla no se debe cambiar y se prueba en CTS. - Cualquier dominio (proceso) del proveedor que necesite iniciar un wrapper 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 del wrapper de Netutils
Las utilidades empaquetadas se pueden usar para configurar casi cualquier aspecto de la pila de redes de Linux. Sin embargo, para garantizar que se pueda mantener una interfaz estable y permitir actualizaciones en la partición del sistema, solo se permiten ciertas combinaciones de argumentos de línea de comandos; se rechazan otros comandos.
Cadenas e interfaces de proveedores
El wrapper tiene un concepto de interfaces de proveedores. Estas son interfaces que, por lo general, se administran con el código del proveedor, como las interfaces de datos móviles. Por lo general, los HAL y el framework administran otros tipos de interfaces (como Wi-Fi). El wrapper reconoce las interfaces del proveedor por nombre (con una expresión regular) y permite que el código del proveedor realice muchas operaciones en ellas. Actualmente, las interfaces de los proveedores son las siguientes:
- Interfaces cuyos nombres terminan en "oem" seguido de un número, como
oem0
or_oem1234
- Interfaces que usan las implementaciones actuales de SOC y OEM, como
rmnet_data[0-9]
Los nombres de las interfaces que suele administrar el framework (como wlan0
) nunca son interfaces de proveedores.
El wrapper tiene un concepto similar de cadenas de proveedores. Se usan en los comandos iptables
y también se reconocen por nombre. Actualmente, las cadenas de proveedores hacen lo siguiente:
- Comienza con
oem_
. - Las implementaciones actuales de SOC y OEM las usan, p.ej., cadenas que comienzan en
nm_
oqcom_
.
Comandos permitidos
A continuación, se enumeran los comandos permitidos actualmente. Las restricciones se implementan a través de un conjunto de expresiones regulares en las líneas de comandos ejecutadas. Para obtener más información, consulta system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
.
ip
El comando ip
se usa para configurar direcciones IP, enrutamiento, encriptación de IPsec y varios otros parámetros de red. El wrapper permite los siguientes comandos:
- Agrega y quita direcciones IP de las interfaces administradas por el proveedor.
- Configura la encriptación de IPsec.
iptables y ip6tables
Los comandos iptables
y ip6tables
se usan para configurar el firewall, el desorden de paquetes, NAT y otros procesamientos por paquete.
El wrapper permite los siguientes comandos:
- Agrega y quita cadenas de proveedores.
- Agrega y borra reglas en cualquier cadena que haga referencia a paquetes que ingresan (
-i
) o salen (-o
) de una interfaz de proveedor. - Saltar a una cadena de proveedores desde cualquier punto de cualquier otra cadena
ndc
ndc
se usa para comunicarse con el daemon netd
que realiza la mayor parte de la configuración de red en Android. El wrapper permite los siguientes comandos:
- Crea y destruye redes de OEM (
oemXX
). - Agrega interfaces administradas por el proveedor a las redes de OEM.
- Agrega rutas a las redes de OEM.
- Habilita o inhabilita el reenvío de IP de forma global y en las interfaces de los proveedores.
tc
El comando tc
se usa para configurar el encolamiento y la conformación del tráfico en las interfaces de los proveedores.