รีโซลเวอร์ DNS

โมดูลโปรแกรมแก้ไข DNS ให้การปกป้องผู้ใช้จากการสกัดกั้น DNS และการโจมตีการอัปเดตการกำหนดค่า และปรับปรุงประสิทธิภาพเครือข่ายสำหรับการแก้ไข DNS โมดูลนี้มีโค้ดที่ใช้โปรแกรมแก้ไข DNS Stub ซึ่งจะแปลชื่อ เช่น www.google.com เป็นที่อยู่ IP เช่น 2001:db8::1 โปรแกรมแก้ไขข้อมูล DNS ย่อยรองรับองค์ประกอบ Java API เช่น InetAddress#getAllByName และ Network#getAllByName รวมถึงฟังก์ชันการทํางานเครือข่ายดั้งเดิม และใช้งานการส่งและรับการค้นหา DNS รวมถึงแคชผลลัพธ์

การเปลี่ยนแปลงใน Android 10

ในอุปกรณ์ที่ใช้ Android 9 และต่ำกว่า โค้ดโปรแกรมแก้ไข DNS จะกระจายอยู่ใน Bionic และ netd การค้นหา DNS จะรวมอยู่ในไดแอม่อน netd เพื่อใช้แคชทั้งระบบ ขณะที่แอปเรียกใช้ฟังก์ชัน (เช่น getaddrinfo) ใน Bionic ระบบจะส่งการค้นหาผ่านซ็อกเก็ต 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

รูปแบบและทรัพยากร Dependency

ระบบจะส่งโมดูลโปรแกรมแก้ไข DNS ("com.android.resolv") เป็นไฟล์ APEX และ netd จะลิงก์แบบไดนามิก แต่ netd ไม่ใช่ข้อกำหนดเนื่องจากโมดูลจะให้บริการซ็อกเก็ตในเครื่อง /dev/socket/dnsproxyd โดยตรง ระบบได้ย้ายปลายทาง Binder สําหรับการกําหนดค่าโปรแกรมแก้ไขจาก netd ไปยังโปรแกรมแก้ไขแล้ว ซึ่งหมายความว่าบริการของระบบสามารถเรียกใช้โมดูลโปรแกรมแก้ไขได้โดยตรงโดยไม่ต้องผ่าน netd

โมดูล DNS Resolver ขึ้นอยู่กับ libc (Bionic) และลิงก์ทรัพยากร Dependency แบบคงที่ โดยไม่จำเป็นต้องใช้ไลบรารีอื่นๆ

การแปลง .local ของ mDNS

ตั้งแต่เดือนพฤศจิกายน 2021 เป็นต้นไป โปรแกรมแก้ไขของ Android จะรองรับการแก้ไข mDNS .local ซึ่งใช้ "5.1 One-Shot multicast DNS Queries" ใน RFC 6762 เพื่อส่งการค้นหา DNS มาตรฐานแบบสุ่มไปยัง 224.0.0.251:5353 หรือ [FF02::FB]:5353 การแก้ไข mDNS จะได้รับการรองรับอย่างโปร่งใสโดยการเรียกใช้ getaddrinfo() ที่มีชื่อโฮสต์ลงท้ายด้วย *.local

การแก้ไข .local ของ mDNS ช่วยเสริมฟังก์ชันที่มีอยู่ของ getaddrinfo() เพื่อรับที่อยู่ หากอุปกรณ์รองรับการแก้ไข .local ของ mDNS getaddrinfo() API จะส่งการค้นหา mDNS ไปยัง 224.0.0.251:5353 หรือ [FF02::FB]:5353 และแสดงผลที่อยู่ภายใน หากอุปกรณ์ไม่รองรับการแก้ไข mDNS .local วิธีการ getaddrinfo() API จะส่งการค้นหา DNS ไปยังเซิร์ฟเวอร์ DNS

รหัสอยู่ใน AOSP ซึ่งอยู่ใน packages/modules/DnsResolver ผู้ใช้สามารถใช้การออกแบบ mDNS ปัจจุบันเพื่อรับที่อยู่ หรือจะใช้ getaddrinfo() แทนก็ได้ ลักษณะการทํางานของฟีเจอร์นี้เหมือนกับการค้นหา DNS ปกติที่ส่งไปยังที่อยู่มัลติแคสต์ mDNS ฟีเจอร์นี้ไม่มีผลต่อประสิทธิภาพของระบบ

ผู้ใช้สามารถใช้คำสั่ง adb shell ping6 HOSTNAME.local โดยที่ HOSTNAME คือชื่อโฮสต์ของอุปกรณ์เป้าหมายใน LAN เช่น adb shell ping6 ipad.local

การเชื่อมต่อ VPN และอินเทอร์เน็ตมือถือจะยกเว้นจากการแก้ไข .local