resolver DNS

Il modulo resolver DNS offre protezione all'utente per l'intercettazione DNS e aggiornamenti della configurazione, nonché un miglioramento delle prestazioni di rete per DNS risoluzioni. Il modulo contiene il codice che implementa lo stub DNS resolver, che traduce nomi quali www.google.com in IP come 2001:db8::1. Il resolver stub DNS esegue il backup Elementi dell'API Java come InetAddress#getAllByName e Network#getAllByName e funzioni di networking native e implementa l'invio e la riceve query DNS e memorizza i risultati nella cache.

Modifiche in Android 10

Sui dispositivi con Android 9 e versioni precedenti, il codice resolver DNS è distribuito Bionico e netd. Le ricerche DNS sono centralizzate netd daemon per consentire la memorizzazione nella cache a livello di sistema, mentre le app funzioni di chiamata (ad esempio getaddrinfo) in Bionic. La query viene inviata tramite un socket UNIX per /dev/socket/dnsproxyd al netd daemon, che analizza la richiesta e le chiamate getaddrinfo per eseguire di nuovo ricerche DNS, quindi memorizza i risultati nella cache in modo che altre app possano usarle. L'implementazione del resolver DNS era per lo più contenuto in bionic/libc/dns/ e in parte system/netd/server/dns.

Android 10 sposta il codice del resolver DNS in system/netd/resolv, lo converte in C++, quindi modernizza e esegue il refactoring del codice. Il codice in Bionic continua a esistere per l'app per motivi di compatibilità, ma non viene più chiamato dal sistema. Queste fonti 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 resolver DNS ("com.android.resolv") viene fornito come APEX ed è collegato dinamicamente da netd; tuttavia, netd non è un quando il modulo gestisce il socket locale /dev/socket/dnsproxyd direttamente. L'endpoint Binder per la configurazione del resolver è stata spostata da netd al resolver vale a dire che il servizio di sistema può chiamare direttamente il modulo resolver senza passare per netd.

Il modulo resolver DNS dipende da libc (Bionic) e collega staticamente le sue dipendenze; non sono necessarie altre librerie.

Risoluzione .local mDNS

A partire da novembre 2021, il resolver Android supporta la risoluzione .local mDNS, che implementa "5.1 Query DNS multicast One-Shot" in RFC 6762 per inviare automaticamente query DNS standard 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 .local mDNS aumenta la funzionalità esistente di getaddrinfo() per ottenere gli indirizzi. Se un dispositivo supporta la risoluzione .local mDNS, il L'API getaddrinfo() invia le query mDNS a 224.0.0.251:5353 o [FF02::FB]:5353 e restituisce gli indirizzi locali. Se un dispositivo non supporta mDNS .local risoluzione del problema, il metodo API getaddrinfo() invia una query DNS al DNS o server web.

Il codice è in formato AOSP, si trova in packages/modules/DnsResolver. Gli utenti possono mantenere design mDNS attuale per ottenere gli indirizzi oppure usa getaddrinfo(). Il comportamento di Questa funzionalità è simile a una normale query DNS inviata agli indirizzi multicast mDNS. Questa funzione non ha l'impatto sull'integrità del sistema.

Gli utenti possono usare 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 dati mobili e VPN sono escluse dalla risoluzione .local.