DNS-Resolver

Das DNS-Resolver-Modul bietet Nutzerschutz beim Abfangen von DNS und Angriffe auf Konfigurationsupdates sowie verbesserte Netzwerkleistung für DNS Lösungen zu finden. Das -Modul enthält den Code, der den DNS-Stub implementiert Resolver, der Namen wie www.google.com in IP-Adressen umwandelt Adressen wie 2001:db8::1. Der DNS-Stub-Resolver liefert Java API-Elemente wie InetAddress#getAllByName und Network#getAllByName sowie native Netzwerkfunktionen und implementiert das Senden und um DNS-Abfragen zu erhalten und die Ergebnisse im Cache zu speichern.

Änderungen bei Android 10

Auf Geräten mit Android 9 und niedriger wird der DNS-Resolver-Code Bionic und netd. DNS-Lookups sind zentral in der netd-Daemon für systemweites Caching, während Anwendungen Funktionen wie getaddrinfo in Bionic aufrufen. Die Abfrage wird gesendet über einen UNIX-Socket auf /dev/socket/dnsproxyd netd-Daemon, der die Anfrage analysiert und aufruft getaddrinfo erneut, um DNS-Lookups auszugeben, und speichert dann die Ergebnisse im Cache damit andere Apps sie verwenden können. Die Implementierung des DNS-Resolvers in bionic/libc/dns/ und teilweise in system/netd/server/dns.

Der DNS-Resolver-Code wird von Android 10 system/netd/resolv, konvertiert sie in C++, modernisiert sie dann und refaktoriert den Code. Der Code in Bionic existiert weiterhin für die App aus Gründen der Kompatibilität, wird aber nicht mehr vom System aufgerufen. Diese Quelle Pfade sind von der Refaktorierung betroffen:

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener
  • system/netd/server/ResolverController
  • system/netd/resolv

Format und Abhängigkeiten

Das DNS-Resolver-Modul („com.android.resolv“) wird als APEX-Datei und wird dynamisch verknüpft durch netd; netd ist jedoch kein Abhängigkeit, da das Modul den lokalen Socket bedient /dev/socket/dnsproxyd direkt. Der Binder-Endpunkt für die Die Resolver-Konfiguration wurde von netd in den Resolver verschoben. Das bedeutet, dass der Systemdienst direkt in das Resolver-Modul ohne netd zu durchlaufen.

Das DNS-Resolver-Modul hängt von libc (Bionic) und seine Abhängigkeiten statisch verknüpft; werden keine weiteren Bibliotheken benötigt.

mDNS-Auflösung mit .local

Seit November 2021 unterstützt der Android-Resolver die mDNS-Auflösung von .local, bei der Folgendes implementiert wird: „5.1 One-Shot-Multicast-DNS-Abfragen“ in RFC 6762, um DNS-Standardabfragen blind an 224.0.0.251:5353 oder [FF02::FB]:5353. mDNS-Auflösung wird transparent unterstützt Durch Aufrufen von getaddrinfo() mit einem Hostnamen, der auf *.local endet

mDNS-Auflösung mit .local erweitert die vorhandenen Funktionen von getaddrinfo() um die Adressen zu erhalten. Wenn ein Gerät die Auflösung „mDNS .local“ unterstützt, gilt Folgendes: Die getaddrinfo() API sendet mDNS-Abfragen an 224.0.0.251:5353 oder [FF02::FB]:5353. und gibt die lokalen Adressen zurück. Geräte, die mDNS .local nicht unterstützen lösen, sendet die API-Methode getaddrinfo() eine DNS-Abfrage an das DNS Server.

Der Code befindet sich in AOSP (packages/modules/DnsResolver). Nutzer können ihre aktuelles mDNS-Design, um die Adressen abzurufen, oder verwende stattdessen getaddrinfo(). Das Verhalten von Diese Funktion ist wie eine normale DNS-Abfrage, die an die mDNS-Multicast-Adressen gesendet wird. Diese Funktion hat keine Auswirkungen auf den Systemzustand.

Nutzer können den Befehl adb shell ping6 HOSTNAME.local verwenden, Dabei ist HOSTNAME der Hostname eines Zielgeräts im LAN, z. B. adb shell ping6 ipad.local

VPN- und mobile Datenverbindungen sind von der .local-Auflösung ausgeschlossen.