Import-VpnProfile adında bir cmdlet yok ve en çok benzeyeni, Add-VpnConnection, hiçbir zaman bir .ovpn veya .conf dosyası okumaz. Geçirdiğiniz parametrelerden yerel bir Windows profili kurar; bu yüzden burada ilk kontrol noktası komut satırı değil dosya biçimidir. Ağ geçidi SSTP, IKEv2, L2TP/IPsec veya PPTP konuşuyorsa, profilin sahibi Windows olabilir ve listenin geri kalanı geçerli olur. Elinize bir OpenVPN veya WireGuard dosyası verildiyse birinci adımda durun: bu istemciler kendi içe aktarıcılarına sahiptir.

Adım 1: Windows'un gerçekten sahiplenebileceği profili doğrulayın

Her şeyden önce makinede şunu çalıştırın: Get-Command -Module VpnClient komutunu çalıştırın. Windows 10, Windows 11 ve Server 2016 veya üzeri bu modülle gelir; modül yoksa, kopyalanmış hiçbir betik bu ana bilgisayarın yerel bir profili kabul etmesini sağlamaz. Önemli olan cmdlet'ler Add-VpnConnection, Get-VpnConnection ve Remove-VpnConnection'tır ve şuradaki parametre listesi Add-VpnConnection başvurusu bir kez baştan sona okumaya değer.

Yerel, tüneli Windows VPN yığınının sonlandırdığı anlamına gelir. Bu, çoğu zaman makine sertifikasıyla IKEv2'yi; içinde kullanıcı veya sertifika kimlik doğrulaması olan TLS olan SSTP'yi; ve ön paylaşımlı anahtarla L2TP/IPsec'i kapsar. Bir .ovpn dosyası bir OpenVPN betiğidir, Windows bağlantısı değildir: Windows yığınının hiçbir kavramı olmayan remote, cipher veya tls-auth gibi yönergeler taşır. Bir WireGuard .conf dosyası PrivateKey ve AllowedIPs ile aynı hikâyedir; birini diğerine çevirmek bir parametre seçimi değil, farklı bir tünel uygulamasıdır.

Üçüncü bir dal var. Bir yönetici size bir VPNv2 CSP XML belgesi veya bir Intune profili verirse, bu MDM yoludur ve Add-VpnConnection yerine sağlama yığını tarafından uygulanır. Bu düğüm adlarını PowerShell parametrelerine çevirmeyin; bunun yerine XML'i hangi mekanizmanın uyguladığını sorun.

Adım 2: Tünel türünü kimlik doğrulama yöntemiyle eşleştirin

-TunnelType ve -AuthenticationMethod ayrı parametrelerdir ve ağ geçidi yalnızca kombinasyonu önemser. Birini doğru diğerini yanlış yaparsanız hiçbir yere bağlanmayan ya da tünel açıkken takılan bir profil elde edersiniz. Başka bir hizmet için seçilmiş bir varsayılana güvenmek yerine ikisini de açıkça ayarlayın.

  • MachineCertificate ile IKEv2: istemci bir bilgisayar sertifikası sunar; ayrıca -EncryptionLevel Required ayarlayın.
  • Eap ile SSTP: önce TLS tüneli, sonra PEAP/MSCHAPv2 veya EAP içinde bir sertifika. Bu, 3. adımdaki XML'i gerektirir.
  • MSChapv2, Chap veya Pap ile SSTP, L2TP ya da PPTP: düz kullanıcı adı ve parola, EAP blobu yok.
  • MSChapv2 ve -Lt2pPsk ile L2TP: PSK, IPsec yarısını; kullanıcı PPP'yi kapsar; ikisi de sunucuyla eşleşmelidir.

Bir splat değerleri tek yerde tutar:

$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'un az önce yazdığı nesneyi döndürür, böylece ikinci bir çağrı yapmadan inceleyebilirsiniz. Ad zaten varsa cmdlet çalışmayı reddeder; -Force üzerine yazar, ki bu bir üretim dizüstünde yanlış bir reflekstir çünkü birinin elle yapılandırdığı her şeyi sessizce siler.

Adım 3: Kimlik bilgisi malzemesini doğru şekilde teslim edin

Parolalar, ön paylaşımlı anahtarlar ve EAP blobları bu betiklerin genellikle kırıldığı yerlerdir. -EapConfigXmlStream bir yol değil XmlDocument ister, bu yüzden dosyayı önce okuyup tür dönüşümü yapın. Bir dize geçirmek, şema sorunu gibi okunan bir dönüştürme hatası üretir ve insanları hiç yanlış olmayan XML'i yeniden yazmaya iter.

$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

