O módulo do resolvedor de DNS oferece proteção ao usuário contra ataques de atualização de configuração e interceptação de DNS, além de melhorar o desempenho da 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 para endereços IP como 2001:db8::1. O resolvedor de stubs do DNS oferece suporte a elementos da API Java, como InetAddress#getAllByName e Network#getAllByName, além de 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 o Android 9 e versões anteriores, o código do resolvedor de DNS é distribuído entre
Bionic e netd
. As pesquisas DNS são centralizadas no
daemon netd
para permitir o armazenamento em cache em todo o sistema, enquanto os apps
chamam funções (como getaddrinfo
) no Bionic. A consulta é enviada
por um socket UNIX para /dev/socket/dnsproxyd
ao
daemon netd
, que analisa a solicitação e chama
getaddrinfo
novamente para emitir pesquisas de DNS e, em seguida, armazena os resultados em cache
para que outros apps possam usá-los. A implementação do resolvedor de DNS estava principalmente
contida em bionic/libc/dns/
e parcialmente em
system/netd/server/dns
.
O Android 10 move o código do solucionador de DNS para
system/netd/resolv,
, o converte em C++, depois moderniza e
refatoriza o código. O código no Bionic continua existindo por motivos de
compatibilidade com o app, mas não é mais chamado pelo sistema. Estes caminhos de origem
são afetados pelo refatoring:
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 de resolução de DNS (`com.android.resolv`) é entregue como um
arquivo APEX e é vinculado dinamicamente por
netd
. No entanto, netd
não é uma
dependência, porque o módulo serve o socket local
/dev/socket/dnsproxyd
diretamente. 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 o módulo do resolvedor
sem passar por netd
.
O módulo de resolução de DNS depende de libc
(Bionic) e
vincula estaticamente as dependências. Nenhuma outra biblioteca é necessária.
Resolução .local mDNS
A partir de novembro de 2021, o resolvedor do Android oferece suporte à resolução .local do mDNS, que implementa
"5.1 One-Shot Multicast DNS Queries" no RFC 6762 para enviar consultas DNS padrão cegamente para
224.0.0.251:5353 ou [FF02::FB]:5353. A resolução mDNS é aceita de forma transparente
chamando getaddrinfo()
com um nome de host que termina em *.local
.
A resolução .local mDNS aumenta a funcionalidade atual de getaddrinfo()
para receber os endereços. Se um dispositivo oferecer suporte à resolução .local do mDNS, a
API getaddrinfo()
vai enviar consultas mDNS para 224.0.0.251:5353 ou [FF02::FB]:5353
e retornar os endereços locais. Se um dispositivo não oferecer suporte à resolução .local do mDNS, o método da API getaddrinfo()
vai enviar uma consulta DNS para o servidor DNS.
O código está no AOSP, localizado em packages/modules/DnsResolver
. Os usuários podem manter o
design atual de mDNS para receber os endereços ou usar getaddrinfo()
. O comportamento desse recurso é semelhante a uma consulta DNS regular enviada aos endereços multicast mDNS. Esse recurso não tem
efeito na integridade do sistema.
Os usuários podem usar o comando adb shell ping6 HOSTNAME.local
,
em que HOSTNAME é o nome do host de um dispositivo de destino na LAN, por exemplo,
adb shell ping6 ipad.local
.
As conexões de dados móveis e VPN são excluídas da resolução .local.