DNS解析器

DNS Resolver 模塊為 DNS 攔截和配置更新攻擊提供用戶保護,並提高了 DNS 解析的網絡性能。該模塊包含實現 DNS 存根解析器的代碼,它將諸如www.google.com之類的名稱轉換為諸如2001:db8::1之類的 IP 地址。 DNS 存根解析器支持InetAddress#getAllByNameNetwork#getAllByName等 Java API 元素以及本機網絡功能,並實現發送和接收 DNS 查詢並緩存結果。

Android 10 的變化

在運行 Android 9 及更低版本的設備上,DNS 解析器代碼分佈在 Bionic 和netd中。 DNS 查找集中在netd守護程序中,以允許系統範圍的緩存,而應用程序調用 Bionic 中的函數(例如getaddrinfo )。查詢通過 UNIX 套接字發送到/dev/socket/dnsproxydnetd守護程序,該守護程序解析請求並再次調用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 解析中。