אפליקציה שהוחרגה עדיין מחוברת? כללי האפליקציה והמסלול שונים
החרגת אפליקציית אנדרואיד מ-VPN אינה חוסמת אותה. רשימות היתר, כללי UID ומסלולים נדחפים קובעים כל אחד חלק אחר של הנתיב.
החרגת חבילה היא הוראת ניתוב, לא חסימה, ולכן הדפים שנטענים לאחר התחברות ה-VPN הם צפויים ולא הוכחה לתקלה. ההחרגה מוציאה את האפליקציה מהמנהרה במקום לחסום אותה, והרשת הרגילה נושאת את התעבורה שלה. כאן נפגשות שתי מדיניות נפרדות: אחת בוחרת תהליכים, והשנייה בוחרת יעדים. קריאה שלהן בסדר הזה מסבירה מדוע סמל מחובר ואפליקציה שעובדת אינם סתירה.
מדוע החרגה משאירה את הרשת פתוחה
VpnService.Builder מקבל רשימת היתר או רשימת חסימה, ולעולם לא את שתיהן. רק חבילות ברשימת היתר מנותבות דרך המנהרה. רשימת חסימה הופכת זאת: כל חבילה מלבד הרשומות משתמשת במנהרה, והרשומות שומרות על הנתיב הפיזי. חבילה שאינה רשומה תחת רשימת היתר נמצאת גם היא מחוץ למנהרה, ולכן ההחרגה היא המצב הרגיל לרוב האפליקציות במצב הזה.
זה הופך רשומת חסימה מקומית להחלטת ניתוב, לא לכלל חומת אש. אם הדרישה היא למנוע מאפליקציה להגיע למארח, המנהרה חייבת לכסות אותה והשרת או מדיניות מקומית חייבים לסרב לתעבורה. הוצאת אפליקציה מהמנהרה משנה רק איזה ממשק נושא את החבילות שלה.
מקרה Play Store הוא הדוגמה המכוונת הרגילה. החרגת חבילת החנות מאפשרת להורדות להשתמש בחיבור הבסיסי כאשר יציאת ה-VPN מפריעה להעברות, והיא מראה שהחרגה פירושה עקיפה ולא חסימה.
פרופיל אחד, רשימה אחת
הבונה זורק חריגה אם משתמשים בשני הקריאות, ולכן הפרופיל שלפניכם הוא רשימת היתר או רשימת חסימה. העובדה הבודדת הזו קובעת כיצד לקרוא כל תצפית מאוחרת יותר. בדקו את הקוד או את התצורה המנוהלת לפני טבלת הניתוב, כי הרשימה קובעת מה משמעות שאר הפלט. פרופיל היברידי אינו מצב שאפשר להסתכל בו.
ההבחנה גם חוזה מה תעשה אפליקציה שהותקנה זה עתה. תחת רשימת היתר היא נשארת בחוץ עד שמישהו מוסיף אותה, ואילו תחת רשימת חסימה היא מצטרפת למנהרה כברירת מחדל.
תצורות מנוהלות חושפות את אותה בחירה תחת שמות מפתח שונים, וחלק מהקונסולות מתארות אותה כמצב VPN לכל אפליקציה ולא כרשימה. ההתנהגות עדיין מצטמצמת לשתי הקריאות האלה, ולכן עקבו אחרי ההגדרה חזרה לרשימת החבילות במקום לסמוך על התווית. אם התווית והרשימה חלוקות, הרשימה מנצחת.
עקבו אחרי כלל ה-UID עד טבלת המנהרה
אנדרואיד נותן לכל אפליקציה מזהה משתמש לינוקס משלה, ושירות ה-VPN מתקין כללי מדיניות שמתאימים לטווחי UID. תעבורה מתאימה נשלחת לטבלת ניתוב שנתיב ברירת המחדל שלה מצביע על התקן tun. מספר הטבלה מוקצה לכל מופע VPN, ולכן הוא משתנה לאחר התחברות מחדש או לאחר יצירת פרופיל VPN שני.
פלט הכללים הוא המפה. כל שורה נוקבת בטבלת חיפוש, וטבלה זו מחזיקה את נתיב ברירת המחדל שקובע אם חבילות מתאימות נכנסות למנהרה.
adb shell ip rule show
adb shell ip route show table all
adb shell cmd package list packages -U | grep <package>
הריצו תחילה את הפקודה השלישית כדי לקבל את ה-UID, ואז מצאו את הכלל שטווחו מכיל אותו. הכלל הזה מצביע על מספר טבלה, ו ip route show table <n> עם המספר הזה מראה אם קיים נתיב ברירת מחדל דרך התקן tun. אם לטבלה אין ברירת מחדל, האפליקציה נבחרה אך אין לה נתיב, וזו תקלה אחרת.
הפקודות האלה דורשות בנייה ניתנת לניפוי או מכשיר שבו adb shell יכול לקרוא את מצב הרשת. במכשיר ייצור מנהל החבילות עדיין עונה, אך בדיקת הניתוב עשויה להידחות, ולכן תעדו מה שאפשר והתייחסו לשאר כלא מאומת.
מסלול תובע קידומת, לא אפליקציה
Builder.addRoute תובע קידומות יעד עבור המנהרה. פרופיל שמוסיף רק 10.0.0.0/8 שולח את הקידומת הזו דרך המנהרה ומשאיר כל יעד אחר בנתיב הפיזי. זו מנהרה מפוצלת רגילה, והיא אינה תלויה באילו אפליקציות בחרו הכללים.
תצורה שנדחפת מהשרת משקפת את אותו מודל. דחיפות מסלול בודדות מוסיפות קידומות, ואילו הנחיית redirect-gateway מחליפה את נתיב ברירת המחדל ולוכדת הכול עבור האפליקציות שהמנהרה מכסה. הסרת ההנחיה הזו יכולה לכווץ מנהרה עובדת לרשת משנה אחת בלי שום שינוי במכשיר.
מסלול נדחף עם שער או מסווג מדד חריג עלול גם להיכשל בהתקנה. העדיפו את צורת הקידומת הפשוטה והשאירו לשרת את ההעברה וה-NAT.
קראו את החיתוך לפני שינוי הגדרה
המנהרה נושאת את החיתוך של התהליכים המכוסים והיעדים הנתבעים. אפליקציה מכוסה שמבקשת כתובת מחוץ לקידומות שפורסמו יוצאת דרך הרשת הפיזית. חבילה חסומה נשארת בחוץ גם כשהיא מבקשת כתובת בתוך הקידומות האלה. אף אחד מהמקרים אינו באג; שניהם שתי המדיניות שעושות את עבודתן.
VPN לכל אפליקציה יכול גם להשאיר אפליקציה משויכת בלי קישוריות. כשמצב on-demand כבוי והמנהרה למטה, האפליקציה נשארת קשורה ל-VPN לכל אפליקציה ואין לה חלופה, מה שנראה כמו אפליקציה שבורה ולא כמו מצב מדיניות. הפעלת on-demand, או הסרת השיוך דרך הניהול, משנה זאת.
| Layer | What it selects | Where to look | Typical mismatch |
|---|---|---|---|
| Package list | Processes | Builder calls or managed configuration | App excluded but expected to be blocked |
| UID policy rule | Which table a UID uses | ip rule show | Tunnel icon on, app still on Wi-Fi |
| Routing table | Destinations for matched traffic | ip route show table <n> | Covered app reaches only one subnet |
| Server push | Prefixes offered to the client | Server route configuration | Tunnel shrinks after a server edit |
אבחנו ציר אחד בכל פעם. אשרו קודם היתר או חסימה, קראו שני את כללי ה-UID והטבלאות המותקנים, ובחנו אחרון אפליקציה שנייה מול אותו יעד. האפליקציה השנייה מפרידה בין בחירת תהליך לבחירת יעד בבקשה אחת.
רשמו את התוצאה כאפליקציה, יעד ומספר טבלה. השלשה הזו היא מה שהשינוי הבא חייב לשמר.