هیچ cmdletی به نام Import-VpnProfile وجود ندارد و نزدیک‌ترین گزینه، یعنی Add-VpnConnection، هرگز فایل .ovpn یا .conf را نمی‌خواند. این cmdlet پروفایل بومی ویندوز را از پارامترهایی که می‌دهید می‌سازد و به همین دلیل نخستین بررسی اینجا قالب فایل است، نه خط فرمان. اگر دروازه SSTP، IKEv2، L2TP/IPsec یا PPTP را پشتیبانی می‌کند، ویندوز می‌تواند صاحب پروفایل باشد و بقیه فهرست هم اعمال می‌شود. اگر فایل OpenVPN یا WireGuard به شما داده شده است، همان مرحله یک متوقف شوید: آن کلاینت‌ها واردکننده خودشان را دارند.

مرحله 1: تأیید کنید ویندوز واقعاً صاحب کدام پروفایل می‌تواند باشد

دستور Get-Command -Module VpnClient را پیش از هر چیز روی این ماشین اجرا کنید. ویندوز 10، ویندوز 11 و Server 2016 یا جدیدتر این ماژول را همراه دارند؛ اگر وجود ندارد، هیچ اسکریپت کپی‌شده‌ای این میزبان را وادار به پذیرش پروفایل بومی نمی‌کند. cmdletهای مهم Add-VpnConnection، Get-VpnConnection و Remove-VpnConnection هستند و فهرست پارامترهای مرجع Add-VpnConnection ارزش یک بار خواندن کامل را دارد.

بومی یعنی پشته VPN ویندوز تونل را خاتمه می‌دهد. این شامل IKEv2 است، اغلب با گواهی ماشین؛ SSTP که TLS با احراز هویت کاربر یا گواهی در درون آن است؛ و L2TP/IPsec با کلید از پیش اشتراکی. فایل .ovpn یک اسکریپت OpenVPN است، نه اتصال ویندوز: دستورهایی مانند remote، cipher یا tls-auth را حمل می‌کند که پشته ویندوز هیچ تصوری از آن‌ها ندارد. فایل .conf وایرگارد هم همین داستان است با 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 شیئی را برمی‌گرداند که ویندوز همین حالا نوشته است، پس می‌توانید بدون فراخوانی دوم آن را بررسی کنید. اگر نام از قبل وجود داشته باشد، 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 یک شیء گواهی می‌گیرد و ویندوز از آن برای یافتن گواهی کلاینت قابل استفاده در 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: آزمودن آنچه یک تونل واقعاً باید تحویل دهد

یک نماد متصل فقط ثابت می‌کند تونل بالا آمده و نه چیز دیگری. نخست از خط فرمان وصل شوید تا شکست‌ها به‌صورت متن بیایند، نه در یک پنجره گفت‌وگو، سپس آنچه ویندوز ثبت کرده است را بخوانید:

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 می‌تواند بی‌نقص تونل بزند و باز هم هر جست‌وجوی اینترانت شکست بخورد. سپس به مسیر پیش‌فرض نگاه کنید: با خاموش بودن split tunneling، مسیر 0.0.0.0/0 با کمترین متریک باید به رابط VPN اشاره کند و با روشن بودن آن تنها پیشوندهایی که انتظار دارید. اگر هر دو درست به نظر می‌رسند و ترافیک باز هم می‌میرد، مشکل فراتر از پروفایل است، در سیاست یا فیلتر دروازه.

وقتی اتصال کاملاً شکست می‌خورد، کد مرحله‌ای را که باید دوباره بررسی شود محدود می‌کند:

  • 691: دروازه اعتبارنامه‌ها را رد کرد. به مرحله 3 برگردید، نه به تونل.
  • 809: دست‌دهی IKEv2 هرگز کامل نشد. UDP 500 و 4500 و اعتماد گواهی را بررسی کنید.
  • 789: کلید از پیش اشتراکی L2TP/IPsec گم شده یا اشتباه است.
  • 868: نام سرور تفکیک نشد. پیش از ویرایش پروفایل DNS را درست کنید.

دستور کارآمد را کنار تنظیماتی که رمزگذاری می‌کند نگه دارید تا نفر بعد بتواند بازسازی کند، نه اینکه پروفایل را از رابط کاربری مهندسی معکوس کند. اگر مجبور به بازسازی شدید، ورودی را حذف کنید و آن را با همان پارامترها دوباره بسازید؛ وصله کردن یک پروفایل نیمه‌پیکربندی‌شده مسیرهای کهنه و وضعیت احراز هویت را پشت سر می‌گذارد. و اگر فایل هرگز بومی نبود، به کلاینتی برگردید که صاحب آن است. یک .ovpn که به‌عنوان پروفایل IKEv2 آراسته شده، واردات نیست، یک تیکت پشتیبانی است.

مقالات مرتبط