محلل DNS

توفر وحدة محلل DNS حماية المستخدم لاعتراض DNS وهجمات تحديث التكوين وتحسين أداء الشبكة لقرارات DNS. تحتوي الوحدة على الكود الذي ينفذ محلل DNS، والذي يترجم أسماء مثل www.google.com إلى عناوين IP مثل 2001:db8::1 . يدعم محلل كعب روتين DNS عناصر Java API مثل InetAddress#getAllByName و Network#getAllByName ، بالإضافة إلى وظائف الشبكة الأصلية ، وينفذ إرسال واستقبال استعلامات DNS وتخزين النتائج مؤقتًا.

التغييرات في أندرويد 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

التنسيق والتبعيات

يتم تسليم وحدة DNS Resolver (`com.android.resolv`) كملف APEX ويتم ربطها ديناميكيًا بواسطة netd ؛ ومع ذلك، netd ليس تبعية لأن الوحدة تخدم المقبس المحلي /dev/socket/dnsproxyd مباشرة. تم نقل نقطة نهاية Binder الخاصة بتكوين المحلل من netd إلى المحلل، مما يعني أنه يمكن لخدمة النظام الاتصال مباشرة بوحدة المحلل دون المرور عبر netd .

تعتمد وحدة DNS Resolver على libc (Bionic) وتربط تبعياتها بشكل ثابت؛ لا توجد مكتبات أخرى مطلوبة.

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 .

تعمل دقة mDNS .local على زيادة الوظيفة الحالية لـ getaddrinfo() للحصول على العناوين. إذا كان الجهاز يدعم دقة mDNS .local، فسترسل واجهة برمجة تطبيقات getaddrinfo() استعلامات 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 هو اسم المضيف لجهاز مستهدف على الشبكة المحلية، على سبيل المثال، adb shell ping6 ipad.local .

يتم استبعاد اتصالات VPN وبيانات الهاتف المحمول من الدقة المحلية.