המודול של 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 ולחבילת הגלישה לא נכללים ברזולוציה המקומית.