Pemecah DNS

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

Perubahan di Android 10

Pada perangkat yang menjalankan Android 9 dan lebih rendah, kode resolver DNS 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 mem-parsing permintaan dan memanggil getaddrinfo lagi untuk mengeluarkan pencarian DNS, lalu menyimpan hasilnya di cache sehingga aplikasi lain dapat menggunakannya. Implementasi resolver DNS sebagian besar terdapat di bionic/libc/dns/ dan sebagian lagi di system/netd/server/dns .

Android 10 memindahkan kode resolver DNS ke system/netd/resolv, mengonversinya ke C++, lalu memodernisasi dan memfaktorkan ulang kode. Kode di Bionic tetap ada karena alasan kompatibilitas aplikasi, tetapi tidak lagi dipanggil oleh sistem. Jalur sumber ini 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 dikirimkan sebagai file APEX dan ditautkan secara dinamis oleh netd ; namun, netd bukan ketergantungan karena modul melayani soket lokal /dev/socket/dnsproxyd secara langsung. Titik akhir Binder untuk konfigurasi resolver dipindahkan dari netd ke resolver, artinya layanan sistem dapat memanggil langsung ke modul resolver tanpa melalui netd .

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

mDNS .resolusi lokal

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 .

mDNS .local resolution menambah fungsionalitas getaddrinfo() yang 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 resolusi .local mDNS, maka metode getaddrinfo() API mengirimkan kueri DNS ke server DNS.

Kodenya ada di AOSP, terletak di packages/modules/DnsResolver . Pengguna dapat menyimpan desain mDNS mereka saat ini untuk mendapatkan alamat, atau menggunakan getaddrinfo() sebagai gantinya. Perilaku fitur ini seperti kueri 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 .

VPN dan koneksi data seluler dikecualikan dari resolusi .local.