DNS 解析器模組可讓使用者保護 DNS 攔截 和設定更新攻擊,並提升 DNS 的網路效能 解析度。模組包含實作 DNS 虛設常式的程式碼 解析器,藉此將 www.google.com 這類名稱轉譯為 IP 例如 2001:db8::1DNS 虛設常式解析器 Java API 元素,例如 InetAddress#getAllByName 和 Network#getAllByName 和 原生網路功能,並會將 接收 DNS 查詢並快取結果
Android 10 的異動
在搭載 Android 9 以下版本的裝置上,DNS 解析器程式碼會分散在
Bionic 和 netd
。DNS 查詢集中在
netd
Daemon 允許整個系統快取與應用程式
呼叫 Bionic 中的函式 (例如 getaddrinfo
)。查詢已送出
透過 UNIX 通訊端連上 /dev/socket/dnsproxyd
netd
Daemon,用於剖析要求和呼叫
再次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 解析器模組依附於 libc
(Bionic) 和
以靜態方式連結依附元件不需要其他程式庫
mDNS .local 解析
自 2021 年 11 月起,Android 解析器支援採用 mDNS .local 解析,且採用
「5.1 一次性多點傳送 DNS 查詢」執行 RFC 6762 逐一將標準 DNS 查詢傳送至
224.0.0.251:5353 或 [FF02::FB]:5353。透明支援 mDNS 解析服務
方法是使用結尾為 *.local
的主機名稱呼叫 getaddrinfo()
。
mDNS .local 解析功能可提升 getaddrinfo()
的現有功能
才能取得地址如果裝置支援 mDNS .local 解析度,
getaddrinfo()
API 會傳送 mDNS 查詢至 224.0.0.251:5353 或 [FF02::FB]:5353
然後傳回本機地址如果裝置不支援 mDNS .local
解析時間,則 getaddrinfo()
API 方法會將 DNS 查詢傳送至 DNS
伺服器
程式碼位於 Android 開放原始碼計畫,位於 packages/modules/DnsResolver
。使用者可以保留自己的
目前的 mDNS 設計來取得位址,或改用 getaddrinfo()
。當
這項功能就像傳送至 mDNS 多點傳送位址的一般 DNS 查詢一樣。此功能沒有
會對系統健康狀態的影響
使用者可使用 adb shell ping6 HOSTNAME.local
指令
其中 HOSTNAME 是 LAN 上目標裝置的主機名稱,例如
adb shell ping6 ipad.local
。
VPN 和行動數據連線不在 .local 解析度範圍內。