אין cmdlet בשם Import-VpnProfile, והקרוב ביותר למראה, Add-VpnConnection, לעולם אינו קורא קובץ .ovpn או .conf. הוא מרכיב פרופיל מקורי של Windows מהפרמטרים שאתם מעבירים, ולכן נקודת הבדיקה הראשונה כאן היא פורמט הקובץ ולא שורת הפקודה. אם השער מדבר SSTP, IKEv2, L2TP/IPsec או PPTP, Windows יכול להחזיק בפרופיל ושאר הרשימה חל. אם קיבלתם קובץ OpenVPN או WireGuard, עצרו בשלב הראשון: ללקוחות האלה יש מייבאים משלהם.

שלב 1: לאשר איזה פרופיל Windows באמת יכול להחזיק

הריצו Get-Command -Module VpnClient במכונה לפני כל דבר אחר. Windows 10, Windows 11 ו-Server 2016 ואילך מגיעים עם המודול; אם הוא חסר, שום סקריפט מועתק לא יגרום למארח הזה לקבל פרופיל מקורי. הפקודות החשובות הן Add-VpnConnection, Get-VpnConnection ו-Remove-VpnConnection, ורשימת הפרמטרים במאמר העזר של Add-VpnConnection שווה קריאה מלאה אחת.

מקורי פירושו שמחסנית ה-VPN של Windows מסיימת את המנהרה. זה כולל IKEv2, לרוב עם תעודת מחשב; SSTP, שהוא TLS עם אימות משתמש או תעודה בפנים; ו-L2TP/IPsec עם מפתח משותף מראש. קובץ .ovpn הוא סקריפט OpenVPN, לא חיבור Windows: הוא נושא הנחיות כמו remote, cipher או tls-auth שלמחסנית של Windows אין מושג בהן. קובץ .conf של WireGuard הוא אותו סיפור עם PrivateKey ו-AllowedIPs; להמיר אחד לשני אינו בחירת פרמטר אלא מימוש מנהרה אחר.

יש ענף שלישי. אם מנהל מוסר לכם מסמך XML של VPNv2 CSP או פרופיל Intune, זהו מסלול ה-MDM, שמוחל על ידי מחסנית האספקה ולא על ידי Add-VpnConnection. אל תתרגמו את שמות הצמתים האלה לפרמטרים של PowerShell; שאלו במקום זאת איזה מנגנון מחיל את ה-XML.

שלב 2: להתאים את סוג המנהרה לשיטת האימות

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

  • IKEv2 עם MachineCertificate: הלקוח מציג תעודת מחשב; קבעו גם -EncryptionLevel Required.
  • SSTP עם Eap: תחילה מנהרת TLS, ואז PEAP/MSCHAPv2 או תעודה בתוך EAP. זה דורש את ה-XML משלב 3.
  • SSTP, L2TP או PPTP עם MSChapv2, Chap או Pap: שם משתמש וסיסמה פשוטים, בלי בלוק EAP.
  • L2TP עם MSChapv2 ו-Lt2pPsk: ה-PSK מכסה את חצי ה-IPsec, המשתמש מכסה את PPP; שניהם חייבים להתאים לשרת.

ה-splat שומר את הערכים במקום אחד:

$p = @{
  Name                 = "Corp IKEv2"
  ServerAddress        = "vpn.example.com"
  TunnelType           = "Ikev2"
  AuthenticationMethod = "MachineCertificate"
  EncryptionLevel      = "Required"
  SplitTunneling       = $false
  DnsSuffix            = "corp.example.com"
}
Add-VpnConnection @p -PassThru

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

שלב 3: למסור את חומר האימות כראוי

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

$eap = [xml](Get-Content -Raw .\peap-mschapv2.xml)
Add-VpnConnection -Name "Corp SSTP" -ServerAddress "sstp.example.com" `
  -TunnelType Sstp -AuthenticationMethod Eap `
  -EapConfigXmlStream $eap -EncryptionLevel Required

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

ב-IKEv2 חצי התעודה הוא חיפוש במאגר. -MachineCertificateIssuerFilter מקבל אובייקט תעודה, ו-Windows משתמש בו כדי למצוא תעודת לקוח שמישה ב-LocalMachine\My. התעודה צריכה מפתח פרטי ושרשרת שהשרת סומך עליה; כשאחד מהם חסר, האימות נכשל בלי פרט מועיל, ולכן בדקו קודם את המאגר:

Get-ChildItem Cert:\LocalMachine\My |
  Where-Object { $_.HasPrivateKey -and $_.NotAfter -gt (Get-Date) } |
  Select-Object Subject, Issuer, Thumbprint, NotAfter

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

שלב 4: להחליט על ההיקף לפני ההרצה הראשונה

אותו cmdlet כותב לשני ספרי טלפון שונים. בלי -AllUserConnection הפרופיל שלכם ויושב תחת %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk. איתו, מחלון פקודה מוגבה, הפרופיל עובר ל-%ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk ונראה לכל חשבון, כולל מסך הכניסה.

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

# elevated prompt
Remove-VpnConnection -Name "Corp IKEv2" -Force
Add-VpnConnection -Name "Corp IKEv2" -ServerAddress "vpn.example.com" `
  -TunnelType Ikev2 -AuthenticationMethod MachineCertificate `
  -EncryptionLevel Required -AllUserConnection

שלב 5: לבדוק מה מנהרה באמת צריכה לספק

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

rasdial "Corp IKEv2"
Get-VpnConnection -Name "Corp IKEv2" |
  Select-Object Name, ServerAddress, TunnelType, ConnectionStatus, SplitTunneling
Get-NetRoute -DestinationPrefix "0.0.0.0/0"

שני הכשלים שמשתמשים מדווחים עליהם כשהסטטוס עוד אומר Connected הם DNS וניתוב. פתרו שם פנימי ובדקו איזה שרת ענה; פרופיל בלי -DnsSuffix יכול לעשות מנהרה מושלמת ובכל זאת להיכשל בכל חיפוש ברשת הפנימית. אחר כך הסתכלו במסלול ברירת המחדל: כשפיצול המנהרה כבוי, מסלול 0.0.0.0/0 עם המדד הנמוך ביותר אמור להצביע לממשק ה-VPN, וכשהוא דלוק רק התחיליות שאתם מצפים להן. אם שניהם נראים נכון והתעבורה עדיין מתה, הבעיה מעבר לפרופיל, במדיניות או במסנן השער.

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

  • 691: השער דחה את פרטי האימות. חזרו לשלב 3, לא למנהרה.
  • 809: לחיצת היד של IKEv2 לא הושלמה מעולם. בדקו UDP 500 ו-4500, ואת אמון התעודה.
  • 789: המפתח המשותף מראש של L2TP/IPsec חסר או שגוי.
  • 868: שם השרת לא נפתר. תקנו את ה-DNS לפני עריכת הפרופיל.

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

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