9 votos

¿Cómo hace Android la resolución de nombres DNS?

Estoy aprendiendo cómo Windows hace la resolución de nombres y necesito saber cómo lo hace Android para que una aplicación funcione en mi portátil Windows y desde mi teléfono Android.

Tomando prestado de un post en superusuario.com El método de resolución normal en Windows es la siguiente:

  1. El cliente comprueba si el nombre consultado es el suyo.
  2. A continuación, el cliente busca en un archivo local de Hosts, una lista de direcciones IP y nombres almacenada en el ordenador local.
  3. Se consulta a los servidores del Sistema de Nombres de Dominio (DNS).
  4. Si el nombre sigue sin resolverse, se utiliza la secuencia de resolución de nombres NetBIOS como copia de seguridad. Este orden se puede cambiar configurando el tipo de nodo NetBIOS del cliente.

Utilizo dnsmasq para proporcionar resolución DNS local y poder asignar mis propios nombres de host a direcciones IP de LAN locales. Esto también me permite ver, en el dnsmasq archivo de registro, la consulta DNS que va del cliente al servidor DNS. Mientras probaba el sitio web desde mi teléfono pude jurar usando la dirección URL http://mywebsite en un navegador Chrome en el teléfono estaba cargando el sitio web y el dnsmasq registro mostró sólo que el nombre no cualificado - mywebsite - resolviendo a la dirección IP local deseada en la que se encuentra el servidor web.

Sin embargo eso fue hace unos días, ahora el dnsmasq log siempre muestra que el sufijo DNS del servidor DHCP [home] ha sido añadido. Así que veo mywebsite.home en el dnsmasq log aunque he utilizado la dirección URL http://mywebsite en el navegador Chrome de los teléfonos. No he cambiado nada con el teléfono. Todavía está configurado para obtener su dirección IP a través de DHCP, en la práctica nunca cambia.

Así que mis preguntas son:

  1. ¿Cómo resuelve el sistema operativo Android los nombres de dominio en direcciones IP - qué cosas intenta y en qué orden?
  2. Cualquier información sobre por qué Android parecía estar resolviendo el nombre de host no cualificado en mi navegador originalmente sin ningún sufijo DNS que se añade. Pero ahora el [home] siempre se añade el sufijo tal y como se indica en la etiqueta dnsmasq archivo de registro.

Actualización 1

Después de algunas pruebas más he vuelto a ver el escenario en el que la página web http://mymovies se carga desde el teléfono Android pero el dnsmasq aparece para mostrar la resolución de nombres que ocurre en un nombre de dominio no cualificado (nombre de host desnudo: mymovies ).

En x son la dirección IP pública de mi router.

¿Puede alguien explicar qué dnsmasq está haciendo aquí?

A partir de las 02:07:22 parece que inicialmente intenta resolver el nombre mymovies.home . Esto tiene sentido porque la IP del teléfono es asignada dinámicamente por el servidor DHCP y puedo ver en mi portátil que el servidor DHCP envía el sufijo DNS [home] como el sufijo DNS específico de la conexión, así que supongo que debe estar haciendo lo mismo con el teléfono.

La razón por la que falla aquí es porque no tengo una entrada para mymovies.home en dnsmasq.conf - Lo he comentado. Tengo una entrada de dirección para mymovies en dnsmasq.conf y parece ser por eso que puede resolver mymovies a una dirección IP.
¿Es esta una diferencia de resolución de nombres en Android comparado con Windows - que eventualmente el sistema operativo Android intentará resolver un nombre de dominio no cualificado (nombre de host desnudo) a una dirección IP?

13voto

Jack Wade Puntos 231

La forma en que se resuelven las consultas DNS realizadas por un programa no es específica de un sistema operativo, sino que depende de la biblioteca de resolución que utilice el programa. Tradicionalmente, los resolvedores DNS han formado parte de la biblioteca C estándar del sistema operativo, por ejemplo Biónica en Android, libcmt en Windows, glibc , musl , dietlibc , uClibc y otros en Linux. No todas las bibliotecas C utilizan el mismo enfoque para resolver nombres de host/dominio. Mientras que glibc y similares proporcionan mecanismos complicados pero altamente configurables como Name Service Switch, otros sólo se basan en hosts y las consultas DNS al servidor de nombres ascendente configurado en /etc/resolv.conf . Resolución de Android ( 1 , 2 ) busca en la caché, hosts y DNS:

"Las búsquedas de DNS están centralizadas en el 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 a la netd que analiza la solicitud y llama a getaddrinfo de nuevo para realizar búsquedas de DNS y, a continuación, almacena en caché los resultados para que otras aplicaciones puedan utilizarlos".

