SSTP VPN Kurulumu: Sertifika Tabanlı Güvenli Bağlantı
Kurumsal ağlarda VPN protokolü seçimi her zaman tartışmalı bir konu olmuştur. IPSec mi, OpenVPN mi, L2TP mi derken SSTP çoğu zaman göz ardı edilir. Oysa Microsoft’un kendi geliştirdiği bu protokol, özellikle Windows ağırlıklı ortamlarda ciddi avantajlar sunuyor. Firewall arkasından bile çalışabilmesi, 443 portunu kullanması ve sertifika tabanlı kimlik doğrulama desteği… Bir müşterimizin kurumunda geçen yıl yaptığım SSTP kurulumundan sonra “neden daha önce bunu kurmadık” sorusunu defalarca duydum. Bu yazıda sıfırdan bir SSTP VPN sunucusu kurmanın tüm adımlarını paylaşacağım.
SSTP Nedir ve Neden Tercih Edilmeli?
SSTP (Secure Socket Tunneling Protocol), VPN trafiğini HTTPS üzerinden taşıyan bir tünel protokolüdür. Microsoft tarafından Windows Vista SP1 ile birlikte tanıtılmıştır. Temel mantığı şu: VPN trafiğini TCP 443 üzerinden SSL/TLS şifrelemesiyle paketleyerek iletir. Bu da onu diğer protokollerden ayıran en kritik özelliğini ortaya koyar.
Pek çok kurumda ağ ekibi dışarıdan gelen VPN bağlantılarına şüpheyle bakar. UDP 1194, TCP 1723 gibi portlar güvenlik duvarında kapalı olabilir. Ama 443’ü kapamazsınız çünkü HTTPS trafiği bu porttan geçer. SSTP tam da bu noktada devreye girer.
Avantajları:
- TCP 443 kullandığı için NAT ve proxy arkasından geçer
- SSL/TLS tabanlı şifreleme sayesinde yüksek güvenlik
- Windows istemcilerinde ek yazılım gerektirmez (Vista SP1 ve üzeri)
- Active Directory ile entegrasyon kolaylığı
- Sertifika altyapısı ile kurumsal kimlik doğrulama
Dezavantajları:
- Yalnızca Windows istemcilerinde native çalışır (Linux için ek paket gerekir)
- TCP üzerinde çalışması performans açısından UDP’ye kıyasla biraz geride kalabilir
- Sunucu tarafında geçerli bir SSL sertifikası şart
Ön Gereksinimler
Kuruluma başlamadan önce elimizde bulunması gerekenleri netleştirelim:
- Windows Server 2016/2019/2022 (bu yazıda 2022 kullanacağım)
- Geçerli bir SSL/TLS sertifikası (Let’s Encrypt, ticari CA veya kurumsal PKI)
- Sunucuya atanmış statik public IP adresi
- DNS kaydı oluşturulmuş bir hostname (vpn.sirketadi.com gibi)
- Domain ortamında çalışıyorsanız Active Directory kullanıcıları
- Yönetici hakları
Sertifika konusunda şunu söylemeliyim: Self-signed sertifika teknik olarak çalışır ama her istemciye bu sertifikayı güvenilir olarak tanıtmanız gerekir. Kurumsal ortamda kendi CA’nız varsa ondan alınmış sertifika idealdir. Yoksa Let’s Encrypt veya ticari bir sertifika kullanın.
Rol Kurulumu
İlk adım olarak Routing and Remote Access Service (RRAS) rolünü sunucuya yüklememiz gerekiyor. PowerShell ile yapalım:
Install-WindowsFeature -Name RemoteAccess -IncludeManagementTools
Install-WindowsFeature -Name Routing -IncludeManagementTools
Install-WindowsFeature -Name RRAS -IncludeManagementTools
Yükleme tamamlandıktan sonra servisi başlatalım:
Install-RemoteAccess -VpnType Vpn
Bu komut çalıştırıldığında temel RRAS yapılandırması oluşturulur. Ancak SSTP için sertifika bağlaması ve bazı ek ayarlar gerekiyor, bunlara birazdan geleceğiz.
Sertifika Hazırlığı ve Bağlama
Bu aşama kurulumun en kritik parçası. Sertifikanın doğru şekilde kurulması ve SSTP ile ilişkilendirilmesi gerekiyor.
Sertifikanızı PFX formatında temin ettikten sonra sunucuya aktarın ve şu komutla kurun:
$certPassword = ConvertTo-SecureString -String "SertifikaParolaniz123!" -Force -AsPlainText
Import-PfxCertificate -FilePath "C:certsvpn_sertifika.pfx" `
-CertStoreLocation Cert:LocalMachineMy `
-Password $certPassword
Sertifika yüklendikten sonra thumbprint değerini almanız gerekiyor. Bu değeri SSTP ile ilişkilendirmede kullanacaksınız:
Get-ChildItem -Path Cert:LocalMachineMy |
Where-Object {$_.Subject -like "*vpn.sirketadi.com*"} |
Select-Object Subject, Thumbprint, NotAfter
Çıktıda gördüğünüz Thumbprint değerini bir kenara not alın. Şimdi bu sertifikayı SSTP servisine bağlayalım:
$thumbprint = "BURAYA_THUMBPRINT_YAZIN"
netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumbprint appid="{BA195980-CD49-458b-9E23-C84EE0ADCD75}"
Buradaki appid değeri SSTP servisi için standart GUID’dir, değiştirmenize gerek yok. Şimdi mevcut bağlamayı doğrulayalım:
netsh http show sslcert ipport=0.0.0.0:443
Eğer daha önce başka bir uygulama (IIS gibi) 443 portunu kullanıyorsa çakışma yaşarsınız. Bu durumda önce mevcut bağlamayı kaldırmanız gerekir:
netsh http delete sslcert ipport=0.0.0.0:443
RRAS Yapılandırması
Sertifika hazır, şimdi RRAS’ı SSTP destekleyecek şekilde yapılandıralım. PowerShell ile yapabileceğimiz gibi GUI üzerinden de gidebiliriz. Ben her iki yolu da göstereceğim.
PowerShell yoluyla VPN sunucusu özelliklerini ayarlamak için:
# SSTP için port sayısını artır (varsayılan 128'dir, ihtiyaca göre düzenle)
Set-VpnServerConfiguration -TunnelType Sstp -SstpPorts 200
# IP adres havuzu tanımla (istemcilere verilecek IP aralığı)
Add-VpnIpAddressRange -IPAddressRangeList @{StartIPAddress="10.10.10.100"; EndIPAddress="10.10.10.200"}
# DNS sunucusunu istemcilere bildir
Set-VpnServerIPsecConfiguration -CustomPolicy $false
GUI tercih edenler için adımlar şöyle: Server Manager üzerinden Tools > Routing and Remote Access yolunu izleyin. Sunucu adına sağ tıklayıp Properties’e girin. Security sekmesinde sertifika seçimini yapın. IPv4 sekmesinde statik adres havuzu tanımlayın.
Bir diğer önemli nokta, Windows Firewall üzerinde 443 portunu açmak:
New-NetFirewallRule -DisplayName "SSTP VPN" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 443 `
-Action Allow `
-Profile Any
Kullanıcı Yetkilendirmesi
RRAS kurulumu tamamlandı ama kullanıcılara erişim izni vermemiz gerekiyor. Bunu iki farklı şekilde yapabilirsiniz: Network Policy Server (NPS) üzerinden veya direkt kullanıcı hesabı özelliklerinden.
Domain ortamında NPS kullanmak çok daha yönetilebilir bir yapı sunar. NPS ile grup tabanlı politikalar oluşturabilir, bağlantı süresini sınırlayabilir, gün ve saat kısıtlaması getirebilirsiniz.
NPS rolünü ekleyelim:
Install-WindowsFeature -Name NPAS -IncludeManagementTools
Basit bir senaryo için tek kullanıcıya dial-in izni vermek yeterliyse:
# Active Directory kullanıcısına VPN erişimi ver
Set-ADUser -Identity "kullanici.adi" -Replace @{msNPAllowDialin=$true}
Birden fazla kullanıcı için bu işlemi toplu yapmak istiyorsanız:
$vpnUsers = Get-ADGroupMember -Identity "VPN-Kullanicilari" -Recursive
foreach ($user in $vpnUsers) {
Set-ADUser -Identity $user.SamAccountName `
-Replace @{msNPAllowDialin=$true}
Write-Host "$($user.SamAccountName) icin VPN erisimi verildi"
}
İstemci Tarafı Yapılandırması
Sunucu hazır. Şimdi istemci tarafına bakacağız. Windows istemcide SSTP VPN bağlantısı oluşturmak oldukça basit. Manuel ya da PowerShell ile yapılabilir.
PowerShell ile VPN bağlantısı oluşturmak:
Add-VpnConnection -Name "Sirket VPN" `
-ServerAddress "vpn.sirketadi.com" `
-TunnelType Sstp `
-EncryptionLevel Required `
-AuthenticationMethod MSChapv2 `
-RememberCredential $true `
-SplitTunneling $true `
-PassThru
SplitTunneling parametresine dikkat edin. Bu değer $true olduğunda yalnızca kurumsal ağa yönelik trafik VPN üzerinden geçer, internet trafiği doğrudan gider. Tüm trafiği VPN’den geçirmek istiyorsanız $false yapın. Ancak bu kullanıcı deneyimini etkileyebilir ve bant genişliğini tüketir.
Sertifika doğrulama uyarılarını aşmak için kurumsal CA sertifikasının istemcide de güvenilir kök sertifikalar deposuna eklenmesi gerekir:
# CA sertifikasını güvenilir kök deposuna ekle
Import-Certificate -FilePath "C:certskurumsal_ca.cer" `
-CertStoreLocation Cert:LocalMachineRoot
Gelişmiş Güvenlik Ayarları
Temel kurulumu tamamladık ama gerçek dünya senaryolarında bu kadarla yetinemeyiz. Birkaç ek güvenlik önlemi almak gerekiyor.
TLS sürümü kısıtlaması: TLS 1.0 ve 1.1 artık güvensiz kabul ediliyor. Registry üzerinden bunları devre dışı bırakıp yalnızca TLS 1.2 ve 1.3 kullanmaya zorlayabiliriz:
# TLS 1.0'ı devre disi birak
New-Item -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -Force
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -Name "Enabled" -Value 0 -Type DWord
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -Name "DisabledByDefault" -Value 1 -Type DWord
# TLS 1.2'yi zorla etkinlestir
New-Item -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -Force
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -Name "Enabled" -Value 1 -Type DWord
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -Name "DisabledByDefault" -Value 0 -Type DWord
Bu değişikliklerin ardından sunucuyu yeniden başlatmanız gerekiyor. Registry değişiklikleri servis yeniden başlatmasıyla aktif olmaz.
Accounting ve Logging: Kimin ne zaman bağlandığını kayıt altına almak hem güvenlik hem de uyum açısından kritik. RRAS loglarını etkinleştirelim:
# RRAS oturum loglarini etkinlestir
netsh ras set tracing * enabled
Event Viewer üzerinde Applications and Services Logs > Microsoft > Windows > RemoteAccess-RemoteAccessServer yolundan bağlantı olaylarını takip edebilirsiniz.
Sertifika Yenileme Süreci
Birçok sysadmin kurulum yapar, her şeyi çalışır hale getirir, sonra sertifika süresi dolunca VPN tamamen durur ve panik yaşanır. Bu senaryoyu defalarca gördüm. Otomatik bir yenileme ve güncelleme süreci oluşturmak şart.
Let’s Encrypt kullanıyorsanız Certbot veya win-acme ile otomatik yenileme yapılabilir. Ancak SSTP sertifika bağlamasının da yenileme sonrası güncellenmesi gerekiyor. Bunun için bir PowerShell scripti hazırlayalım:
# SertifikaGuncelle.ps1
# Bu script yenilenen sertifikayi SSTP'ye baglar
$hostname = "vpn.sirketadi.com"
$yeniSertifika = Get-ChildItem -Path Cert:LocalMachineMy |
Where-Object {$_.Subject -like "*$hostname*"} |
Sort-Object NotAfter -Descending |
Select-Object -First 1
if ($null -eq $yeniSertifika) {
Write-Error "Sertifika bulunamadi: $hostname"
exit 1
}
$thumbprint = $yeniSertifika.Thumbprint
$appid = "{BA195980-CD49-458b-9E23-C84EE0ADCD75}"
# Eski baglamayi kaldir
netsh http delete sslcert ipport=0.0.0.0:443
# Yeni sertifikayi bagla
netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumbprint appid=$appid
# RRAS servisini yeniden baslat
Restart-Service -Name RemoteAccess -Force
Write-Host "Sertifika guncellendi: $thumbprint"
Write-Host "Gecerlilik: $($yeniSertifika.NotAfter)"
Bu scripti Task Scheduler’a ekleyin ve sertifika yenileme tarihinden birkaç gün sonra çalışacak şekilde ayarlayın.
Sorun Giderme
Gerçek dünyada her şey mükemmel çalışmaz. En sık karşılaşılan sorunlar ve çözümleri:
Bağlantı hatası 0x800B0101: Sertifika güven sorunu. İstemcinin CA sertifikasına güvenmediğini gösterir. CA sertifikasını istemcinin Trusted Root deposuna eklemeniz gerekiyor.
Bağlantı hatası 809: SSTP portu (443) erişilemiyor. Güvenlik duvarı kurallarını kontrol edin. Ayrıca başka bir uygulama 443’ü kullanıyor olabilir.
Error 798: Sertifika sunucu tarafında bulunamadı. Thumbprint ile yaptığınız bağlamayı doğrulayın.
Bağlantı sorunlarını test etmek için istemci tarafından şu komutu kullanabilirsiniz:
# SSL baglantiyi test et
Test-NetConnection -ComputerName vpn.sirketadi.com -Port 443
# Sertifika zincirini dogrula
$tcpClient = New-Object System.Net.Sockets.TcpClient("vpn.sirketadi.com", 443)
$sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream())
$sslStream.AuthenticateAsClient("vpn.sirketadi.com")
$cert = $sslStream.RemoteCertificate
Write-Host "Sunucu sertifikasi: $($cert.Subject)"
Write-Host "Gecerlilik: $($cert.GetExpirationDateString())"
$sslStream.Close()
$tcpClient.Close()
Sunucu tarafında RRAS servis durumunu ve aktif bağlantıları görmek için:
# Aktif VPN baglantilarini listele
Get-RemoteAccessConnectionStatistics
# RRAS servis durumu
Get-Service -Name RemoteAccess | Select-Object Status, StartType
# Son baglanti hatalarini goster
Get-EventLog -LogName System -Source RemoteAccess -Newest 20 |
Where-Object {$_.EntryType -eq "Error"} |
Select-Object TimeGenerated, Message
Monitoring ve Bakım
Production ortamında SSTP sunucusunu izlemek için birkaç önemli metrik takip edilmeli:
Sertifika geçerlilik süresi: Sertifikanın sona erme tarihini düzenli kontrol edin. Bunu otomatikleştirmek için:
$cert = Get-ChildItem Cert:LocalMachineMy |
Where-Object {$_.Subject -like "*vpn.sirketadi.com*"}
$kalanGun = ($cert.NotAfter - (Get-Date)).Days
if ($kalanGun -lt 30) {
Send-MailMessage -To "[email protected]" `
-From "[email protected]" `
-Subject "UYARI: VPN Sertifikasi $kalanGun gun icinde sona eriyor" `
-Body "Sunucu: vpn.sirketadi.com - Gecerlilik: $($cert.NotAfter)" `
-SmtpServer "smtp.sirket.com"
}
Bu scripti günlük çalışacak şekilde Task Scheduler’a eklerseniz sürpriz sertifika sorunlarının önüne geçersiniz.
Aktif bağlantı sayısı: Çok fazla eş zamanlı bağlantı sunucu performansını etkiler. Kapasite planlaması için bunu takip edin.
Authentication başarısızlıkları: Kısa sürede çok sayıda başarısız giriş denemesi brute force saldırısına işaret edebilir. NPS üzerinde hesap kilitleme politikası tanımlamayı ihmal etmeyin.
Sonuç
SSTP, Windows ağırlıklı kurumsal ortamlarda gerçekten pratik bir VPN çözümü. Özellikle kısıtlayıcı firewall politikalarının olduğu müşteri ağlarından veya otellerin internet bağlantısından çalışmak durumunda olan kullanıcılar için 443 portunun kullanılması büyük avantaj sağlıyor.
Kurulum görünürde karmaşık gibi dursa da adımları tek tek takip ettiğinizde aslında oldukça sistematik bir süreç. En kritik nokta sertifika yönetimi. Bunu doğru yapar ve otomatize ederseniz SSTP VPN sunucunuz çok az bakım gerektiren, stabil bir altyapı bileşeni haline gelir.
Son bir not: SSTP iyi bir seçenek olmakla birlikte tüm senaryolar için tek doğru cevap değil. Mac ve Linux istemcilerin yoğun olduğu ortamlarda OpenVPN veya WireGuard daha pratik olabilir. Altyapınızın ihtiyaçlarını değerlendirip buna göre karar verin. Ama Windows ağırlıklı bir kurumsal ortamdaysanız ve Active Directory ile sıkı entegrasyon istiyorsanız SSTP’ye ciddi ciddi bakmanızı öneririm.
