La resolución DNS en Android es manejada por Net Daemon ( netd
) que se ejecuta en el fondo como un init
servicio. netd
utiliza el servidor DNS establecido en la configuración Wi-Fi o el recibido a través de DHCP. O posiblemente puede ser configurado a través de CLI. Ver detalles en ¿Cómo hace Android OS la resolución de nombres DNS? . Pero no hay manera de especificar el servidor DNS por cada aplicación.
Usando el VPNService API de Android es posible controlar el tráfico de la red en base a un UID (cada aplicación de Android posee un UID UNIX único). O con el acceso Root se puede lograr lo mismo usando iptables
al tráfico de la NAT que va al puerto 53
. Un ejemplo de aplicación de código abierto basada en VPN que permite hacer una lista blanca de aplicaciones y configurar el servidor DNS es personalDNSfilter (No tengo ninguna afiliación). Es suficientemente configurable y soporta el modo root, DNS encriptado (DoH, DoT) y otras características.
Sin embargo, en ambos casos (VPN o iptables
), no podrás usar la función de DNS privado (DoT) de Android. Es porque las consultas DoT (DNS sobre TLS) no son DNS plano (como HTTP) sino encriptado (como HTTPS), yendo a puerto 853
. Así que la única entidad que puede recibir y responder a las consultas de DNS encriptadas es el servidor DNS establecido en la configuración de DNS privado. Aunque es posible interceptar el DoT (como podemos interceptar el HTTPS) pero no vale la pena intentarlo.
Si no quieres ir con VPN o soluciones basadas en root, o no quieres dejar el DNS privado, otra opción es configurar el reenvío de DNS en la red local, preferiblemente en la puerta de enlace predeterminada si es posible. O tu aplicación debe tener la capacidad de hacer consultas de DNS por sí misma, sin depender de la solución de Android.