Modul DNS Resolver memberikan perlindungan pengguna terhadap serangan pembaruan konfigurasi dan intersepsi DNS serta meningkatkan performa jaringan untuk resolusi DNS. Modul ini berisi kode yang mengimplementasikan resolver stub DNS, yang menerjemahkan nama seperti www.google.com menjadi alamat IP seperti 2001:db8::1. Resolver stub DNS mendukung elemen API Java seperti InetAddress#getAllByName dan Network#getAllByName, serta fungsi jaringan native, dan menerapkan pengiriman dan penerimaan kueri DNS serta meng-cache hasilnya.
Perubahan di Android 10
Pada perangkat yang menjalankan Android 9 dan yang lebih lama, kode DNS resolver tersebar di
Bionic dan netd
. Penelusuran DNS dipusatkan di
daemon netd
untuk memungkinkan penyimpanan dalam cache 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 memanggil
getaddrinfo
lagi untuk melakukan pencarian DNS, lalu meng-cache hasilnya
sehingga aplikasi lain dapat menggunakannya. Implementasi DNS resolver sebagian besar
terdapat dalam bionic/libc/dns/
dan sebagian dalam
system/netd/server/dns
.
Android 10 memindahkan kode DNS resolver ke
system/netd/resolv,
yang mengonversinya ke C++, lalu memodernisasi dan
memfaktorkan ulang kode. Kode di Bionic akan terus ada karena alasan
kompatibilitas aplikasi, tetapi tidak lagi dipanggil oleh sistem. Jalur sumber
ini terpengaruh 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
file APEX dan ditautkan secara dinamis oleh
netd
; Namun, netd
bukan
dependensi karena modul menayangkan socket lokal
/dev/socket/dnsproxyd
secara langsung. Endpoint Binder untuk
konfigurasi resolver dipindahkan dari netd
ke resolver,
yang berarti bahwa layanan sistem dapat memanggil langsung ke modul resolver
tanpa melalui netd
.
Modul DNS Resolver bergantung pada libc
(Bionic) dan
menautkan dependensinya secara statis; tidak diperlukan library lain.
Resolusi .local mDNS
Mulai November 2021, resolver Android mendukung resolusi .local mDNS, yang mengimplementasikan
"5.1 One-Shot multicast DNS Queries" di RFC 6762 untuk mengirim kueri DNS standar secara membabi buta ke
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 ada
untuk mendapatkan alamat. Jika perangkat mendukung resolusi .local mDNS, getaddrinfo()
API akan mengirim kueri mDNS ke 224.0.0.251:5353 atau [FF02::FB]:5353
dan menampilkan alamat lokal. Jika perangkat tidak mendukung resolusi mDNS .local, metode getaddrinfo()
API akan mengirim kueri DNS ke server DNS.
Kode ini ada di AOSP, yang terletak di packages/modules/DnsResolver
. Pengguna dapat mempertahankan
desain mDNS saat ini untuk mendapatkan alamat, atau menggunakan getaddrinfo()
. Perilaku
fitur ini seperti kueri DNS reguler yang dikirim ke alamat multicast mDNS. Fitur ini tidak
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 VPN dan data seluler dikecualikan dari resolusi .local.