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.