O XML, bir blog alıntısından uydurulacak bir şey değildir. EAP yöntem türünü ve iç kimlik doğrulamayı adlandırır ve ağ geçidi ikisini de kendi ilkesiyle karşılaştırır. Eşleşmeyen bir iç yöntem, TLS el sıkışması tamamlandıktan sonra başarısız olur; bu tam olarak kötü bir parola gibi görünür ve öyle değildir. XML'i ağ geçidini işleten kişiden alın ya da zaten çalışan bir profilden dışa aktarın.

IKEv2 için sertifika yarısı bir depo aramasıdır. -MachineCertificateIssuerFilter bir sertifika nesnesi alır ve Windows bunu LocalMachine\My içinde kullanılabilir bir istemci sertifikası bulmak için kullanır. Sertifikanın bir özel anahtara ve sunucunun güvendiği bir zincire ihtiyacı vardır; biri eksikse kimlik doğrulama yararlı bir ayrıntı olmadan başarısız olur, bu yüzden önce depoyu kontrol edin:

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

Sırları betik dosyasından uzak tutun. Komut satırında geçirilen veya bir .ps1 içine gömülen bir PSK, dökümlere, kaydedilmiş oturumlara ve paylaşılan depolara düşer ve -RememberCredential kullanıcı kimlik bilgilerini sonrası için önbelleğe alarak tek seferlik bir testi kalıcı bir yetkiye dönüştürür.

Adım 4: Kapsama ilk çalıştırmadan önce karar verin

Aynı cmdlet iki farklı telefon defterine yazar. -AllUserConnection olmadan profil size aittir ve %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk altında yaşar. Onunla birlikte, yükseltilmiş bir komut isteminden, profil oturum açma ekranı dahil her hesap tarafından görülür ve %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk konumuna gider.

Kapsam kozmetik değildir. Tüm kullanıcılara açık profil, bir hizmet hesabının, zamanlanmış bir görevin veya oturum açma öncesi senaryonun kullanabileceği profildir; kullanıcı başına profil bu üçü için görünmezdir. Nesneler farklı okunur: Get-VpnConnection geçerli kullanıcının girdilerini listeler, Get-VpnConnection -AllUserConnection makine genelindekileri listeler. Şimdi birini seçin ve sonraki bir değişikliği düzenleme değil silip yeniden oluşturma olarak ele alın:

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

Adım 5: Bir tünelin gerçekte neyi teslim etmesi gerektiğini test edin

Bağlı bir simge, tünelin açıldığını kanıtlar, başka bir şeyi değil. Hatalar iletişim kutusu olarak değil metin olarak gelsin diye önce komut satırından bağlanın, sonra Windows'un ne kaydettiğini okuyun:

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

Kullanıcıların durum hâlâ Bağlı derken bildirdiği iki arıza DNS ve yönlendirmedir. Bir iç adı çözümleyin ve hangi sunucunun yanıt verdiğine bakın; -DnsSuffix olmayan bir profil mükemmel tünel açıp yine de her intranet aramasında başarısız olabilir. Ardından varsayılan yola bakın: bölünmüş tünelleme kapalıyken en düşük metrikli 0.0.0.0/0 yolu VPN arabirimine işaret etmelidir, açıkken yalnızca beklediğiniz önekler etmelidir. İkisi de doğru görünüyor ve trafik hâlâ ölüyorsa sorun profilin ötesinde, ilkede veya ağ geçidi filtresindedir.

Bağlantı tümüyle başarısız olduğunda kod, geri dönülecek adımı daraltır:

  • 691: ağ geçidi kimlik bilgilerini reddetti. Tünele değil, 3. adıma dönün.
  • 809: IKEv2 el sıkışması hiç tamamlanmadı. UDP 500 ve 4500 ile sertifika güvenini kontrol edin.
  • 789: L2TP/IPsec ön paylaşımlı anahtarı eksik veya yanlış.
  • 868: sunucu adı çözümlenmedi. Profili düzenlemeden önce DNS'i düzeltin.

Çalışan komutu, kodladığı ayarların yanında tutun ki bir sonraki kişi profili arayüzden tersine mühendislikle çözmek yerine yeniden kurabilsin. Gerçekten yeniden kurmanız gerekirse girdiyi silin ve aynı parametrelerle yeniden oluşturun; yarı yapılandırılmış bir profili yamamak geride eski yollar ve kimlik doğrulama durumu bırakır. Ve dosya hiç yerel olmadıysa, ona sahip olan istemciye dönün. IKEv2 profili gibi giydirilmiş bir .ovpn içe aktarma değil, bir destek talebidir.

İlgili makaleler