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

הבדיקה היא החלק שקובע את כל השאר.

מה פינג לאינטרנט באמת מוכיח

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

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

בדקו משהו שחי מאחורי המנהרה

ip -brief addr show tun0
ip route get 10.100.20.10
nc -z -w3 10.100.20.10 443

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

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

בחרו בין שורה אחת ללולאה

* * * * * nc -z -w5 10.100.20.10 443 || myvpn reconnect

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

failures=0
while sleep 30; do
  if nc -z -w5 10.100.20.10 443; then failures=0
  else failures=$((failures+1)); fi
  if [ $failures -ge 3 ]; then myvpn reconnect; failures=0; fi
done

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

מעבר לשרת אחר הוא החלטה שונה

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

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

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

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