Модуль DNS Resolver обеспечивает защиту пользователей от перехвата DNS и атак обновления конфигурации, а также повышает производительность сети для разрешения DNS. Модуль содержит код, реализующий преобразователь заглушек DNS, который преобразует такие имена, как www.google.com , в IP-адреса, такие как 2001:db8::1 . Преобразователь заглушек DNS поддерживает такие элементы API Java, как InetAddress#getAllByName и Network#getAllByName , а также встроенные сетевые функции и реализует отправку и получение DNS-запросов и кэширование результатов.
Изменения в Android 10
На устройствах под управлением Android 9 и ниже код преобразователя DNS распространяется между Bionic и netd
. Поиск DNS централизован в netd
, чтобы обеспечить общесистемное кэширование, в то время как приложения вызывают функции (такие как getaddrinfo
) в Bionic. Запрос отправляется через сокет UNIX в /dev/socket/dnsproxyd
демону netd
, который анализирует запрос и снова вызывает getaddrinfo
для выполнения поиска DNS, а затем кэширует результаты, чтобы их могли использовать другие приложения. Реализация преобразователя DNS в основном содержалась в bionic/libc/dns/
и частично в system/netd/server/dns
.
Android 10 перемещает код преобразователя DNS в system/netd/resolv,
преобразует его в C++, а затем модернизирует и реорганизует код. Код в Bionic продолжает существовать по причинам совместимости приложений, но больше не вызывается системой. Эти исходные пути затронуты рефакторингом:
-
bionic/libc/dns
-
system/netd/client
-
system/netd/server/dns
-
system/netd/server/DnsProxyListener
-
system/netd/server/ResolverController
-
system/netd/resolv
Формат и зависимости
Модуль DNS Resolver поставляется в виде файла APEX и динамически подключается с помощью netd
; однако netd
не является зависимостью, так как модуль напрямую обслуживает локальный сокет /dev/socket/dnsproxyd
. Конечная точка Binder для конфигурации распознавателя была перемещена из netd
в распознаватель, что означает, что системная служба может напрямую обращаться к модулю распознавателя, не проходя через netd
.
Модуль DNS Resolver зависит от libc
(Bionic) и статически связывает его зависимости; никаких других библиотек не требуется.
mDNS .local разрешение
Начиная с ноября 2021 года преобразователь Android поддерживает разрешение mDNS .local, которое реализует «одноразовые многоадресные DNS-запросы 5.1» в RFC 6762 для слепой отправки стандартных DNS-запросов на 224.0.0.251:5353 или [FF02::FB]:5353. Разрешение mDNS прозрачно поддерживается вызовом getaddrinfo()
с именем хоста, оканчивающимся на *.local
.
Разрешение mDNS .local дополняет существующие функции getaddrinfo()
для получения адресов. Если устройство поддерживает разрешение mDNS .local, API getaddrinfo()
отправляет запросы mDNS на 224.0.0.251:5353 или [FF02::FB]:5353 и возвращает локальные адреса. Если устройство не поддерживает разрешение mDNS .local, метод API getaddrinfo()
отправляет DNS-запрос на DNS-сервер.
Код находится в AOSP, находится в packages/modules/DnsResolver
. Пользователи могут сохранить свой текущий дизайн mDNS для получения адресов или вместо этого использовать getaddrinfo()
. Поведение этой функции похоже на обычный DNS-запрос, отправляемый на многоадресные адреса mDNS. Эта функция не влияет на работоспособность системы.
Пользователи могут использовать команду adb shell ping6 HOSTNAME .local
, где HOSTNAME — это имя хоста целевого устройства в локальной сети, например, adb shell ping6 ipad.local
.
VPN и мобильные подключения для передачи данных исключены из разрешения .local.