Le module résolveur DNS assure la protection des utilisateurs en cas d'interception DNS et les attaques de mise à jour de configuration, ainsi que l'amélioration des performances du réseau de résolution. Le module contient le code qui implémente le bouchon DNS résolveur, qui traduit les noms tels que www.google.com en adresses IP telles que 2001:db8::1. Le résolveur de bouchon DNS d'éléments d'API Java tels que InetAddress#getAllByName et Network#getAllByName, ainsi que fonctions de mise en réseau natives, et implémente l'envoi et la réception de requêtes DNS et la mise en cache des résultats.
Modifications apportées à Android 10
Sur les appareils équipés d'Android 9 ou version antérieure, le code du résolveur DNS est réparti
Bionic et netd
. Les résolutions DNS sont centralisées dans
Démon netd
permettant la mise en cache à l'échelle du système, tandis que les applications
appeler des fonctions (telles que getaddrinfo
) dans Bionic. La requête est envoyée
via un socket UNIX vers /dev/socket/dnsproxyd
vers
Le daemon netd
, qui analyse la requête et appelle
getaddrinfo
à nouveau pour émettre des résolutions DNS, puis met en cache les résultats.
afin que d'autres
applications puissent les utiliser. La mise en œuvre du résolveur DNS a été principalement
contenues dans bionic/libc/dns/
et partiellement dans
system/netd/server/dns
Android 10 déplace le code du résolveur DNS vers
system/netd/resolv,
le convertit en C++, puis le modernise et
refactoriser le code. Le code dans Bionic continue d'exister pour l'application
des raisons de compatibilité, mais elle n'est plus appelée par le système. Ces sources
les chemins d'accès sont affectés par la refactorisation:
bionic/libc/dns
system/netd/client
system/netd/server/dns
system/netd/server/DnsProxyListener
system/netd/server/ResolverController
system/netd/resolv
Format et dépendances
Le module du résolveur DNS ("com.android.resolv") est fourni
APEX et est associé dynamiquement par
netd
; Toutefois, netd
n'est pas
la dépendance lorsque le module diffuse le socket local
/dev/socket/dnsproxyd
. Le point de terminaison de liaison pour
la configuration du résolveur a été déplacée de netd
vers le résolveur,
Cela signifie que le service système peut appeler directement le module de résolveur
sans passer par netd
.
Le module du résolveur DNS dépend de libc
(Bionic) et
associe statiquement ses dépendances ; aucune autre bibliothèque n'est requise.
Résolution mDNS .local
Depuis novembre 2021, le résolveur Android prend en charge la résolution mDNS .local, qui implémente
"5.1 Requêtes DNS de multidiffusion à usage unique" dans RFC 6762 pour envoyer aveuglément des requêtes DNS standards
224.0.0.251:5353 ou [FF02::FB]:5353. La résolution mDNS est prise en charge en toute transparence
en appelant getaddrinfo()
avec un nom d'hôte se terminant par *.local
.
La résolution locale du mDNS améliore les fonctionnalités existantes de getaddrinfo()
pour obtenir les adresses. Si un périphérique prend en charge la résolution mDNS locale, le
L'API getaddrinfo()
envoie des requêtes mDNS à 224.0.0.251:5353 ou [FF02::FB]:5353
et renvoie les adresses locales. Si un appareil n'est pas compatible avec les fichiers .local mDNS
la méthode API getaddrinfo()
envoie une requête DNS au DNS
Google Cloud.
Le code est dans AOSP, situé dans packages/modules/DnsResolver
. Les utilisateurs peuvent conserver
conception mDNS actuelle pour obtenir les adresses, ou utilisez getaddrinfo()
à la place. Le comportement
cette fonctionnalité est comme une requête DNS ordinaire
envoyée aux adresses de multidiffusion mDNS. Cette fonctionnalité n'est associée à aucun
sur l'état du système.
Les utilisateurs peuvent utiliser la commande adb shell ping6 HOSTNAME.local
,
où HOSTNAME est le nom d'hôte d'un périphérique cible sur le réseau local, par exemple,
adb shell ping6 ipad.local
Les connexions VPN et de données mobiles sont exclues de la résolution .local.