אתה מקבל shell במכשיר, קורא את /etc/resolv.conf או שולף ערך net.dns1 ישן, ומקבל כתובת אחת. האפליקציה שלפניך פותרת דרך משהו אחר לגמרי. בגרסת Android נוכחית ה-resolver הוא לפי רשת: המערכת מחזיקה מדיניות לכל Network ומחילה אותה על ה-socket ששלח את הבקשה. הקובץ והמאפיין הישן הם שאריות, ואף אחד מהם לא מתאר את המסלול שהשאילתה שלך באמת עברה.

הפער הזה נראה בזמן פריסת split-tunnel ו-Private DNS, שבו שתי אפליקציות באותו טלפון יכולות לראות תשובות שונות באופן לגיטימי. המדריך הזה מתחיל בפתרון השגוי או החסר ועובד אחורה אל התצורה שבבעלותו.

ה-resolver שייך לרשת, לא למכשיר

פתרון שמות ב-Android 9 ואילך עובר דרך resolver מערכתי שמבוסס על ה-Network שאליו ה-socket קשור. כל רשת נושאת LinkProperties משלה, והמאפיינים האלה מכילים את רשימת שרתי ה-DNS, דומיינים לחיפוש ומצב Private DNS רק לאותה רשת. שום דבר במודל הזה לא מתאים לרשימה אחת לכל המכשיר שאפשר לקרוא מקובץ.

VPN הופך את הפיצול לברור. כשהמנהרה עולה, אפליקציית ה-VPN מספקת שרתי DNS הרשומים ברשת של ה-VPN עצמו, כך שאפליקציות מנותבות דרכו פותרות מול השרתים האלה בעוד אפליקציות מוחרגות ממשיכות להשתמש ברשת שמתחת. מכשיר אחד, שני מסלולי תשובה, בלי סתירה.

קרא את תמונת המצב מתוך האפליקציה המושפעת

שאל את האפליקציה עצמה. מתודה שיש לה Context וההרשאה הרגילה android.permission.ACCESS_NETWORK_STATE יכולה לקרוא את התמונה בלי לגעת במאפייני מערכת:

val cm = getSystemService(ConnectivityManager::class.java) ?: return
val network = cm.activeNetwork
val links = network?.let { cm.getLinkProperties(it) }

val dnsServers = links?.dnsServers
val privateDnsActive = links?.isPrivateDnsActive
val privateDnsName = links?.privateDnsServerName

activeNetwork היא ברירת המחדל של התהליך שלך, לא הרשת היחידה במכשיר, והיא יכולה להיות null כשלמתקשר אין ברירת מחדל שמישה. VPN חסום כברירת מחדל הוא הסיבה הרגילה. isPrivateDnsActive אומר לך אם שאילתות באותה רשת עוברות ב-TLS אל resolver בעל שם, מה שמשנה את מה שבדיקת UDP 53 פשוטה תראה. משטח ה-API מתועד תחת LinkProperties, וכל ערך בו הוא תמונת תצורה ולא הוכחה ששאילתה מסוימת הגיעה לשרת מסוים.

כשברירת המחדל אינה הרשת שעושה את העבודה

התמונה עונה רק עבור ברירת המחדל. אפליקציה יכולה לקשור את התהליך שלה או socket אחד לרשת אחרת, ואז הפתרון הולך אחרי הבחירה הזו בעוד האבחון שלך מדווח עדיין על ברירת המחדל. דפדפן שמביא resolver DNS-over-HTTPS משלו לא מתייעץ עם רשימת המערכת בכלל, ולכן תשובותיו לא אומרות דבר על שאר המכשיר. אפליקציית פרופיל עבודה רצה תחת משתמש נפרד עם מדיניות משלו. בדוק את הקישור לפני שאתה מאשים את השרתים.

אינטגרציית VPN היא החצי השני. קבלת שורת dhcp-option DNS בפרופיל OpenVPN ורישום הכתובת הזו ברשת ה-VPN של Android הם שני שלבים נפרדים, ומסלול חסר אל השרת נכשל בשקט בדיוק כמו כתובת שגויה. ממחשב פיתוח, adb shell dumpsys connectivity מדפיס את אותם מאפייני קישור לפי רשת כשהבנייה מאפשרת, מה שמאשר את הרשימה בלי לכתוב קוד.

השווה את התצורה לפתרון אחד שמותר לך לבצע

בחר שם שחייב להיפתר במרחב השמות הפרטי ושם ציבורי אחד, ורשום את שתי התוצאות לצד התמונה: רשת, שרתים מוגדרים, מצב Private DNS וטקסט השגיאה המדויק. שאילתה ישירה לשרת בעל שם מוכיחה שהשרת הזה עונה לך; היא לא מוכיחה שהפתרון הרגיל של האפליקציה בחר בו. תשובה מהמטמון אינה בדיקה טרייה, לכן נקה את המטמון או השתמש בשם שאיש לא שאל עליו היום.

אם ה-resolver משרת רק לקוחות מרשת גישה מסוימת, מה שהוא רואה אחרי יציאת ה-VPN יכול להכריע את התוצאה, וזו שאלת מדיניות למי שמפעיל אותו ולא הוכחה שספקים חוסמים UDP 53. במקום שבו Private DNS פעיל, שם מארח לא מסויג יכול להידחות לפי התכנון בעוד אותו שרת עונה כרגיל לשמות ציבוריים. קריאת המאפיינים אומרת לך איזה מצב בתוקף, כך שאתה מפסיק לנחש מסנני מנות.

תקן את השכבה שאליה שייכת אי-ההתאמה

עבוד כלפי מעלה במקום לערוך מצב גלובלי. אם האפליקציה קשורה לרשת הלא נכונה, תקן את הקישור. אם הפרופיל מספק את אפשרות ה-DNS הלא נכונה, תקן את הפרופיל. אם Private DNS מחמיר ברשת שה-resolver שלה לא יכול לשרת את האזור הפרטי שלך, זו החלטת ניהול מכשיר ולא סיבה לכבות את התכונה בכל מקום.

לדחוף resolver-ים ציבוריים לתוך וו DHCP או מאפיין מערכת זו התיקון שממשיך לגרום לתקלות: שמות פרטיים מפסיקים להיפתר, השינוי שורד את הפעלת ה-VPN, והאדם הבא במכשיר מוצא כתובת מיושנת בלי בעלים. שמור את השינוי בתוך ה-VPN, האפליקציה או שכבת הניהול שאליה שייכת אי-ההתאמה, ואז קרא שוב את התמונה כדי לאשר שרשימת השרתים באמת השתנתה.

בסוף אתה רוצה בקשת אפליקציה אחת הקשורה לרשת אחת, לרשימת resolver-ים ולמצב Private DNS. ברגע שאתה יכול להראות את השרשרת הזו, כתובת מוכרת בקובץ מפסיקה להיות הוכחה לכלום.

מאמרים קשורים