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

שלוש תשובות לשאלה אם ה-VPN פעיל

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

SignalAnswersBlind spot
scutil --nc statusIs the service connected?Third-party clients, wrong routes
route -n getWhere would this go?The peer may be down
A request to the far sideDoes it work now?Slow, and it changes state

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

לקרוא את המזהה, לא את שם התצוגה

scutil --nc list
scutil --nc status "Office"

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

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

לקוח צד שלישי מסתתר מהרשימה

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

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

מצב אינו ניתוב

שירות מחובר אומר שהמנהרה קיימת. הוא אינו אומר שהיעד שלכם משתמש בה. קראו את הכתובות, ואז שאלו את הקרנל ישירות:

ifconfig | grep -A4 utun
netstat -rn -f inet
route -n get 10.40.0.20

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

שמות הם בעיה נפרדת

מכונות אחרות אינן יכולות להגיע ל-Mac לפי שם בזמן שהכתובת שלו עובדת, וזה מדווח כתקלת VPN. השם המקומי של המארח, שם המארח ורשומת ה-DNS הם שלושה דברים שונים. scutil --get LocalHostName מציג את שם Bonjour; sudo scutil --set HostName mac-office קובע את השם שהמערכת מדווחת.

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

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

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