DNS 解析器模組為 DNS 攔截和設定更新攻擊提供使用者保護,並提高 DNS 解析的網路效能。此模組包含實作 DNS 存根解析器的程式碼,該解析器將諸如www.google.com之類的名稱轉換為諸如2001:db8::1之類的 IP 位址。 DNS 存根解析器支援 Java API 元素(例如InetAddress#getAllByName和Network#getAllByName )以及本機網路功能,並實作傳送和接收 DNS 查詢以及快取結果。
Android 10 的變化
在運行 Android 9 及更低版本的裝置上,DNS 解析器程式碼分佈在 Bionic 和netd
中。 DNS 查找集中在netd
守護程式中,以允許系統範圍的緩存,而應用程式則呼叫 Bionic 中的函數(例如getaddrinfo
)。查詢透過 UNIX 套接字發送到/dev/socket/dnsproxyd
到netd
守護程序,後者解析請求並再次呼叫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 解析中。