DNS解析器

DNS 解析器模組為 DNS 攔截和設定更新攻擊提供使用者保護,並提高 DNS 解析的網路效能。此模組包含實作 DNS 存根解析器的程式碼,該解析器將諸如www.google.com之類的名稱轉換為諸如2001:db8::1之類的 IP 位址。 DNS 存根解析器支援 Java API 元素(例如InetAddress#getAllByNameNetwork#getAllByName )以及本機網路功能,並實作傳送和接收 DNS 查詢以及快取結果。

Android 10 的變化

在運行 Android 9 及更低版本的裝置上,DNS 解析器程式碼分佈在 Bionic 和netd中。 DNS 查找集中在netd守護程式中,以允許系統範圍的緩存,而應用程式則呼叫 Bionic 中的函數(例如getaddrinfo )。查詢透過 UNIX 套接字發送到/dev/socket/dnsproxydnetd守護程序,後者解析請求並再次呼叫getaddrinfo來發出 DNS 查找,然後快取結果,以便其他應用程式可以使用它們。 DNS 解析器實作主要包含在bionic/libc/dns/中,部分包含在system/netd/server/dns中。

Android 10 將 DNS 解析器程式碼移至system/netd/resolv,將其轉換為 C++,然後將程式碼現代化和重構。由於應用程式相容性原因,Bionic 中的程式碼繼續存在,但係統不再呼叫。這些源路徑受到重構的影響:

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener
  • system/netd/server/ResolverController
  • system/netd/resolv

格式和依賴關係

DNS 解析器模組 (`com.android.resolv`) 以APEX檔案形式提供,並由netd動態連結;但是, netd不是依賴項,因為該模組直接為本機套接字/dev/socket/dnsproxyd提供服務。解析器配置的 Binder 端點已從netd移至解析器,這表示系統服務可以直接呼叫解析器模組,而無需透過netd

DNS Resolver模組依賴libc (Bionic)並靜態連結其依賴項;不需要其他庫。

mDNS .本地解析

從2021 年11 月開始,Android 解析器支援mDNS .local 解析,它實現了RFC 6762 中的“5.1 One-Shot 多播DNS 查詢”,將標準DNS 查詢盲目發送到224.0.0.251:5353 或[FF02: :FB]:5353。透過使用以*.local結尾的主機名稱呼叫getaddrinfo()來透明地支援 mDNS 解析。

mDNS .local 解析增強了getaddrinfo()取得位址的現有功能。如果裝置支援 mDNS .local 解析,則getaddrinfo() API 會將 mDNS 查詢傳送至 224.0.0.251:5353 或 [FF02::FB]:5353 並傳回本機位址。如果設備不支援 mDNS .local 解析,則getaddrinfo() API 方法會向 DNS 伺服器發送 DNS 查詢。

程式碼位於 AOSP 中,位於packages/modules/DnsResolver中。使用者可以保留目前的 mDNS 設計來取得位址,或改用getaddrinfo() 。此功能的行為類似於發送到 mDNS 多播位址的常規 DNS 查詢。此功能對系統運作狀況沒有影響。

使用者可以使用指令adb shell ping6 HOSTNAME .local ,其中HOSTNAME是區域網路中目標設備的主機名,例如adb shell ping6 ipad.local

VPN 和行動數據連線不包含在 .local 解析中。