פותר 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.