מקודד DNS

המודול של DNS GCLID מספק הגנה על המשתמש מפני יירוט DNS ומתקפות של עדכון הגדרות אישיות וביצועי רשת משופרים ל-DNS ברזולוציה גבוהה. המודול מכיל את הקוד שמיישם את ה-stub של ה-DNS מקודד, שמתרגם שמות כמו www.google.com ל-IP כמו 2001:db8::1. מתבצע גיבוי של מקודד ה-stub של ה-DNS רכיבי Java API כמו InetAddress#getAllByName וגם Network#getAllByName, וגם פונקציות של רשתות נייטיב, ומממשות שליחה קבלת שאילתות DNS ושמירת התוצאות במטמון.

שינויים ב-Android 10

במכשירים עם Android מגרסה 9 ומטה, קוד מקודד ה-DNS מחולק בין ביולוגית ו-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

פורמט וקשרי תלות

מודול DNS Resolution (`com.android.resolv`) מסופק בתור קובץ APEX, שמקושר באופן דינמי באמצעות netd; עם זאת, netd אינו של התלות, כי המודול מבצע את השקע המקומי /dev/socket/dnsproxyd ישירות. נקודת הקצה של Binder תצורת המקודד הועברה מ-netd למקודד, כלומר, שירות המערכת יכול לקרוא ישירות למודול המקודד מבלי לעבור דרך netd.

מודול ה-DNS GCLID תלוי ב-libc (Bionic) וב- מקשרת באופן סטטי את יחסי התלות; אין צורך בספריות נוספות.

רזולוציה מקומית של mDNS

החל מנובמבר 2021, מקודד Android תומך ברזולוציה מקומית של mDNS שמטמיע "5.1 שאילתות DNS עם הקלטה אחת" ב-RFC 6762 כדי לשלוח שאילתות DNS סטנדרטיות באופן עיוור 224.0.0.251:5353 או [FF02::FB]:5353. רזולוציית mDNS נתמכת באופן שקוף באמצעות קריאה ל-getaddrinfo() עם שם מארח שמסתיים ב-*.local.

הרזולוציה של mDNS .local מרחיבה את הפונקציונליות הקיימת של getaddrinfo() כדי לקבל את הכתובות. אם מכשיר תומך ברזולוציה מקומית של mDNS, ה-API של getaddrinfo() שולח שאילתות mDNS אל 224.0.0.251:5353 או אל [FF02::FB]:5353 ומחזיר את הכתובות המקומיות. אם במכשיר מסוים אין תמיכה ב- mDNS .local הרזולוציה, אז שיטת ה-API getaddrinfo() שולחת שאילתת DNS ל-DNS השרת.

הקוד הוא ב-AOSP, דרך packages/modules/DnsResolver. המשתמשים יכולים לשמור את בעיצוב ה-mDNS הנוכחי כדי לקבל את הכתובות, או להשתמש ב-getaddrinfo() במקום זאת. ההתנהגות של התכונה הזו דומה לשאילתת DNS רגילה שנשלחת לכתובות Multicast של mDNS. לתכונה זו אין על תקינות המערכת.

המשתמשים יכולים להשתמש בפקודה adb shell ping6 HOSTNAME.local, HOSTNAME הוא שם המארח של מכשיר יעד ב-LAN, לדוגמה, adb shell ping6 ipad.local.

חיבורים ל-VPN ולחבילת הגלישה לא נכללים ברזולוציה המקומית.