Intentaré explicar lo que entiendo por DNS en Android. Os ayudará a solucionar problemas relacionados y me servirá para futuros apuntes.
DNS
Tradicionalmente, Domain Name Resolver ha formado parte de la biblioteca C del sistema operativo (comúnmente denominada libc). GNU libc
(que es el más común en las distribuciones Linux) implementa un complicado mecanismo de resolución de nombres llamado NSS que puede priorizar en qué orden los servicios de bases de datos como LDAP / NIS, local files
( /etc/hosts
) y DNS
para resolver nombres de host / dominio. DNS resolver entonces lee /etc/resolv.conf
para obtener la dirección del servidor de nombres que se va a consultar.
A diferencia de GNU libc
Android Bionic libc
(que depende en netd
para DNS) no considera /etc/resolv.conf
a menos que CAMBIOS_ANDROID (sólo cuando libc++ se compila como biblioteca estática ?). Sin embargo /etc/hosts Las entradas son valorado por el resolver de Android al resolver nombres.
Pero si está utilizando un binario compilado / enlazado estáticamente con algún otro - como por ejemplo musl
o uC
o diet
- libc, que debe estar leyendo /etc/resolv.conf
para obtener la dirección IP del servidor de nombres de dominio. Busybox ping es un ejemplo habitual.
DNS de Android
Dentro del entorno de ejecución Java de Android, se puede utilizar un DHCP proporcionado o configurado manualmente o codificado Se utiliza el servidor DNS. Propiedades net.dns1
y net.dns2
se establecen con los valores de los servidores DNS recibidos de Servidor DHCP (en Wi-Fi o datos móviles) por ConnectivityService
y luego reenviado a netd
. A partir de Android Oreo, estas propiedades son ya no está disponible a través de las API de Android, pero sólo legible como root
o shell
- una vez eliminado entonces re-added . Así que cambiar las propiedades net.dns*
utilizando setprop
sólo afecta a los programas (que se ejecutan con UID 0
o 2000
) que leen explícitamente estas propiedades. Un ejemplo de ello es busybox de meefik . También había algunos otros Propiedades relacionadas con DNS ambientado en los viejos tiempos de dhcpcd
que era el cliente DHCP hasta Lollipop.
Vea más detalles en ¿Cómo hace el sistema operativo Android la resolución de nombres DNS? .
Almacenamiento en caché
Las consultas DNS se almacenan en caché en Android mediante netd
como NSCD
en las distribuciones Linux para acelerar la resolución de nombres. Android tiene un herramienta de línea de comandos ndc
que podría borrar la caché de DNS, pero el comando fue eliminado en Android 7 . Ahora es posible evitar el almacenamiento en caché configurando la variable de entorno ANDROID_DNS_MODE
que impide que Bionic libc devuelva el proxy a netd
para la búsqueda en caché. Véase ¿Cómo modificar variables de entorno como PATH al inicio? para establecer la variable de forma global.
Cómo configurar DNS
Como ya se ha mencionado, anteriormente se utilizaban distintos métodos para cambiar los servidores de nombres de dominio predeterminados en Android no parecen funcionar ahora. Configuración de servidores de nombres y / o nombre de dominio de búsqueda a través de línea de comandos:
~$ ndc resolver setnetdns <network_id> <domain> <DNS>
* La sintaxis de los comandos es un poco diferente en versiones anteriores
Del mismo modo ndc tether dns set
trabaja para dnsmasq
. Para obtener el ID de red actual:
~$ dumpsys netd | grep 'Default network'
Borrar servidores DNS establecidos:
~# ndc resolver clearnetdns <network_id>
Sin embargo, algunas aplicaciones pueden a veces saltarse el mecanismo de resolución de nombres de Android intentando llegar directamente a algún servidor de nombres, he observado WhatsApp. O el valor codificado se utiliza (puede ser cuando el router es anunciar el servidor DNS IPv6 ). La única opción que funciona con seguridad es iptables DNAT
:
~# iptables -t nat -I OUTPUT -p udp --dport 53 -j DNAT --to 1.1.1.1:53
Los servidores DNS también pueden configurado en Ajustes para la red Wi-Fi. Compatible con Android 9+ DNS privado / DNS sobre TLS (DoT) que envía consultas DNS cifradas sobre puerto 853 según lo normalizado en RFC7858 .
La solución no root que funciona tanto para Wi-Fi como para datos móviles es utilizar aplicaciones VPN como Anfitriones virtuales o Filtro DNS personal que interceptan el tráfico DNS y realizan consultas al servidor DNS ascendente configurado.
Pruebas
Para comprobar qué servidor de nombres utiliza connectivity
y netd
servicios en tiempo de ejecución Java:
~# dumpsys connectivity | grep CONNECTED | grep -o 'DnsAddresses: \[[^ ]*'
~# dumpsys netd | grep -A2 'DNS servers:'
Y los utilizados por el servidor DNS de reenvío de anclaje:
~# ndc tether dns list
~# logcat -d -s TetherController,dnsmasq | grep -E 'update_dns|nameserver'
Para ver a dónde van las consultas DNS, puede capturar el tráfico destinado al puerto 53:
~# iptables -I OUTPUT -m udp -p udp --dport 53 -j LOG --log-prefix 'DNS_QUERIES '
~# iptables -I OUTPUT -m tcp -p tcp --dport 53 -j LOG --log-prefix 'DNS_QUERIES '
~# dmesg -w | grep 'DNS_QUERIES'
O
~# tcpdump -n -i any port 53
Si las consultas no van al destino deseado, hay algún problema con tu configuración DNS, particularmente si usas VPN. Tenga en cuenta que iptables
y tcpdump
(captura en el puerto 53
) no funcionará con DNS Privado (puerto 853
). Carácter dinámico de la RPDB y de las tablas de encaminamiento ( rt_tables sigue cambiando, principal no se utiliza) acompañado de fwmark ( SO_MARK ) complican las cosas para el control manual.
Así que si los pasos mencionados no funcionan, no hay mucho que puedas hacer para solucionar los problemas de DNS en los dispositivos Android. Un restablecimiento de fábrica o un reinicio de la ROM pueden resolver el problema.
Además, si un servidor DNS local es proporcionado por DHCP (servidor en el router Wi-Fi), puede comprobar si realmente está escuchando en el puerto 53:
~# nmap -e eth0 -sUT -p53 --script=dns-recursion 192.168.1.245
0 votos
¿Por qué alguien querría conectar un dispositivo Android a dos redes LAN al mismo tiempo?