La résolution DNS dans Android est gérée par Net Daemon ( netd
) qui s'exécute en arrière-plan en tant que init
service. netd
utilise le serveur DNS défini dans les paramètres Wi-Fi ou celui reçu par DHCP. Il peut également être défini via le CLI. Voir les détails dans Comment le système d'exploitation Android assure-t-il la résolution des noms DNS ? . Mais il n'y a aucun moyen de spécifier le serveur DNS pour chaque application.
En utilisant l'API VPNService d'Android, il est possible de contrôler le trafic réseau par UID (chaque application Android possède un UID UNIX unique). Ou avec un accès Root, la même chose peut être réalisée en utilisant iptables
pour le trafic NAT allant sur le port 53
. Un exemple d'application open-source basée sur le VPN qui permet d'établir une liste blanche des applications et de configurer le serveur DNS est le suivant personalDNSfilter (Je n'ai aucune affiliation). Il est suffisamment configurable et supporte le mode Root, les DNS cryptés (DoH, DoT) et d'autres fonctionnalités.
Cependant, dans les deux cas (VPN ou iptables
), vous ne pourrez pas utiliser la fonction de DNS privé (DoT) d'Android. En effet, les requêtes DoT (DNS over TLS) ne sont pas des requêtes DNS simples (comme HTTP) mais cryptées (comme HTTPS), allant sur le port 853
. Ainsi, la seule entité qui peut recevoir les requêtes DNS cryptées et y répondre est le serveur DNS défini dans les paramètres DNS privés. Bien qu'il soit possible d'intercepter DoT (comme nous pouvons intercepter HTTPS), les tracas ne valent pas la peine d'être essayés.
Si vous ne voulez pas opter pour des solutions basées sur le VPN ou la racine, ou si vous ne voulez pas abandonner le DNS privé, une autre option consiste à configurer un transitaire DNS sur le réseau local, de préférence sur la passerelle par défaut si possible. Ou bien votre application doit elle-même avoir la capacité de faire des requêtes DNS, sans dépendre du résolveur d'Android.