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

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