Rozpoznawanie DNS

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Moduł DNS Resolver zapewnia ochronę użytkownika przed przechwyceniem DNS i aktualizacjami konfiguracji oraz poprawioną wydajność sieci dla rozdzielczości DNS. Moduł zawiera kod implementujący DNS stub resolver, który tłumaczy nazwy takie jak www.google.com na adresy IP takie jak 2001:db8::1 . Przelicznik pośredniczący DNS obsługuje elementy Java API, takie jak InetAddress#getAllByName i Network#getAllByName , a także natywne funkcje sieciowe i implementuje wysyłanie i odbieranie zapytań DNS oraz buforowanie wyników.

Zmiany w Androidzie 10

Na urządzeniach z Androidem 9 i starszym kod rozpoznawania nazw DNS jest rozłożony na Bionic i netd . Wyszukiwania DNS są scentralizowane w demonie netd , aby umożliwić buforowanie całego systemu, podczas gdy aplikacje wywołują funkcje (takie jak getaddrinfo ) w Bionic. Zapytanie jest wysyłane przez gniazdo UNIX do /dev/socket/dnsproxyd do demona netd , który analizuje żądanie i ponownie wywołuje getaddrinfo w celu przeprowadzenia wyszukiwania DNS, a następnie buforuje wyniki, aby inne aplikacje mogły z nich korzystać. Implementacja przelicznika DNS była w większości zawarta w bionic/libc/dns/ i częściowo w system/netd/server/dns .

Android 10 przenosi kod programu rozpoznawania nazw DNS do system/netd/resolv, konwertuje go na C++, a następnie modernizuje i refaktoryzuje kod. Kod w Bionic nadal istnieje ze względu na kompatybilność aplikacji, ale nie jest już wywoływany przez system. Refaktoryzacja ma wpływ na te ścieżki źródłowe:

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener
  • system/netd/server/ResolverController
  • system/netd/resolv

Format i zależności

Moduł DNS Resolver (`com.android.resolv`) jest dostarczany jako plik APEX i jest dynamicznie łączony przez netd ; jednak netd nie jest zależnością, ponieważ moduł obsługuje bezpośrednio lokalne gniazdo /dev/socket/dnsproxyd . Punkt końcowy Binder dla konfiguracji przelicznika został przeniesiony z netd do przelicznika, co oznacza, że ​​usługa systemowa może wywołać bezpośrednio moduł przelicznika bez przechodzenia przez netd .

Moduł DNS Resolver zależy od libc (Bionic) i statycznie łączy jego zależności; żadne inne biblioteki nie są wymagane.

mDNS .lokalna rozdzielczość

Od listopada 2021 r. przelicznik dla systemu Android obsługuje rozdzielczość mDNS .local, która implementuje „5.1 One-Shot multicast DNS Queries” w RFC 6762, aby wysyłać standardowe zapytania DNS na ślepo do 224.0.0.251:5353 lub [FF02::FB]:5353. Rozdzielczość mDNS jest przezroczyście obsługiwana przez wywołanie getaddrinfo() z nazwą hosta kończącą się na *.local .

Rozdzielczość mDNS .local rozszerza istniejącą funkcjonalność getaddrinfo() w celu uzyskania adresów. Jeśli urządzenie obsługuje rozdzielczość mDNS .local, wówczas funkcja API getaddrinfo() wysyła zapytania mDNS do 224.0.0.251:5353 lub [FF02::FB]:5353 i zwraca adresy lokalne. Jeśli urządzenie nie obsługuje rozdzielczości mDNS .local, metoda API getaddrinfo() wysyła zapytanie DNS do serwera DNS.

Kod znajduje się w AOSP, znajdującym się w packages/modules/DnsResolver . Użytkownicy mogą zachować swój obecny projekt mDNS, aby uzyskać adresy, lub zamiast tego użyć getaddrinfo() . Zachowanie tej funkcji przypomina zwykłe zapytanie DNS wysyłane na adresy multiemisji mDNS. Ta funkcja nie ma wpływu na kondycję systemu.

Użytkownicy mogą użyć polecenia adb shell ping6 HOSTNAME .local , gdzie HOSTNAME to nazwa hosta urządzenia docelowego w sieci LAN, na przykład adb shell ping6 ipad.local .

Połączenia VPN i mobilne połączenia danych są wyłączone z rozdzielczości .local.