Resolver DNS

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.