למה חיבורי אפליקציות רבים חולקים סשן OpenVPN אחד
שיחה חיצונית אחת ב־UDP נושאת כל זרם פנימי שהמסלולים שולחים לתוכה. הפורטים והפרוטוקולים הפנימיים שורדים; רק החמישייה החיצונית נשארת קבועה.
דמיינו דפדפן שטוען דף HTTPS בזמן שלקוח SSH מגיע לשרת אחר ומפענח שם עונה לשאילתה, הכול דרך סשן OpenVPN אחד. בממשק הפיזי אתם רואים שיחה אחת; בתוך המנהרה אתם רואים שלוש. שתי ההשקפות נכונות, ולדעת למה זה ההבדל בין לכידה שימושית ללכידה מבלבלת. עקבו אחרי זרם פנימי אחד מהשקע ועד לחוט, והריבוד מפסיק להיות מופשט.
שיחה חיצונית אחת, זרמים פנימיים רבים
כל אפליקציה פותחת שקע משלה, והליבה נותנת לו חמישייה של כתובת מקור, פורט מקור, כתובת יעד, פורט יעד ופרוטוקול. החמישיות האלה קיימות לפני שכל מנהרה נכנסת לתמונה. אחר כך הניתוב מחליט שכולן יוצאות דרך התקן המנהרה, ולכן החבילה שנמסרת אל OpenVPN עדיין נושאת בתוכה את הכותרות המקוריות. OpenVPN מצפין את החבילה הפנימית הזו ועוטף את התוצאה בשיחה חיצונית אחת ב־UDP או TCP עם העמית. השיחה החיצונית היא אפוא אחת, ואילו הזרמים שבתוכה רבים כמספר האפליקציות שנפתחו.
שום דבר לא מתמוטט. החמישיות הפנימיות שורדות מקצה לקצה, ולכן הצד המרוחק עדיין מבחין בין שלושת הזרמים.
הפורט שנשאר קבוע
מה שנשאר קבוע הוא החמישייה החיצונית: הכתובת שלכם, הפורט המקומי שהלקוח קשר, כתובת העמית ופורט השירות המוגדר. החמישייה הזו היא מה שחומת אש או NAT בדרך חייבים לאפשר, והיא זו שלכידה בקישור העולה תציג. היא גם זו שמשתנה אחרי התחברות מחדש או החלפת רשת, כי הלקוח עשוי לקשור פורט מקומי אחר. מנהרה אחת אינה מרמזת על פורט מקור קבוע אחד לנצח.
הפורטים הפנימיים הם מה שמעניין את נקודות הקצה. זרם HTTPS שומר על פורט יעד 443 בתוך המנהרה, אף שהתעבורה החיצונית יושבת על הפורט שהמפעיל הגדיר. נקודות הקצה של האפליקציה לא לומדות דבר על החיצוני.
מה פירוק המעטפה משנה בקצה המרוחק
אצל העמית מוסרים את השכבה החיצונית, והחבילה הפנימית היא מה שנשאר. משם והלאה העברה ומדיניות גישה חלות על היעד והפרוטוקול הפנימיים. שרת האינטרנט עדיין מקבל חיבור HTTPS, דימון ה־SSH עדיין מקבל SSH, והמפענח עדיין מקבל שאילתה.
לכן כלל שמתיר את התעבורה החיצונית אינו אותו כלל כמו התרת שירות פנימי. הראשון מתאר נתיב; השני מתאר הרשאה.
TCP חיצוני משמעו זרם אחד, לא חיבור אחד
כאשר התעבורה החיצונית היא UDP, גורלו של כל זרם פנימי עצמאי: דטה־גרמה שאבדה משפיעה על העברה אחת עד למשלוח החוזר שלה. כאשר התעבורה החיצונית היא TCP, כל הזרמים הפנימיים חולקים זרם בתים אמין אחד.
הזרם המשותף הזה הוא החלק שאנשים מפספסים. ההתאוששות קורית פעם אחת, עבור הכול, ולכן סגמנט אבוד אחד מעכב תעבורה של כל אפליקציה שרובדה בפנים. אלה עדיין חיבורים רבים בנקודות הקצה וחיבור אחד על החוט, והחוט הוא המקום שבו חי אפקט ראש התור. מספר הפורטים שמאזינים לא אומר לכם דבר על זה, ולכן ספירת פורטים היא דרך גרועה לחשוב על ביצועי מנהרה.
תארו את התצורה שלכם במדויק
נקבו בשם התעבורה הפנימית שנבחרה ובתעבורה החיצונית המסוימת שנושאת אותה, במקום לומר שהמכונה שולחת הכול דרך פורט אחד. שירותים מקומיים, מנהרה שנייה ומשפחת הכתובות האחרת יוצרים זרמים שלעולם לא נכנסים לשיחה הזו. לכידה בקישור העולה מציגה את החמישייה החיצונית; לכידה בתוך המנהרה מציגה את הפנימיות.
קחו את שתיהן, והעמידו את חותמות הזמן זו לצד זו. אם עליכם להוכיח איזו אפליקציה יצרה איזה זרם פנימי, טבלת השקעים במארח היא הכלי הטוב יותר, כי היא ממפה פורטים לתהליכים ישירות. אחר כך רשמו את החמישייה החיצונית שהסתכלתם עליה ואת הרגע שבו הסתכלתם, כי הלכידה הבאה אחרי התחברות מחדש עשויה להראות מספרים אחרים באופן לגיטימי.