DNS Çözümleyici

DNS çözümleyici modülü, DNS müdahalesi ve yapılandırma güncelleme saldırılarına karşı kullanıcı koruması sağlar ve DNS çözümleri için daha iyi ağ performansı sunar. Modül, www.google.com gibi adları 2001:db8::1 gibi IP adreslerine çeviren DNS stub çözümleyicisini uygulayan kodu içerir. DNS stub çözümleyici, InetAddress#getAllByName ve Network#getAllByName gibi Java API öğelerinin yanı sıra yerel ağ işlevlerini destekler ve DNS sorgularını gönderip alma ve sonuçları önbelleğe alma işlemlerini uygular.

Android 10'daki değişiklikler

Android 9 ve önceki sürümleri çalıştıran cihazlarda DNS çözümleyici kodu Bionic ve netd arasında dağıtılır. DNS aramaları, sistem genelinde önbelleğe alma işlemine izin vermek için netd daemon'unda merkezileştirilir. Uygulamalar ise Bionic'te işlevleri (getaddrinfo gibi) çağırır. Sorgu, UNIX soketi üzerinden /dev/socket/dnsproxyd'e, ardından netd daemon'ına gönderilir. Daemon, isteği ayrıştırır ve DNS aramaları yapmak için getaddrinfo'yi tekrar çağırır. Ardından, diğer uygulamaların kullanabilmesi için sonuçları önbelleğe alır. DNS çözümleyici uygulaması çoğunlukla bionic/libc/dns/ içinde ve kısmen system/netd/server/dns içindeydi.

Android 10, DNS çözümleyici kodunu system/netd/resolv, taşır, C++'ya dönüştürür, ardından kodu modernize eder ve yeniden yapılandırır. Bionic'teki kod, uygulama uyumluluğu nedeniyle var olmaya devam eder ancak artık sistem tarafından çağrılmaz. Aşağıdaki kaynak yollar yeniden yapılandırmadan etkilenir:

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

Biçim ve bağımlılıklar

DNS çözümleyici modülü ("com.android.resolv") APEX dosyası olarak yayınlanır ve netd tarafından dinamik olarak bağlanır. Ancak modül yerel soket /dev/socket/dnsproxyd'i doğrudan sunar. Bu nedenle netd, bağımlılık değildir. Çözümleyici yapılandırması için Binder uç noktası, netd'ten çözümleyiciye taşındı. Bu, sistem hizmetinin netd üzerinden geçmeden doğrudan çözümleyici modülüne çağrı gönderebileceği anlamına gelir.

DNS Çözümleyici modülü libc (Bionic) sürümüne bağlıdır ve bağımlılıklarını statik olarak bağlar. Başka kitaplık gerekmez.

mDNS .local çözümleme

Android çözümleyici, Kasım 2021'den itibaren mDNS .local çözümlemesini desteklemektedir. Bu çözümleme, standart DNS sorgularını 224.0.0.251:5353 veya [FF02::FB]:5353 adresine kör bir şekilde göndermek için RFC 6762'de "5.1 Tek seferlik çoklu yayın DNS sorguları"nı uygular. mDNS çözümlemesi, *.local ile biten bir ana makine adıyla getaddrinfo() çağrılarak şeffaf bir şekilde desteklenir.

mDNS .local çözümü, adresleri almak için getaddrinfo()'ün mevcut işlevini geliştirir. Bir cihaz mDNS .local çözümlemeyi destekliyorsa getaddrinfo() API, 224.0.0.251:5353 veya [FF02::FB]:5353 adresine mDNS sorguları gönderir ve yerel adresleri döndürür. Bir cihaz mDNS .local çözümlemeyi desteklemiyorsa getaddrinfo() API yöntemi DNS sunucusuna bir DNS sorgusu gönderir.

Kod, AOSP'de packages/modules/DnsResolver konumundadır. Kullanıcılar, adresleri almak için mevcut mDNS tasarımlarını koruyabilir veya bunun yerine getaddrinfo() kullanabilir. Bu özelliğin davranışı, mDNS çoklu yayın adreslerine gönderilen normal bir DNS sorgusuna benzer. Bu özelliğin sistem sağlığı üzerinde etkisi yoktur.

Kullanıcılar adb shell ping6 HOSTNAME.local komutunu kullanabilir. Bu komutta HOSTNAME, LAN'daki bir hedef cihazın ana makine adıdır (ör. adb shell ping6 ipad.local).

VPN ve mobil veri bağlantıları, .local çözümünden hariç tutulur.