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
不是依附元件,因為模組會直接為本機 Socket 服務 /dev/socket/dnsproxyd
。解析器設定的 Binder 端點已從 netd
移至解析器,這表示系統服務可以直接呼叫解析器模組,而無須經過 netd
。
DNS 解析器模組會依附 libc
(Bionic),並將其依附元件靜態連結;不需要其他程式庫。
mDNS .local 解析
自 2021 年 11 月起,Android 解析器支援 mDNS .local 解析功能,這項功能會實作 RFC 6762 中的「5.1 一次性多播 DNS 查詢」,以便盲目地將標準 DNS 查詢傳送至 224.0.0.251:5353 或 [FF02::FB]:5353。您可以呼叫 getaddrinfo()
並使用結尾為 *.local
的主機名稱,以便透明支援 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
。
.local 解析會排除 VPN 和行動數據連線。