Modul DNS Resolver memberikan perlindungan pengguna untuk intersepsi DNS serangan pembaruan konfigurasi dan meningkatkan performa jaringan untuk DNS resolusi. Modul ini berisi kode yang menerapkan stub DNS resolver, yang menerjemahkan nama seperti www.google.com menjadi IP alamat seperti 2001:db8::1. DNS resolver menggunakan kembali Elemen Java API seperti InetAddress#getAllByName dan Network#getAllByName, serta fungsi jaringan native, dan menerapkan menerima kueri DNS dan menyimpan hasilnya dalam {i>cache<i}.
Perubahan di Android 10
Pada perangkat yang menjalankan Android 9 dan yang lebih rendah, kode DNS resolver tersebar di
Bionic dan netd
. Pencarian DNS dipusatkan di
Daemon netd
untuk memungkinkan caching di seluruh sistem, sementara aplikasi
memanggil fungsi (seperti getaddrinfo
) di Bionic. Kueri dikirim
melalui soket UNIX ke /dev/socket/dnsproxyd
ke
Daemon netd
, yang mengurai permintaan dan panggilan
getaddrinfo
lagi untuk melakukan pencarian DNS, lalu menyimpan hasilnya ke cache
sehingga aplikasi lain dapat menggunakannya. Implementasi DNS {i>resolver<i} sebagian besar
terdapat dalam bionic/libc/dns/
dan sebagian lagi dalam
system/netd/server/dns
.
Android 10 memindahkan kode DNS resolver ke
system/netd/resolv,
mengonversinya menjadi C++, lalu memodernisasi dan
memfaktorkan ulang kode. Kode dalam Bionic terus ada untuk aplikasi
kompatibilitas mundur, tetapi tidak lagi dipanggil oleh sistem. Sumber ini
jalur dipengaruhi oleh pemfaktoran ulang:
bionic/libc/dns
system/netd/client
system/netd/server/dns
system/netd/server/DnsProxyListener
system/netd/server/ResolverController
system/netd/resolv
Format dan dependensi
Modul DNS Resolver (`com.android.resolv`) dikirim sebagai
APEX dan ditautkan secara dinamis oleh
netd
; namun, netd
bukan
dependensi karena modul menyalurkan soket lokal
/dev/socket/dnsproxyd
secara langsung. Endpoint Binder untuk
konfigurasi resolver dipindahkan dari netd
ke resolver,
yang berarti layanan sistem dapat memanggil
langsung ke modul resolver
tanpa melalui netd
.
Modul DNS Resolver bergantung pada libc
(Bionic) dan
menghubungkan dependensinya secara statis; library lain tidak diperlukan.
Resolusi .local mDNS
Mulai November 2021, resolver Android mendukung resolusi .local mDNS, yang menerapkan
"5.1 Kueri DNS multicast Satu Kali" di RFC 6762 untuk mengirim
kueri DNS standar secara membabi buta
224.0.0.251:5353 atau [FF02::FB]:5353. Resolusi mDNS didukung secara transparan
dengan memanggil getaddrinfo()
dengan nama host yang diakhiri dengan *.local
.
Resolusi .local mDNS meningkatkan fungsi getaddrinfo()
yang sudah ada
untuk mendapatkan alamat. Jika perangkat mendukung resolusi .local mDNS, maka
getaddrinfo()
API mengirimkan kueri mDNS ke 224.0.0.251:5353 atau [FF02::FB]:5353
dan mengembalikan
alamat lokal. Jika perangkat tidak mendukung mDNS .local
resolusi, maka metode API getaddrinfo()
akan mengirimkan kueri DNS ke DNS
server tertentu.
Kode ini ada di AOSP, yang terletak di packages/modules/DnsResolver
. Pengguna dapat tetap
desain mDNS saat ini untuk mendapatkan alamat, atau gunakan getaddrinfo()
sebagai gantinya. Perilaku
fitur ini seperti kueri DNS biasa
yang dikirim ke alamat multicast {i>mDNS<i}. Fitur ini tidak memiliki
berdampak pada kesehatan sistem.
Pengguna dapat menggunakan perintah adb shell ping6 HOSTNAME.local
,
dengan HOSTNAME adalah nama host perangkat target di LAN, misalnya,
adb shell ping6 ipad.local
.
Koneksi data seluler dan VPN tidak disertakan dalam resolusi .local.