Модуль DNS Resolver обеспечивает защиту пользователей от перехвата DNS и атак обновления конфигурации, а также повышает производительность сети для разрешения DNS. Модуль содержит код, реализующий преобразователь заглушки DNS, который преобразует такие имена, как www.google.com, в IP-адреса, например 2001:db8::1 . Распознаватель DNS-заглушек поддерживает элементы Java API, такие как 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 (com.android.resolv) поставляется в виде файла APEX и динамически связывается с помощью netd
; однако netd
не является зависимостью, поскольку модуль напрямую обслуживает локальный сокет /dev/socket/dnsproxyd
. Конечная точка Binder для конфигурации преобразователя была перенесена из netd
в преобразователь, а это означает, что системная служба может вызывать непосредственно модуль преобразователя, минуя netd
.
Модуль DNS Resolver зависит от libc
(Bionic) и статически связывает его зависимости; никакие другие библиотеки не требуются.
mDNS .local разрешение
Начиная с ноября 2021 года преобразователь Android поддерживает разрешение mDNS .local, которое реализует «5.1 одноразовые многоадресные DNS-запросы» в 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.