Agente de resolución de DNS

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.