Windows Server’da Remote Access Role ile VPN Sunucusu Kurulumu
Şirketin VPN sunucusunu bir anda ayağa kaldırman gerektiğinde, özellikle de üçüncü parti bir çözüm lisansı yoksa, Windows Server’ın kendi bünyesinde gelen Remote Access Role tam olarak bu iş için var. Yıllar içinde pek çok ortamda bu rolü kurdum; kimi zaman küçük bir muhasebe firması için basit bir PPTP kurulumu, kimi zaman da yüzlerce kullanıcısı olan bir holdingin IKEv2 altyapısı için. Her seferinde “neden bu kadar az kaynak var bunun hakkında Türkçe olarak?” diye sordum kendime. İşte o eksikliği gidermek için bu yazıyı yazıyorum.
Remote Access Role Nedir ve Ne Zaman Tercih Edilmeli
Windows Server’daki Remote Access Role, temel olarak üç bileşenden oluşur: DirectAccess, VPN (RRAS) ve Web Application Proxy. Biz bu yazıda RRAS (Routing and Remote Access Service) üzerinden VPN sunucusu kurulumuna odaklanacağız.
Bu rolü şu senaryolarda tercih edebilirsiniz:
- Ek lisans maliyeti olmadan kurumsal VPN çözümü istiyorsanız
- Active Directory entegrasyonu kritikse
- RADIUS ile merkezi kimlik doğrulama yapmanız gerekiyorsa
- Mevcut Windows Server altyapınızı kullanmak istiyorsanız
- Site-to-site VPN tüneli kuracaksanız
Ticari alternatiflere (Cisco ASA, Fortinet, pfSense) kıyasla yönetim arayüzü biraz eski kafalı gelebilir, ancak NPS (Network Policy Server) ile birleştiğinde oldukça güçlü bir erişim kontrolü sağlıyor.
Ön Gereksinimler ve Hazırlık
Kuruluma geçmeden önce ortamınızı şekillendirmeniz gerekiyor. Benim önerim şu: bu sunucuyu salt VPN geçidi olarak kullanın, üzerine başka roller yüklemeyin. Özellikle domain controller ile aynı makineye kurmak ciddi sorunlara yol açar, bunu zor yoldan öğrendim.
Gereken minimum altyapı:
- Windows Server 2019 veya 2022 (2016 da destekleniyor ama bitiyor)
- İki ağ arabirimi: biri internete bakan (public), biri iç ağa bakan (private)
- Statik public IP adresi veya DDNS
- Firewall’da açılacak portlar: UDP 500, UDP 4500 (IKEv2), TCP 1723 (PPTP – kullanmayın), TCP 443 (SSTP)
- Sunucu için geçerli bir SSL sertifikası (IKEv2 ve SSTP için şart)
Sunucu ismi ve IP planlaması şöyle olsun diyelim:
- Sunucu: VPN-SRV01
- Public IP: 203.0.113.10
- Internal IP: 192.168.1.1
- VPN IP Havuzu: 192.168.100.0/24
- Internal Network: 192.168.1.0/24
Remote Access Rolünün Kurulumu
Kurulumu PowerShell ile yapmak her zaman daha temiz ve tekrarlanabilir. GUI ile de yapılabilir tabii ama script bırakmak ilerleyen zamanlarda hayat kurtarır.
# Remote Access rolünü ve gerekli özelliklerini kur
Install-WindowsFeature RemoteAccess -IncludeManagementTools
# RRAS ve Routing bileşenlerini de ekle
Install-WindowsFeature -Name Routing -IncludeManagementTools
# DirectAccess-VPN özelliğini doğrula
Install-WindowsFeature -Name DirectAccess-VPN -IncludeManagementTools
# Kurulum tamamlandıktan sonra kontrol et
Get-WindowsFeature -Name RemoteAccess, Routing, DirectAccess-VPN
Kurulum tamamlandıktan sonra servislerin durumuna bakın. RemoteAccess servisi henüz yapılandırılmadığı için başlamayacaktır, bu normal.
# Servis durumunu kontrol et
Get-Service RemoteAccess, RasMan
# RRAS servisini yapılandırmak için hazırlık
Set-Service -Name RemoteAccess -StartupType Automatic
RRAS’ı VPN için Yapılandırma
Şimdi asıl iş başlıyor. RRAS’ı yalnızca VPN erişimi için yapılandıracağız. Burada netsh komutu eski ama hala güvenilir yöntem:
# RRAS'ı VPN sunucusu olarak yapılandır
# -vpn parametresi hem PPTP hem L2TP hem SSTP hem IKEv2'yi etkinleştirir
# -type parametresi: 1=VPN, 2=Dial-up, 4=NAT, 8=LAN Routing, 128=RADIUS
$externalInterface = "Ethernet0" # Public NIC adı
$internalInterface = "Ethernet1" # Internal NIC adı
# RRAS yapılandırması
netsh ras set type vpnonly
Daha modern ve önerilen yol ise PowerShell modülünü kullanmak:
# RRAS'ı VPN için yapılandır ve başlat
# IPv4 ve IPv6 adres atamasını statik havuzdan yap
Install-RemoteAccess -VpnType VPN `
-IPv4AddressRange @{Start="192.168.100.10"; End="192.168.100.100"} `
-PassThru
# Yapılandırma tamamlandıktan sonra servis otomatik başlamalı
Get-Service RemoteAccess
Eğer Install-RemoteAccess komutu beklenmedik bir hata verirse, önce RRAS servisini manuel olarak başlatmayı deneyin ve sonrasında aşağıdaki registry anahtarını kontrol edin:
# RRAS yapılandırma durumunu kontrol et
Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesRemoteAccessParameters" `
-Name "ServiceType"
# VPN protokol yapılandırmasını görüntüle
netsh ras show type
IKEv2 Protokolünün Etkinleştirilmesi
PPTP’yi kesinlikle kullanmayın. L2TP/IPsec kabul edilebilir ama IKEv2 modern ve çok daha sağlam. Windows 7 ve üzeri, iOS, Android, macOS, Linux hepsi IKEv2 destekliyor.
IKEv2 için önce bir SSL sertifikasına ihtiyacınız var. Üretim ortamında Let’s Encrypt veya kurumsal CA’nızdan alınan sertifika kullanın. Test için self-signed da çalışır ama istemcilerde ek yapılandırma gerektirir.
# Self-signed sertifika oluştur (test ortamı için)
$cert = New-SelfSignedCertificate `
-Subject "CN=vpn.sirketiniz.com" `
-DnsName "vpn.sirketiniz.com" `
-CertStoreLocation "Cert:LocalMachineMy" `
-KeyUsage DigitalSignature, KeyEncipherment `
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1") `
-NotAfter (Get-Date).AddYears(2)
# Sertifika thumbprint'ini not et
Write-Host "Sertifika Thumbprint: $($cert.Thumbprint)"
# Sertifikayı Trusted Root'a da ekle (self-signed için gerekli)
$rootStore = New-Object System.Security.Cryptography.X509Certificates.X509Store(
[System.Security.Cryptography.X509Certificates.StoreName]::Root,
[System.Security.Cryptography.X509Certificates.StoreOpenFlags]::ReadWrite
)
$rootStore.Open("ReadWrite")
$rootStore.Add($cert)
$rootStore.Close()
Sertifikayı RRAS’a bağlamak için:
# Sertifikanın thumbprint'ini al
$thumbprint = (Get-ChildItem -Path "Cert:LocalMachineMy" |
Where-Object {$_.Subject -like "*vpn.sirketiniz.com*"}).Thumbprint
# RRAS'ın kullanacağı sertifikayı ayarla
$certHash = [System.Convert]::FromHexString($thumbprint)
netsh ras set sstp-ssl-cert $thumbprint
# IKEv2 için sertifikayı kayıt defterine yaz
Set-ItemProperty `
-Path "HKLM:SYSTEMCurrentControlSetServicesRemoteAccessParametersIkEv2" `
-Name "CertificateHash" `
-Value $certHash
NPS ile RADIUS Entegrasyonu
VPN kullanıcılarını Active Directory üzerinden doğrulamak için NPS (Network Policy Server) kurmanız şiddetle tavsiye edilir. Hem merkezi politika yönetimi sağlar hem de kullanıcı bazında erişim kısıtlaması yapabilirsiniz.
# NPS rolünü kur
Install-WindowsFeature NPAS -IncludeManagementTools
# NPS'i RRAS ile kullanmak üzere kaydet
netsh ras add registeredserver
# Veya PowerShell ile:
Register-NpsServer -ComputerName $env:COMPUTERNAME
NPS politikası oluşturmak için GUI kullanmak daha pratik, ancak temel politikayı netsh ile de yapabilirsiniz:
# Mevcut NPS politikalarını listele
netsh nps show np
# RRAS istemci olarak NPS'e kaydet
netsh nps add client name="VPN-SRV01" `
address="192.168.1.1" `
secret="GucluBirSharedSecret123!" `
requireauthattrib="0"
Kullanıcı ve Grup Tabanlı Erişim Kontrolü
Active Directory’de VPN kullanıcıları için ayrı bir güvenlik grubu oluşturmanızı öneririm. Böylece her kullanıcıya tek tek izin vermek yerine grubu yönetirsiniz.
# AD'de VPN kullanıcı grubu oluştur
New-ADGroup -Name "VPN-Users" `
-GroupScope Global `
-GroupCategory Security `
-Description "VPN erisimine yetkili kullanicilar" `
-Path "OU=Groups,DC=sirket,DC=local"
# Gruba kullanıcı ekle
Add-ADGroupMember -Identity "VPN-Users" -Members "kullanici1", "kullanici2"
# Dial-in iznini kullanıcı hesabından kontrol et
# Bu ayar olmadan kullanıcılar VPN'e bağlanamaz
Get-ADUser -Identity "kullanici1" -Properties msNPAllowDialin |
Select-Object SamAccountName, msNPAllowDialin
Dial-in iznini NPS politikası üzerinden yönetmek için kullanıcı hesaplarında “Control access through NPS Network Policy” seçeneğini etkinleştirin. Bunu toplu olarak yapmak için:
# Tüm VPN grubundaki kullanıcılar için dial-in iznini NPS'e devret
$vpnUsers = Get-ADGroupMember -Identity "VPN-Users" -Recursive |
Where-Object {$_.objectClass -eq "user"}
foreach ($user in $vpnUsers) {
Set-ADUser -Identity $user.SamAccountName `
-Replace @{msNPAllowDialin = $null}
Write-Host "$($user.SamAccountName) icin dial-in NPS politikasina devredildi."
}
Firewall Kurallarının Yapılandırılması
Sunucunun kendi güvenlik duvarında gerekli portları açmayı unutmayın. Bu adım sıklıkla gözden kaçar.
# IKEv2 için UDP 500 ve 4500
New-NetFirewallRule -DisplayName "VPN - IKEv2 UDP 500" `
-Direction Inbound `
-Protocol UDP `
-LocalPort 500 `
-Action Allow `
-Profile Any
New-NetFirewallRule -DisplayName "VPN - IKEv2 NAT-T UDP 4500" `
-Direction Inbound `
-Protocol UDP `
-LocalPort 4500 `
-Action Allow `
-Profile Any
# SSTP için TCP 443
New-NetFirewallRule -DisplayName "VPN - SSTP TCP 443" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 443 `
-Action Allow `
-Profile Any
# GRE Protocol (L2TP için)
New-NetFirewallRule -DisplayName "VPN - L2TP GRE" `
-Direction Inbound `
-Protocol 47 `
-Action Allow `
-Profile Any
# Mevcut VPN kurallarını doğrula
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "VPN*"} |
Select-Object DisplayName, Direction, Action, Enabled
Split Tunneling ve Routing Yapılandırması
VPN istemcilerinin tüm trafiği sunucu üzerinden mi göndereceğini (full tunnel) yoksa sadece şirket ağı trafiğini mi tünelleyeceğini (split tunnel) belirlemeniz gerekiyor.
Split tunneling için istemci tarafında yapılandırma gerekir, ancak sunucu tarafında da bazı ayarlar yapılabilir. Full tunneling için RRAS’ta şu ayarı etkinleştirin:
# VPN bağlantıları için varsayılan gateway'i sunucu üzerinden geçir
# Bu aslında istemci politikasıdır ama sunucu tarafında da kontrol edilebilir
Set-VpnServerIPsecConfiguration -CustomPolicy $false
# Mevcut RRAS routing tablosunu kontrol et
netsh routing ip show rtmroutes
# İç ağa olan yönlendirmeyi doğrula
Get-NetRoute | Where-Object {$_.DestinationPrefix -like "192.168*"}
VPN Bağlantı Durumu İzleme ve Sorun Giderme
Kurulum bitti, şimdi izleme kısmı. Aktif bağlantıları görmek için:
# Aktif VPN bağlantılarını listele
Get-RemoteAccessConnectionStatistics
# Detaylı kullanıcı bağlantı bilgisi
Get-RemoteAccessConnectionStatisticsSummary
# RRAS bağlantı günlüklerini kontrol et
Get-EventLog -LogName Application -Source "RemoteAccess" -Newest 50 |
Select-Object TimeGenerated, EntryType, Message |
Format-List
# Gerçek zamanlı bağlantı izleme
while ($true) {
Clear-Host
Write-Host "=== Aktif VPN Baglantilari ===" -ForegroundColor Green
Write-Host "$(Get-Date -Format 'HH:mm:ss')"
Get-RemoteAccessConnectionStatistics |
Select-Object UserName, IPAddress, ConnectionDuration, TunnelType
Start-Sleep -Seconds 5
}
Yaygın sorunlar ve çözümleri:
- Error 809 (IKEv2): NAT cihazı arkasındaysa UDP 4500 portunu da açın ve
HKLM:SYSTEMCurrentControlSetServicesPolicyAgentaltındaAssumeUDPEncapsulationContextOnSendRuledeğerini 2 olarak ayarlayın. - Error 691: Kullanıcı adı/şifre yanlış veya dial-in izni verilmemiş.
- Error 789: IKEv2 için sertifika uyumsuzluğu veya uygun politika bulunamadı.
- Error 720: PPP bağlantısı kurulamıyor, genellikle adres havuzu dolmuş ya da NPS politikası reddi.
# En sık karşılaşılan RRAS hatalarını filtrele
$events = Get-WinEvent -LogName "System" -MaxEvents 100 |
Where-Object {$_.ProviderName -eq "RemoteAccess" -and $_.Level -le 3}
$events | ForEach-Object {
[PSCustomObject]@{
Zaman = $_.TimeCreated
Seviye = $_.LevelDisplayName
Mesaj = $_.Message.Substring(0, [Math]::Min(100, $_.Message.Length))
}
} | Format-Table -AutoSize
İstemci Tarafında Bağlantı Testi
Kurulumu doğrulamak için PowerShell ile hızlı bir VPN bağlantı testi:
# Windows istemcide IKEv2 VPN bağlantısı oluştur
Add-VpnConnection -Name "Sirket VPN" `
-ServerAddress "vpn.sirketiniz.com" `
-TunnelType IKEv2 `
-AuthenticationMethod EAP `
-EncryptionLevel Required `
-RememberCredential `
-PassThru
# Bağlantıyı başlat
rasdial "Sirket VPN" kullanici_adi sifre
# Bağlantı durumunu kontrol et
Get-VpnConnection -Name "Sirket VPN"
# VPN üzerinden iç ağ erişimini test et
Test-NetConnection -ComputerName "192.168.1.10" -Port 445
# Bağlantıyı kapat
rasdial "Sirket VPN" /disconnect
Performans ve Güvenlik Önerileri
Kurulum sonrasında mutlaka yapmanız gereken bir kaç şey var. Bunları geçiştirmeyin, üretim ortamında pişman olursunuz.
Şifreleme politikasını güçlendirin. RRAS varsayılan olarak eski algoritmalara da izin veriyor:
# IKEv2 şifreleme politikasını güçlendir
Set-VpnServerIPsecConfiguration `
-EncryptionType MaximumEncryption
# Belirli cipher suite'leri zorla
netsh ras set conf enableikev2fragmentation=1
# RRAS maksimum bağlantı limitini kontrol et
netsh ras show conf
# Idle timeout ayarla (dakika cinsinden, 0 = kapalı)
Set-ItemProperty `
-Path "HKLM:SYSTEMCurrentControlSetServicesRemoteAccessParameters" `
-Name "SessionTimeout" -Value 480
Günlük kayıt (accounting) için NPS üzerinde SQL veya dosya tabanlı logging etkinleştirmenizi öneririm. Kimin ne zaman bağlandığını kayıt altına almak hem güvenlik hem de compliance için gerekli.
Ayrıca periyodik olarak şunu çalıştırın:
# RRAS servisi sağlık kontrolü scripti
$services = @("RemoteAccess", "RasMan", "IKEext", "PolicyAgent")
foreach ($svc in $services) {
$s = Get-Service -Name $svc -ErrorAction SilentlyContinue
if ($s) {
$durum = if ($s.Status -eq "Running") { "OK" } else { "KONTROL ET" }
Write-Host "[$durum] $svc : $($s.Status)"
}
}
# VPN portlarının dinlenip dinlenmediğini kontrol et
netstat -ano | Select-String ":500|:4500|:1723|:443" |
Where-Object {$_ -match "LISTENING"}
Sonuç
Remote Access Role ile VPN kurulumu, doğru adımlar izlendiğinde birkaç saat içinde tamamlanabilecek bir iş. Kritik noktalara tekrar değineyim: IKEv2 veya SSTP kullanın, PPTP’ye sakın dokunmayın. NPS entegrasyonu olmadan kullanıcı yönetimi kabusa dönüşür, mutlaka kurun. Sertifika yönetimini es geçmeyin, çünkü süresi dolan bir sertifika sabah 3’te ekibinizi uyandırır.
Üretim ortamında bu kurulumu yedekli yapmanızı, yani en az iki RRAS sunucusu ile NLB veya DNS round-robin kullanmanızı tavsiye ederim. Single point of failure olan bir VPN sunucusu, herkesin evden çalıştığı dönemlerde ciddi bir risk.
Son olarak, bu kurulumu tamamladıktan sonra mutlaka bir penetration test veya en azından bir güvenlik taraması yapın. Windows RRAS yanlış yapılandırıldığında saldırı yüzeyi oldukça geniş olabiliyor. Basit bir nmap taramasıyla bile hangi portların açık göründüğünü doğrulayın ve sadece ihtiyaç duyduğunuz protokolleri etkin tutun.