La dirección del servidor DNS se recibe a través del contexto PDP en Datos Móviles o a través de DHCP en Wi-Fi (también posiblemente a ajustar manualmente ) o el valor codificado 8.8.8.8 se utiliza. Desde Android 9 también se puede configurar DNS Privado (DNS sobre TLS) en Ajustes. También es posible configurar DNS y nombre de dominio usando ndc resolver setnetdns mando. Ver más detalles en ¿Cómo configurar DNS correctamente? .

dnsmasq El registro siempre muestra que el servidor DHCP DNS se ha añadido el sufijo [home]

.home suffix está siendo proporcionado por su servidor DHCP (¿router?) a Android como parte de la petición DHCP (código 15). Cliente DHCP de Android pregunta servidor para opción 6 (servidor de nombres de dominio) y opción 15 (nombre de dominio), que luego se reenvían a la biblioteca C ( _resolv_set_nameservers_for_net ) a través de DnsManager , Servicio de gestión de red y netd .

En el cliente DHCP de Linux (por ejemplo dhcpcd ) modifica resolv.conf o utiliza un programa como resolvconf que se dedica a gestionar resolv.conf . nameserver define el servidor DNS y search define la lista de búsqueda para la búsqueda de nombre de host (DHCP opción 119 o 15). Android utiliza valores por defecto codificados en diferentes archivos de cabecera distintos de los recibidos de DHCP o configurados manualmente.

Los clientes DHCP y DNS de Windows admiten la opción 15. Configuraciones adicionales que son respetadas por el servicio Cliente DNS ( dnscache ) y la biblioteca se puede hacer a través de Conexiones de red o Editor de directivas de grupo o Editor del registro.

¿Es esta una diferencia de resolución de nombres en Android comparado con Windows - que eventualmente el sistema operativo Android intentará resolver un nombre de dominio no cualificado (nombre de host desnudo) a una dirección IP?

Por lo que he visto este es un comportamiento casi estándar para las libc's de Linux. Código de resolución DNS de Android también se basa en NetBSD, otro sistema operativo similar a Linux. Un nombre no cualificado de una sola etiqueta se prueba primero con el sufijo DNS añadido, después se prueba sin el sufijo 4 veces (véase "options attempts:n" para resolv.conf ). En el caso de los nombres multietiqueta, el orden se invierte, mientras que un FQDN (con trailing . ) nunca se prueba con el sufijo. En Windows puede añadir un punto al nombre no cualificado para que sea tratado como FQDN. Es posible establecerlo como comportamiento por defecto añadiendo el punto ( . ) a " Sufijo DNS para esta conexión ". Véase también Consultas de nombres de varias etiquetas .

Estoy aprendiendo cómo Windows hace la resolución de nombres y necesito saber cómo lo hace Android

Como se dijo al principio, la resolución de nombres puede no ser persistente en todo el sistema operativo. En Android, por ejemplo, Firefox o Chrome dependerán de Bionic resolver mientras que algunos busybox ping (o incluso algunas bibliotecas nativas incluidas con aplicaciones GUI) intentarán leer resolv.conf y hacer consultas DNS directamente.
También herramientas de solución de problemas de red como ping y getent se basan en bibliotecas de resolución internas del sistema operativo como NSS, mientras que las herramientas de diagnóstico DNS como nslookup , dig y host actúan como clientes DNS independientes - no leen hosts y no puede respetar resolv.conf en su totalidad. dig proporciona argumentos de línea de comandos para (no) utilizar las opciones establecidas en resolv.conf y del mismo modo Windows nslookup tiene su propio resolver integrado .

Así que incluso en el mismo sistema operativo no se puede esperar el mismo comportamiento de resolución DNS cuando se utilizan diferentes programas GUI/CLI, ya que podrían estar utilizando diferentes libc y / o diferente resolver y / o diferente configuración.


RELACIONADO:

1 votos

Irfan muchas gracias por esta respuesta tan detallada. Ahora puedo ver cómo las búsquedas DNS están influenciadas por muchos factores. Es interesante que Windows no va a hacer una búsqueda de DNS en un nombre de host desnudo pero Android lo hará debido al código de resolución DNS diferente. Saludos.

1voto

¿Puede alguien explicar qué dnsmasq está haciendo aquí?

  • query[A] = solicitud de resolución para IPv4
  • De: obviamente la fuente, como ya has dicho, la dirección pública de tu router.
  • reenviado a: es el reenvío de la URL a los servidores DNS que configuró para ese tipo de URLs, en caso de que no haya configuración allí, está usando los servidores DNS por defecto o su GW.
  • respuesta: el Servidor DNS no está pudiendo resolver el host porque ese dominio no existe (mymovies.home) y por lo tanto está entregando ese "NXDOMAIN" como respuesta
  • 192.168.1.124 es la IP que has configurado estáticamente para mymovies

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X