פותר DNS

מודול ה-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.