Resolución de DNS

El módulo DNS Resolver brinda protección al usuario contra interceptación de DNS y ataques de actualización de configuración y rendimiento de red mejorado para resoluciones de DNS. El módulo contiene el código que implementa el solucionador de código auxiliar DNS, que traduce nombres como www.google.com a direcciones IP como 2001:db8::1 . El solucionador de código auxiliar de DNS respalda elementos de la API de Java, como InetAddress#getAllByName y Network#getAllByName , así como funciones de red nativas , e implementa el envío y la recepción de consultas de DNS y el almacenamiento en caché de los resultados.

Cambios en Android 10

En dispositivos con Android 9 y versiones anteriores, el código de resolución de DNS se distribuye entre Bionic y netd . Las búsquedas de DNS están centralizadas en el demonio netd para permitir el almacenamiento en caché en todo el sistema, mientras que las aplicaciones llaman a funciones (como getaddrinfo ) en Bionic. La consulta se envía a través de un socket UNIX a /dev/socket/dnsproxyd al demonio netd , que analiza la solicitud y llama getaddrinfo nuevamente para emitir búsquedas de DNS, luego almacena en caché los resultados para que otras aplicaciones puedan usarlos. La implementación del solucionador de DNS estaba contenida principalmente en bionic/libc/dns/ y en parte en system/netd/server/dns .

Android 10 mueve el código de resolución de DNS a system/netd/resolv, lo convierte a C++ y luego moderniza y refactoriza el código. El código en Bionic sigue existiendo por motivos de compatibilidad de aplicaciones, pero el sistema ya no lo llama. Estas rutas de origen 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 DNS Resolver (`com.android.resolv`) se entrega como un archivo APEX y está vinculado dinámicamente mediante netd ; sin embargo, netd no es una dependencia ya que el módulo sirve directamente al socket local /dev/socket/dnsproxyd . El punto final de Binder para la configuración del solucionador se movió de netd al solucionador, lo que significa que el servicio del sistema puede llamar directamente al módulo de resolución sin pasar por netd .

El módulo DNS Resolver depende de libc (Bionic) y vincula estáticamente sus dependencias; no se requieren otras bibliotecas.

mDNS .resolución local

A partir de noviembre de 2021, el solucionador de Android admite la resolución mDNS .local, que implementa "Consultas DNS de multidifusión de un solo disparo 5.1" en RFC 6762 para enviar consultas DNS estándar de forma ciega a 224.0.0.251:5353 o [FF02::FB]:5353. La resolución mDNS se admite de forma transparente llamando getaddrinfo() con un nombre de host que termina en *.local .

La resolución mDNS .local aumenta la funcionalidad existente de getaddrinfo() para obtener las direcciones. Si un dispositivo admite resolución mDNS .local, entonces la API getaddrinfo() envía consultas mDNS a 224.0.0.251:5353 o [FF02::FB]:5353 y devuelve las direcciones locales. Si un dispositivo no admite la resolución mDNS .local, entonces el método API getaddrinfo() envía una consulta DNS al servidor DNS.

El código está en AOSP, ubicado en packages/modules/DnsResolver . Los usuarios pueden mantener su diseño mDNS actual para obtener las direcciones o utilizar getaddrinfo() en su lugar. El comportamiento de esta característica es como una consulta DNS normal enviada a las direcciones de multidifusión mDNS. Esta característica no tiene ningún impacto en la salud 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 VPN y de datos móviles están excluidas de la resolución .local.