מודול ה-DNS Resolver מספק הגנה על המשתמש עבור יירוט DNS והתקפות עדכוני תצורה וביצועי רשת משופרים עבור רזולוציות DNS. המודול מכיל את הקוד שמיישם את פותר ה-DNS stub, אשר מתרגם שמות כגון www.google.com לכתובות IP כגון 2001:db8::1 . פותר ה-DNS stub מגבה אלמנטים של Java API כגון InetAddress#getAllByName ו- Network#getAllByName , כמו גם פונקציות רשת מקוריות , ומיישם שליחה וקבלה של שאילתות DNS ושמירה במטמון של התוצאות.
שינויים באנדרואיד 10
במכשירים המריצים אנדרואיד 9 ומטה, קוד פותר ה-DNS מפוזר על פני Bionic ו- netd
. חיפושי DNS מרוכזים בדמון netd
כדי לאפשר שמירה במטמון בכל המערכת, בעוד אפליקציות מתקשרות לפונקציות (כגון getaddrinfo
) ב- Bionic. השאילתה נשלחת דרך שקע UNIX אל /dev/socket/dnsproxyd
ל- netd
daemon, שמנתח את הבקשה וקורא ל getaddrinfo
שוב כדי להוציא חיפושי DNS, ואז שומר את התוצאות במטמון כך שאפליקציות אחרות יוכלו להשתמש בהן. היישום של פותר ה-DNS היה כלול ברובו ב- bionic/libc/dns/
ובחלקו ב- system/netd/server/dns
.
אנדרואיד 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 .local
החל מנובמבר 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()
API שולח שאילתות mDNS ל-224.0.0.251:5353 או [FF02::FB]:5353 ומחזיר את הכתובות המקומיות. אם מכשיר אינו תומך ברזולוציית mDNS .local, שיטת ה-API getaddrinfo()
שולחת שאילתת DNS לשרת ה-DNS.
הקוד נמצא ב-AOSP, ממוקם packages/modules/DnsResolver
. משתמשים יכולים לשמור את עיצוב ה-mDNS הנוכחי שלהם כדי לקבל את הכתובות, או להשתמש ב- getaddrinfo()
במקום זאת. ההתנהגות של תכונה זו היא כמו שאילתת DNS רגילה הנשלחת לכתובות ה-mDNS multicast. לתכונה זו אין השפעה על תקינות המערכת.
משתמשים יכולים להשתמש בפקודה adb shell ping6 HOSTNAME .local
, כאשר HOSTNAME הוא שם המארח של התקן יעד ברשת ה-LAN, לדוגמה, adb shell ping6 ipad.local
.
חיבורי VPN ונתונים ניידים אינם נכללים ברזולוציית .local.