DNS-Resolver

Das DNS-Resolver-Modul bietet Benutzerschutz vor DNS-Abfang- und Konfigurationsaktualisierungsangriffen sowie eine verbesserte Netzwerkleistung für DNS-Auflösungen. Das Modul enthält den Code, der den DNS-Stub-Resolver implementiert, der Namen wie www.google.com in IP-Adressen wie 2001:db8::1 übersetzt. Der DNS-Stub-Resolver unterstützt Java-API-Elemente wie InetAddress#getAllByName und Network#getAllByName sowie native Netzwerkfunktionen und implementiert das Senden und Empfangen von DNS-Abfragen sowie das Zwischenspeichern der Ergebnisse.

Änderungen in Android 10

Auf Geräten mit Android 9 und niedriger ist der DNS-Resolver-Code auf Bionic und netd verteilt. DNS-Suchvorgänge werden im netd Daemon zentralisiert, um systemweites Caching zu ermöglichen, während Apps Funktionen (wie z. getaddrinfo ) in Bionic aufrufen. Die Abfrage wird über einen UNIX-Socket an /dev/socket/dnsproxyd an den netd Daemon gesendet, der die Anfrage analysiert und getaddrinfo erneut aufruft, um DNS-Lookups durchzuführen, und dann die Ergebnisse zwischenspeichert, damit andere Apps sie verwenden können. Die DNS-Resolver-Implementierung war größtenteils in bionic/libc/dns/ und teilweise in system/netd/server/dns enthalten.

Android 10 verschiebt den DNS-Resolver-Code nach system/netd/resolv, konvertiert ihn in C++ und modernisiert und überarbeitet den Code. Der Code in Bionic bleibt aus App-Kompatibilitätsgründen weiterhin bestehen, wird aber nicht mehr vom System aufgerufen. Diese Quellpfade sind von der Umgestaltung 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 geliefert und von netd dynamisch verknüpft; Allerdings ist netd keine Abhängigkeit, da das Modul den lokalen Socket /dev/socket/dnsproxyd direkt bedient. Der Binder-Endpunkt für die Resolver-Konfiguration wurde von netd zum Resolver verschoben, was bedeutet, dass der Systemdienst das Resolver-Modul direkt aufrufen kann, ohne netd zu durchlaufen.

Das DNS-Resolver-Modul hängt von libc (Bionic) ab und verknüpft seine Abhängigkeiten statisch; Es sind keine weiteren Bibliotheken erforderlich.

mDNS .lokale Auflösung

Ab November 2021 unterstützt der Android-Resolver die mDNS .local-Auflösung, die „5.1 One-Shot-Multicast-DNS-Abfragen“ in RFC 6762 implementiert, um Standard-DNS-Abfragen blind an 224.0.0.251:5353 oder [FF02::FB]:5353 zu senden. Die mDNS-Auflösung wird transparent unterstützt, indem getaddrinfo() mit einem Hostnamen aufgerufen wird, der auf *.local endet.

Die mDNS .local-Auflösung erweitert die bestehende Funktionalität von getaddrinfo() zum Abrufen der Adressen. Wenn ein Gerät die mDNS-.local-Auflösung unterstützt, sendet die getaddrinfo() -API mDNS-Abfragen an 224.0.0.251:5353 oder [FF02::FB]:5353 und gibt die lokalen Adressen zurück. Wenn ein Gerät die lokale mDNS-Auflösung nicht unterstützt, sendet die API-Methode getaddrinfo() eine DNS-Abfrage an den DNS-Server.

Der Code befindet sich in AOSP unter packages/modules/DnsResolver . Benutzer können ihr aktuelles mDNS-Design beibehalten, um die Adressen abzurufen, oder stattdessen getaddrinfo() verwenden. Das Verhalten dieser Funktion ähnelt einer normalen DNS-Abfrage, die an die mDNS-Multicast-Adressen gesendet wird. Diese Funktion hat keine Auswirkungen auf den Systemzustand.

Benutzer können den Befehl adb shell ping6 HOSTNAME .local verwenden, wobei HOSTNAME der Hostname eines Zielgeräts im LAN ist, zum Beispiel adb shell ping6 ipad.local .

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