รีโซลเวอร์ DNS

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

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

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

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

ความละเอียด .local ของ mDNS

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

ความละเอียด .DNS ของ mDNS ช่วยเสริมฟังก์ชันการทำงานที่มีอยู่ของ 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