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

מה הפנייה בדרך כלל מתארת

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

שלוש התצפיות נבדלות במה שהן יכולות להוכיח, לא רק במה שהן מתארות.

ObservationWhat it describesWhat it cannot prove
An address on a local interfaceOne configured attachment: Wi-Fi, cellular or a tunnelThe source a remote site receives
A socket's local endpointThe binding used by that one connectionThe address after translation further along
The peer address at a serviceWhat arrived at that observation pointAny other interface on the phone

החזיקו את הטבלה הזו ליד הקוד שממלא את הערכים האלה לפנייה, כי רוב הבלבול כאן הוא בלבול עמודות ולא תקלת רשת.

למה קריאת סוקט יכולה לענות ולמה לא

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

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

מנהרה מפוצלת הופכת את הפער לגלוי. בקשה אחת יכולה לצאת דרך המנהרה בעוד הבאה, המכוונת ליעד או למשפחת כתובות אחרת, לא יוצאת, ולכן שתי תוצאות מאותה אפליקציה בהפרש שניות יכולות להיות כנות ושונות.

בחרו את התצפית שמתאימה לשאלה

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

כדי לדעת אם המנהרה מוגדרת, קראו את הממשק. כדי לדעת אם התעבורה של האפליקציה הזו השתמשה בה, שלחו תעבורה מאותה אפליקציה ליעד שאתם שולטים בו והשוו את המקור בשני הקצוות.

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

שמות ממשקים אינם גלאי

אל תשתמשו בשם ממשק גם כבדיקת VPN. השמות אינם חוזה ציבורי, וטלפון יכול להחזיק כמה חיבורים כאשר רק אחד מהם נושא את הבקשה שלכם.

תנו לשדה שם לפי התצפית שהוא מחזיק. local_interface_address, socket_local_endpoint ו-service_observed_source מגושמים וחד-משמעיים, וחד-משמעות היא מה שאתם רוצים כשהערך מגיע לפניית תמיכה כעבור שבוע. עמודה אחת בשם device IP תאסוף את שלושתם ואז יבטחו בה כאילו הייתה אחת.

הרחיקו זהות מעמודת הכתובת

יציאת VPN משותפת אינה זהות משתמש, וכתובת פרטית אינה אישור גישה. שתיהן מתארות נתיב ולא אדם, והתייחסות לאחת מהן כאל אימות הופכת תאונת ניתוב להחלטת הרשאה.

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

ואז רשמו איזו מהשלוש המוצר שלכם באמת צריך להציג, ומחקו את שתי האחרות מהממשק.

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