DNS Resolver

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.