Résolveur DNS

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.