Penyelesai DNS

Modul DNS Resolver memberikan perlindungan pengguna terhadap intersepsi DNS dan serangan pembaruan konfigurasi serta meningkatkan kinerja jaringan untuk resolusi DNS. Modul ini berisi kode yang mengimplementasikan pemecah rintisan DNS, yang menerjemahkan nama seperti www.google.com ke alamat IP seperti 2001:db8::1 . Penyelesai stub DNS mendukung elemen Java API seperti InetAddress#getAllByName dan Network#getAllByName , serta fungsi jaringan asli , dan mengimplementasikan pengiriman dan penerimaan kueri DNS serta menyimpan hasilnya dalam cache.

Perubahan di Android 10

Pada perangkat yang menjalankan Android 9 dan lebih rendah, kode penyelesai DNS tersebar di Bionic dan netd . Pencarian DNS dipusatkan di daemon netd untuk memungkinkan caching seluruh sistem, sementara aplikasi memanggil fungsi (seperti getaddrinfo ) di Bionic. Kueri dikirim melalui soket UNIX ke /dev/socket/dnsproxyd ke daemon netd , yang mem-parsing permintaan dan memanggil getaddrinfo lagi untuk mengeluarkan pencarian DNS, lalu menyimpan hasilnya dalam cache sehingga aplikasi lain dapat menggunakannya. Implementasi penyelesai DNS sebagian besar terdapat di bionic/libc/dns/ dan sebagian lagi di system/netd/server/dns .

Android 10 memindahkan kode penyelesai DNS ke system/netd/resolv, mengonversinya menjadi C++, lalu memodernisasi dan memfaktorkan ulang kode tersebut. Kode di Bionic tetap ada karena alasan kompatibilitas aplikasi, namun tidak lagi dipanggil oleh sistem. Jalur sumber berikut 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 ketergantungan

Modul DNS Resolver (`com.android.resolv`) dikirimkan sebagai file APEX dan dihubungkan secara dinamis oleh netd ; namun, netd bukan ketergantungan karena modul melayani soket lokal /dev/socket/dnsproxyd secara langsung. Titik akhir Binder untuk konfigurasi penyelesai dipindahkan dari netd ke penyelesai, artinya layanan sistem dapat memanggil langsung ke modul penyelesai tanpa melalui netd .

Modul DNS Resolver bergantung pada libc (Bionic) dan secara statis menghubungkan dependensinya; tidak diperlukan perpustakaan lain.

mDNS .resolusi lokal

Mulai November 2021, penyelesai Android mendukung resolusi lokal 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 mDNS .local menambah fungsionalitas getaddrinfo() yang ada untuk mendapatkan alamat. Jika perangkat mendukung resolusi lokal mDNS, maka API getaddrinfo() akan mengirimkan kueri mDNS ke 224.0.0.251:5353 atau [FF02::FB]:5353 dan mengembalikan alamat lokal. Jika perangkat tidak mendukung resolusi lokal mDNS, maka metode API getaddrinfo() akan mengirimkan kueri DNS ke server DNS.

Kodenya ada di AOSP, terletak di packages/modules/DnsResolver . Pengguna dapat mempertahankan desain mDNS mereka saat ini untuk mendapatkan alamatnya, atau menggunakan getaddrinfo() sebagai gantinya. Perilaku fitur ini seperti permintaan DNS biasa yang dikirim ke alamat multicast mDNS. Fitur ini tidak berdampak pada kesehatan sistem.

Pengguna dapat menggunakan perintah adb shell ping6 HOSTNAME .local , di mana HOSTNAME adalah nama host perangkat target di LAN, misalnya adb shell ping6 ipad.local .

Koneksi VPN dan data seluler tidak termasuk dalam resolusi .local.