ตัวแก้ไข DNS

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

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

บนอุปกรณ์ที่ใช้ Android 9 และต่ำกว่า รหัสตัวแก้ไข DNS จะกระจายไปทั่ว Bionic และ netd การค้นหา DNS จะถูกรวมไว้ที่ส่วนกลางใน netd daemon เพื่อให้สามารถแคชทั่วทั้งระบบ ในขณะที่แอปเรียกใช้ฟังก์ชันต่างๆ (เช่น getaddrinfo ) ใน Bionic การสืบค้นจะถูกส่งผ่านซ็อกเก็ต 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 Resolver (`com.android.resolv`) ถูกส่งเป็นไฟล์ APEX และเชื่อมโยงแบบไดนามิกโดย netd ; อย่างไรก็ตาม netd ไม่ใช่ การพึ่งพาเนื่องจากโมดูลให้บริการซ็อกเก็ตโลคัล /dev/socket/dnsproxyd โดยตรง ตำแหน่งข้อมูล Binder สำหรับการกำหนดค่าตัวแก้ไขถูกย้ายจาก netd ไปยังตัวแก้ไข ซึ่งหมายความว่าบริการระบบสามารถเรียกโดยตรงไปยังโมดูลตัวแก้ไขโดยไม่ต้องผ่าน netd

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

mDNS . ความละเอียดท้องถิ่น

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

ความละเอียด 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() แทน ลักษณะการทำงานของคุณสมบัตินี้เหมือนกับการสืบค้น DNS ปกติที่ส่งไปยังที่อยู่มัลติคาสต์ mDNS คุณลักษณะนี้ไม่มีผลกระทบต่อสุขภาพของระบบ

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

การเชื่อมต่อ VPN และข้อมูลมือถือไม่รวมอยู่ในความละเอียด .local