מנהרה מלאה מול נתיב נקודת קצה: לשמור על שרת ה-VPN נגיש
המנהרה עוברת דרך הרשת שהיא מחליפה. השוו חריגת נתיב מארח לסימון סוקט ברמת היישום, ודעו מתי כל אחד נכשל.
הוסיפו נתיב ברירת מחדל דרך המנהרה, והחבילות של המנהרה עצמה ילכו אחריו. הטבלה מכילה אז כלל שמביס את עצמו. החיבור המוצפן לשרת מנסה לעבור בתוך החיבור שהוא מנסה להקים.
שני מנגנונים מונעים את הלולאה הזו. האחד גלוי בטבלת הניתוב, והשני חי בתוך היישום.
תעבורה פנימית וחיצונית הן החלטות שונות
חבילת יישום נכנסת לממשק הווירטואלי ומקופלת. התוצאה היא חבילה חדשה הממוענת לכתובת הציבורית של השרת. אותה חבילה זקוקה לנתיב ברשת הפיזית, מפני ששום דבר ממנה אינו רשאי להיכנס למנהרה.
שתיהן החלטות ניתוב, ורק הראשונה שייכת למנהרה. כאשר הלקוח מתקין נתיב ברירת מחדל שמכסה גם את השרת, גם החבילה החיצונית נלכדת.
התסמינים מיידיים ומוחלטים. לחיצת היד מושלמת ואז שום דבר לא זורם, או שהחיבור נופל ברגע שבו הנתיב מותקן. בשני המקרים ה-keepalive כבר אינו יכול לצאת.
אפשרות ראשונה: נתיב מארח לנקודת הקצה
הגישה הישירה מוסיפה נתיב לכתובת השרת דרך השער המקורי. היא דורשת שורה אחת. היא גלויה לכל מי שקורא את הטבלה. קל גם להסביר אותה ברשומת שינוי.
החולשה שלה מתגלה כאשר הנתיב הבסיסי משתנה. הנתיב השמור מציין שער וממשק מהרשת הישנה. אחרי החלפת Wi-Fi ייתכן שהשער הזה אינו קיים, והנתיב נשאר מאחור, נראה נכון ולא עושה דבר.
# before the tunnel: which path reaches the endpoint?
ip route get 198.51.100.7
# pin it through the current gateway
ip route add 198.51.100.7/32 via 192.168.1.1 dev wlan0
# after the tunnel is up, confirm the pin survived
ip route get 198.51.100.7
שם מארח מקשה על כך. אם נקודת הקצה היא שם שמתפרש לכמה כתובות, החריגה חייבת לכסות את הכתובת שבשימוש בפועל. חיפוש מאוחר יותר עלול להחזיר משהו שהנתיב מעולם לא כיסה.
אפשרות שנייה: להגן על הסוקט
הגישה האחרת אינה נוגעת בטבלת הניתוב לעולם. הלקוח מסמן או מגן על הסוקט שנושא את המנהרה, כך שמערכת ההפעלה שולחת את התעבורה של אותו סוקט מחוץ למנהרה לפי מדיניות. Android חושף את המנגנון ישירות ליישומי VPN. לקוחות שולחניים מיישמים מקבילות באמצעות סימוני חומת אש או קריאות קישור-להתקן.
היתרון הוא שהחריגה עוקבת אחרי החיבור ולא אחרי שער שמור. שינוי רשת כותב מחדש את הנתיב הבסיסי, והסוקט המוגן נע איתו מפני שמעולם לא נעוץ לכתובת. טבלת הניתוב נשארת נקייה.
המחיר הוא נראות. שום דבר בטבלת הניתוב אינו מראה את החריגה, כך שסוקר המחפש נתיב מארח אינו מוצא דבר ועלול להסיק שהתכנון אינו בטוח. ההגנה חיה בקוד הלקוח ובכללי המדיניות שהקוד הזה מתקין.
לבחור בין השתיים
בחרו במנגנון ברמת הסוקט כאשר הלקוח תומך בו, מפני שהוא שורד את שינויי הרשת ששוברים נתיב נעוץ. בחרו בנתיב המארח כאשר החריגה חייבת להיות גלויה לכלים אחרים, או כאשר הלקוח אינו מציע דבר טוב יותר.
אף אחד מהמנגנונים אינו מסיר את הצורך שכתובת השרת תהיה נגישה בכלל. לשער פרטי יש כתובת האזנה ציבורית, וזו הכתובת שחייבת להישאר מחוץ למנהרה. הרשתות הפנימיות שמאחוריו נעשות נגישות רק לאחר שהמנהרה קיימת.
מה שתבחרו, החזיקו אותו עם הרכיב שבבעלותו המנהרה. נתיב מארח תועה שהוסף ביד עובד עד הרשת הבאה, ואז הוא הופך לתקלה המסתורית של מחר.