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

מפו את הקפיצות לפני שמריצים משהו

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

HopOwnerWhat it decides
Application requestThe appDestination, resolver, address family
Capture servicePhone VpnService appWhich traffic enters the relay at all
ADB relayHost processForwarding phone flows to host sockets
Host egressHost routing and VPNExit address and host policy

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

הכינו את הממסר לפני שנוגעים בטלפון

Gnirehtet הוא הדוגמה המתועדת לארכיטקטורה הזו: לקוח של שירות ה-VPN ללא root בטלפון ועימו ממסר שנישא דרך ADB במארח, בתמיכה ב-TCP וב-UDP מעל IPv4. המאגר שלו גם מציין שהפרויקט אינו מתוחזק עוד באופן פעיל, לכן התייחסו אליו כתכנון הייחוס וככלי עבודה למעבדה, ולא כמוצר נתמך לתקנון על פני צי מנוהל.

adb devices
adb shell getprop ro.build.version.release
gnirehtet run

הריצו תחילה adb devices. טלפון שלא קיבל את מפתח הניפוי של המארח מדווח כלא מורשה, והממסר לא יתחבר עד שההנחיה במכשיר תתקבל. gnirehtet run מתקין את הלקוח, מפעיל את הממסר ומפעיל את הלכידה; בגרסה שמפרידה בין השלבים, השתמשו במקום זאת בפקודות המשנה המתועדות install, relay ו-start.

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

החזירו את ה-VPN של המארח לנתיב

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

ip route get 1.1.1.1
curl -4 https://ifconfig.me
sudo ss -tnp | grep -i relay

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

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

בדקו כל קפיצה בנפרד

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

adb shell dumpsys connectivity | grep -i -A3 vpn
adb logcat -s GnirehtetRelay:V Gnirehtet:V

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

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

פרקו ובחרו את התנהגות הכשל

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

gnirehtet stop
gnirehtet uninstall
adb kill-server

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

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

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