El módulo de resolución de DNS protege al usuario en caso de intercepción de DNS de actualizaciones de configuración y ataques, y la mejora del rendimiento de red del proyecto. El módulo contiene el código que implementa el stub de DNS de resolución, que traduce nombres como www.google.com a IP direcciones, como 2001:db8::1. El agente de resolución de stub de DNS respalda elementos de la API de Java, InetAddress#getAllByName y Network#getAllByName y funciones de redes nativas e implementa recibir consultas de DNS y almacenar en caché los resultados.
Cambios en Android 10
En los dispositivos que ejecutan Android 9 o versiones anteriores, el código de resolución de DNS se distribuye
Bionic y netd
. Las búsquedas de DNS se centralizan en el
netd
daemon para permitir el almacenamiento en caché en todo el sistema, mientras que las apps
llamar a funciones (como getaddrinfo
) en Bionic. Se envía la consulta
a través de un socket UNIX a /dev/socket/dnsproxyd
Daemon de netd
, que analiza la solicitud y llama
Vuelve a getaddrinfo
para emitir búsquedas de DNS y, luego, almacena los resultados en caché
para que otras apps puedan usarlos. La implementación del agente de resolución de DNS estuvo principalmente
contenidos en bionic/libc/dns/
y parcialmente en
system/netd/server/dns
Android 10 traslada el código de resolución de DNS a
system/netd/resolv,
lo convierte a C++, luego lo moderniza y
refactoriza el código. El código de Bionic sigue existiendo para la app
por motivos de compatibilidad, pero el sistema ya no lo llama. Estas fuentes
Las rutas de acceso se ven afectadas por la refactorización:
bionic/libc/dns
system/netd/client
system/netd/server/dns
system/netd/server/DnsProxyListener
system/netd/server/ResolverController
system/netd/resolv
Formato y dependencias
El módulo de resolución de DNS (`com.android.resolv`) se entrega como un
APEX y se vincula de forma dinámica con
netd
; Sin embargo, netd
no es un
dependencia, ya que el módulo entrega el socket local
/dev/socket/dnsproxyd
directamente. El extremo de Binder para la
la configuración del agente de resolución se trasladó de netd
al agente de resolución.
lo que significa que el servicio del sistema puede llamar directamente al módulo de resolución
sin pasar por netd
.
El módulo de resolución de DNS depende de libc
(Bionic) y
vincula estáticamente sus dependencias; no se requieren otras bibliotecas.
Resolución .local de mDNS
A partir de noviembre de 2021, el agente de resolución de Android admite la resolución .local de mDNS, que implementa
"5.1 Consultas de DNS de multidifusión única" en RFC 6762 para enviar consultas de DNS estándar a ciegas
224.0.0.251:5353 o [FF02::FB]:5353. La resolución de mDNS es compatible con transparencia.
llamando a getaddrinfo()
con un nombre de host que termine en *.local
.
La resolución local de mDNS aumenta la funcionalidad existente de getaddrinfo()
para obtener las direcciones. Si un dispositivo admite la resolución .local de mDNS, el
La API de getaddrinfo()
envía consultas de mDNS a 224.0.0.251:5353 o [FF02::FB]:5353.
y devuelve las direcciones locales. Si un dispositivo no admite la extensión .local de mDNS
resolución, el método de la API de getaddrinfo()
envía una consulta de DNS al DNS
servidor.
El código está en AOSP, ubicado en packages/modules/DnsResolver
. Los usuarios pueden mantener sus
Diseño actual de mDNS para obtener las direcciones, o bien usa getaddrinfo()
en su lugar. El comportamiento de
Esta función es como una consulta de DNS normal que se envía a las direcciones multicast de mDNS. Este elemento no tiene
en el estado del sistema.
Los usuarios pueden usar el comando adb shell ping6 HOSTNAME.local
donde HOSTNAME es el nombre de host de un dispositivo de destino en la LAN, por ejemplo,
adb shell ping6 ipad.local
Las conexiones de datos móviles y VPN se excluyen de la resolución .local.