O módulo DNS Resolver fornece proteção ao usuário contra interceptação de DNS e ataques de atualização de configuração e melhor desempenho de rede para resoluções de DNS. O módulo contém o código que implementa o resolvedor de stub DNS, que traduz nomes como www.google.com em endereços IP como 2001:db8::1 . O resolvedor de stub DNS suporta elementos da API Java, como InetAddress#getAllByName e Network#getAllByName , bem como funções de rede nativas , e implementa o envio e recebimento de consultas DNS e o armazenamento em cache dos resultados.
Mudanças no Android 10
Em dispositivos com Android 9 e inferior, o código do resolvedor de DNS está espalhado entre Bionic e netd
. As pesquisas de DNS são centralizadas no daemon netd
para permitir o cache de todo o sistema, enquanto os aplicativos chamam funções (como getaddrinfo
) no Bionic. A consulta é enviada por meio de um soquete UNIX para /dev/socket/dnsproxyd
para o daemon netd
, que analisa a solicitação e chama getaddrinfo
novamente para emitir pesquisas de DNS e, em seguida, armazena em cache os resultados para que outros aplicativos possam usá-los. A implementação do resolvedor DNS estava contida principalmente em bionic/libc/dns/
e parcialmente em system/netd/server/dns
.
O Android 10 move o código do resolvedor DNS para system/netd/resolv,
converte-o para C++ e, em seguida, moderniza e refatora o código. O código no Bionic continua existindo por motivos de compatibilidade do aplicativo, mas não é mais chamado pelo sistema. Esses caminhos de origem são afetados pela refatoração:
-
bionic/libc/dns
-
system/netd/client
-
system/netd/server/dns
-
system/netd/server/DnsProxyListener
-
system/netd/server/ResolverController
-
system/netd/resolv
Formato e dependências
O módulo DNS Resolver (`com.android.resolv`) é entregue como um arquivo APEX e é vinculado dinamicamente por netd
; no entanto, netd
não é uma dependência, pois o módulo atende diretamente ao soquete local /dev/socket/dnsproxyd
. O endpoint do Binder para a configuração do resolvedor foi movido de netd
para o resolvedor, o que significa que o serviço do sistema pode chamar diretamente para o módulo do resolvedor sem passar por netd
.
O módulo DNS Resolver depende da libc
(Bionic) e vincula estaticamente suas dependências; nenhuma outra biblioteca é necessária.
Resolução mDNS .local
A partir de novembro de 2021, o resolvedor Android oferece suporte à resolução mDNS .local, que implementa "5.1 Consultas DNS multicast One-Shot" na RFC 6762 para enviar consultas DNS padrão cegamente para 224.0.0.251:5353 ou [FF02::FB]:5353. A resolução mDNS é suportada de forma transparente chamando getaddrinfo()
com um nome de host terminando em *.local
.
A resolução mDNS .local aumenta a funcionalidade existente de getaddrinfo()
para obter os endereços. Se um dispositivo suportar resolução .local mDNS, a API getaddrinfo()
enviará consultas mDNS para 224.0.0.251:5353 ou [FF02::FB]:5353 e retornará os endereços locais. Se um dispositivo não suportar resolução .local mDNS, o método API getaddrinfo()
enviará uma consulta DNS ao servidor DNS.
O código está em AOSP, localizado em packages/modules/DnsResolver
. Os usuários podem manter seu design mDNS atual para obter os endereços ou usar getaddrinfo()
. O comportamento desse recurso é como uma consulta DNS normal enviada aos endereços multicast mDNS. Este recurso não tem impacto na integridade do sistema.
Os usuários podem usar o comando adb shell ping6 HOSTNAME .local
, onde HOSTNAME é o nome do host de um dispositivo de destino na LAN, por exemplo, adb shell ping6 ipad.local
.
Conexões VPN e de dados móveis são excluídas da resolução .local.