โมดูลโปรแกรมแก้ 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