DNS Resolver 模塊為 DNS 攔截和配置更新攻擊提供用戶保護,並提高了 DNS 解析的網絡性能。該模塊包含實現 DNS 存根解析器的代碼,它將諸如www.google.com之類的名稱轉換為諸如2001:db8::1之類的 IP 地址。 DNS 存根解析器支持InetAddress#getAllByName和Network#getAllByName等 Java API 元素以及本機網絡功能,並實現發送和接收 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/libc/dns
-
system/netd/client
-
system/netd/server/dns
-
system/netd/server/DnsProxyListener
-
system/netd/server/ResolverController
-
system/netd/resolv
格式和依賴
DNS Resolver 模塊以APEX文件的形式交付,並由netd
動態鏈接;但是, netd
不是依賴項,因為該模塊直接為本地套接字/dev/socket/dnsproxyd
提供服務。解析器配置的 Binder 端點已從netd
移至解析器,這意味著系統服務可以直接調用解析器模塊,而無需通過netd
。
DNS Resolver 模塊依賴於libc
(Bionic) 並靜態鏈接其依賴關係;不需要其他庫。
mDNS .local 解析
從 2021 年 11 月開始,Android 解析器支持 mDNS .local 解析,實現 RFC 6762 中的“5.1 One-Shot multicast DNS Queries”,將標準 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 解析中。