Il modulo DNS Resolver fornisce agli utenti protezione contro gli attacchi di intercettazione DNS e di aggiornamento della configurazione e migliora le prestazioni della rete per le risoluzioni DNS. Il modulo contiene il codice che implementa il resolver stub DNS, che traduce nomi come www.google.com in indirizzi IP come 2001:db8::1. Il resolver stub DNS supporta elementi dell'API Java come InetAddress#getAllByName e Network#getAllByName, nonché funzioni di rete native, e implementa l'invio e la ricezione di query DNS e la memorizzazione nella cache dei risultati.
Modifiche in Android 10
Sui dispositivi con Android 9 e versioni precedenti, il codice del resolver DNS è distribuito su Bionic e netd
. Le ricerche DNS sono centralizzate nel daemon netd
per consentire la memorizzazione nella cache a livello di sistema, mentre le app chiamano funzioni (ad esempio getaddrinfo
) in Bionic. La query viene inviata tramite una socket UNIX a /dev/socket/dnsproxyd
al daemon netd
, che analizza la richiesta e richiama nuovamente getaddrinfo
per eseguire ricerche DNS, quindi memorizza nella cache i risultati in modo che altre app possano utilizzarli. L'implementazione del resolver DNS era principalmente contenuta in bionic/libc/dns/
e in parte in system/netd/server/dns
.
Android 10 sposta il codice del risolutore DNS in system/netd/resolv,
, lo converte in C++, quindi lo modernizza e lo esegue refactoring. Il codice in Bionic continua a esistere per motivi di compatibilità con le app, ma non viene più chiamato dal sistema. Questi percorsi di origine sono interessati dal refactoring:
bionic/libc/dns
system/netd/client
system/netd/server/dns
system/netd/server/DnsProxyListener
system/netd/server/ResolverController
system/netd/resolv
Formato e dipendenze
Il modulo DNS Resolver ("com.android.resolv") viene fornito come
file APEX ed è collegato dinamicamente da
netd
; tuttavia, netd
non è una
dipendenza in quanto il modulo serve direttamente la socket locale
/dev/socket/dnsproxyd
. L'endpoint Binder per la configurazione del resolver è stato spostato da netd
al resolver, il che significa che il servizio di sistema può chiamare direttamente il modulo del resolver senza passare per netd
.
Il modulo DNS Resolver dipende da libc
(Bionic) e collega staticamente le sue dipendenze. Non sono richieste altre librerie.
Risoluzione .local mDNS
A partire da novembre 2021, il resolver Android supporta la risoluzione mDNS .local, che implementa "5.1 One-Shot multicast DNS Queries" in RFC 6762 per inviare query DNS standard in modo non attendibile a 224.0.0.251:5353 o [FF02::FB]:5353. La risoluzione mDNS è supportata in modo trasparente chiamando getaddrinfo()
con un nome host che termina con *.local
.
La risoluzione mDNS .local amplia la funzionalità esistente di getaddrinfo()
per ottenere gli indirizzi. Se un dispositivo supporta la risoluzione .local mDNS, l'API getaddrinfo()
invia query mDNS a 224.0.0.251:5353 o [FF02::FB]:5353 e restituisce gli indirizzi locali. Se un dispositivo non supporta la risoluzione mDNS .local, il metodo dell'API getaddrinfo()
invia una query DNS al server DNS.
Il codice è in AOSP, in packages/modules/DnsResolver
. Gli utenti possono mantenere il design mDNS corrente per ottenere gli indirizzi oppure utilizzare getaddrinfo()
. Il comportamento di questa funzionalità è simile a una normale query DNS inviata agli indirizzi multicast mDNS. Questa funzionalità non influisce sullo stato del sistema.
Gli utenti possono utilizzare il comando adb shell ping6 HOSTNAME.local
,
dove HOSTNAME è il nome host di un dispositivo di destinazione sulla LAN, ad esempio
adb shell ping6 ipad.local
.
Le connessioni VPN e dati mobili sono escluse dalla risoluzione .local.