DNS-преобразователь

Модуль 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.