DNS 解析器

DNS 解析器模組可讓使用者保護 DNS 攔截 和設定更新攻擊,並提升 DNS 的網路效能 解析度。模組包含實作 DNS 虛設常式的程式碼 解析器,藉此將 www.google.com 這類名稱轉譯為 IP 例如 2001:db8::1DNS 虛設常式解析器 Java API 元素,例如 InetAddress#getAllByNameNetwork#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 解析度範圍內。