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

לתסמין יש בדרך כלל שלוש סיבות

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

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

מה השירות האוטומטי באמת קורא

השירות האוטומטי של Community הוא עטיפה שסורקת את תיקיית ההפעלה האוטומטית המוגדרת שלה, בדרך כלל config-auto תחת ההתקנה, ומפעילה תהליך OpenVPN לכל פרופיל תואם שהיא מוצאת. פרופיל שנראה בתפריט ה-GUI של משתמש נמצא במקום זאת תחת פרופיל הנדידה של אותו משתמש, בתיקייה שחשבון השירות לא קורא. מדריך שירות Windows מתאר את הגילוי הזה, וכדאי לקרוא אותו לפני שמעתיקים משהו, כי תיקיית היעד היא תכונה של ההתקנה ולא מוסכמה קבועה. לכן העתקת קובץ לתיקייה של ה-GUI לא משנה דבר עבור השירות, והעתקתו לכל תיקייה בשם config יוצרת כפילויות ולא תיקון.

Get-Service OpenVPNService | Select-Object Status, StartType
Get-CimInstance Win32_Service | Where-Object Name -eq 'OpenVPNService' | Select-Object PathName, StartName
gci 'C:\Program Files\OpenVPN\config-auto'

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

למה כניסה לשולחן עבודה עובדת והפעלה באתחול לא

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

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

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

בחרו בעלים אחד ובדקו את מחזור החיים האמיתי

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

Get-Content 'C:\Program Files\OpenVPN\log\openvpn.log' -Tail 40
Get-WinEvent -LogName Application -MaxEvents 20 | Where-Object ProviderName -like '*OpenVPN*'

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

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