המודול של מקודד ה-DNS מספק הגנה על משתמשים מפני התקפות של מניעת שירות (DoS) מסוג ניתוב נתוני 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 מפוזר בין Bionic ל-netd
. חיפושי ה-DNS מרוכזים ב-daemon 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 (com.android.resolv) מועבר כקובץ APEX ומקושר באופן דינמי על ידי netd
. עם זאת, netd
הוא לא יחסי תלות, כי המודול משרת ישירות את השקע המקומי /dev/socket/dnsproxyd
. נקודת הקצה של Binder להגדרת המפַתח הועברה מ-netd
למפַתח, כלומר שירות המערכת יכול לבצע קריאה ישירות למודול המפַתח בלי לעבור דרך netd
.
המודול של DNS Resolver תלוי ב-libc
(Bionic) ומקשר סטטית את יחסי התלות שלו. אין צורך בספריות אחרות.
רזולוציית mDNS .local
החל מנובמבר 2021, פותר ה-DNS של Android תומך בפתרון של mDNS .local, שמטמיע את '5.1 שאילתות DNS של Multicast חד-פעמיות' ב-RFC 6762 כדי לשלוח באופן עיוור שאילתות DNS רגילות אל 224.0.0.251:5353 או אל [FF02::FB]:5353. הפתרון של mDNS נתמך באופן שקוף באמצעות קריאה ל-getaddrinfo()
עם שם מארח שמסתיים ב-*.local
.
פתרון mDNS של .local משלים את הפונקציונליות הקיימת של getaddrinfo()
כדי לקבל את הכתובות. אם המכשיר תומך בפתרון של mDNS .local, ממשק ה-API של getaddrinfo()
שולח שאילתות mDNS אל 224.0.0.251:5353 או אל [FF02::FB]:5353 ומחזיר את הכתובות המקומיות. אם המכשיר לא תומך בפתרון של mDNS .local, שיטת ה-API getaddrinfo()
שולחת שאילתת DNS לשרת ה-DNS.
הקוד נמצא ב-AOSP, בכתובת packages/modules/DnsResolver
. המשתמשים יכולים לשמור על העיצוב הנוכחי של mDNS כדי לקבל את הכתובות, או להשתמש ב-getaddrinfo()
במקום זאת. ההתנהגות של התכונה הזו דומה לשאילתת DNS רגילה שנשלחת לכתובות ה-mDNS להעברה קבוצתית. התכונה הזו לא משפיעה על תקינות המערכת.
משתמשים יכולים להשתמש בפקודה adb shell ping6 HOSTNAME.local
,
כאשר HOSTNAME הוא שם המארח של מכשיר היעד ברשת ה-LAN, לדוגמה,
adb shell ping6 ipad.local
.
חיבור VPN וחיבורי נתונים לנייד לא נכללים בפתרון של .local.