DirectAccess ile Always On VPN Kurulumu ve Yapılandırması
Kurumsal ağ güvenliği söz konusu olduğunda, uzaktan erişim çözümleri her zaman tartışmanın merkezinde yer alır. Microsoft’un bu alanda sunduğu iki temel teknoloji olan DirectAccess ve Always On VPN’i aynı ortamda konuşlandırmak, özellikle geçiş dönemlerinde ya da hibrit senaryolarda sık karşılaşılan bir durum. Ben bu yazıda size teorik bilgi değil, gerçek bir kurumsal ortamda yaşadıklarımı aktaracağım. Yaklaşık 800 kullanıcılık bir şirkette her iki teknolojiyi birlikte yönetirken öğrendiklerimi paylaşacağım.
DirectAccess Nedir, Neden Hâlâ Konuşuyoruz?
DirectAccess, Windows 7 ve Server 2008 R2 döneminde hayatımıza girdi. Temel mantığı şu: kullanıcı VPN bağlantısı kurmak zorunda kalmadan, internete bağlandığı anda otomatik olarak şirket ağına tünel açıyor. Kullanıcının hiçbir şey yapmasına gerek yok. Bu özelliği kurumsal ortamlarda altın değerinde çünkü “VPN’e bağlanmayı unuttum” diyen kullanıcı hikayesi tarihe karışıyor.
Ancak DirectAccess’in ciddi kısıtları var:
- Yalnızca domain-joined Windows istemcilerini destekliyor
- IPv6 bağımlılığı var, ISATAP veya 6to4 gibi geçiş mekanizmaları gerektiriyor
- PKI altyapısı zorunlu
- Windows 10 1903 sonrasında Microsoft, DirectAccess’i “deprecated” olarak işaretledi
- macOS, iOS, Android istemci desteği yok
Always On VPN ise Microsoft’un DirectAccess’in mirasçısı olarak sunduğu, çok daha esnek ve modern bir çözüm. IKEv2, SSTP, L2TP gibi standart protokolleri destekliyor ve üçüncü parti istemcilerle de çalışabiliyor.
Ortam Gereksinimleri
Her iki teknolojiyi birlikte kurmadan önce altyapınızın hazır olması gerekiyor. Minimum gereksinimler şunlar:
DirectAccess için:
- Windows Server 2016 veya 2019 (2022 de destekleniyor)
- En az iki ağ adaptörü (iç ve dış ağ)
- Active Directory domain üyeliği
- PKI (Certificate Authority) altyapısı
- IPv6 veya IPv6 geçiş teknolojisi desteği
Always On VPN için:
- Windows Server 2016+ (NPS rolüyle birlikte)
- Remote Access rolü
- RADIUS sunucusu (genellikle NPS)
- PKI altyapısı
- Windows 10 1607+ istemciler
DirectAccess Kurulum Adımları
Remote Access Rolünün Kurulumu
Sunucuya Remote Access rolünü kurmak için Server Manager’ı kullanabilirsiniz ama ben PowerShell tercih ediyorum. Daha hızlı ve tekrarlanabilir:
Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-WindowsFeature -Name DirectAccess-VPN,Routing -IncludeAllSubFeature -IncludeManagementTools
Kurulum sonrasında sunucuyu yeniden başlatmanızı öneririm, özellikle üretim ortamında değil test ortamında bu adımı atlarsanız garip davranışlarla karşılaşabilirsiniz.
DirectAccess Yapılandırması
DirectAccess’i PowerShell ile yapılandırmak çok daha esnek. Aşağıdaki komut temel bir DirectAccess kurulumu için yeterli:
# DirectAccess yapılandırmasını başlat
Install-RemoteAccess -VpnType DirectAccess `
-DAInstallType FullInstall `
-InternetInterface "Ethernet 2" `
-InternalInterface "Ethernet" `
-ConnectToAddress "vpn.sirketim.com" `
-NlsUrl "https://nls.sirketim.local/nls/" `
-Force
Burada -ConnectToAddress parametresi kritik. Bu adresin public DNS’te çözümleniyor olması ve geçerli bir sertifikaya sahip olması şart. Sertifika konusunda bir kez acı çektim, production’da self-signed sertifika kullandım ve istemciler bağlanamadı. Mutlaka güvenilir bir CA’dan alınmış ya da internal CA’nız varsa onun tarafından imzalanmış sertifika kullanın.
GPO ile DirectAccess İstemci Ayarları
DirectAccess istemci ayarları Group Policy üzerinden dağıtılıyor. Ancak bu GPO’yu elle oluşturmak zorunda değilsiniz, DirectAccess kurulumu sırasında otomatik oluşturuluyor. Mevcut GPO’ya bağlı security group’u kontrol edin:
# DirectAccess istemci GPO bilgilerini görüntüle
Get-DAClient
# Çıktıda şunu arayın:
# GPOName: DirectAccess Client Settings
# SecurityGroupNameList: ContosoDirectAccess Clients
İstemcileri bu gruba eklemek yeterli, GPO otomatik uygulanıyor. Ama dikkat: bilgisayar hesabını gruba ekledikten sonra GPO’nun uygulanması için istemcinin yeniden başlatılması gerekiyor.
Always On VPN Kurulum Adımları
NPS (Network Policy Server) Yapılandırması
Always On VPN’in beyni NPS. Önce NPS rolünü kurun:
Install-WindowsFeature NPAS -IncludeManagementTools
Ardından NPS’i RADIUS sunucusu olarak yapılandırın ve VPN sunucunuzu RADIUS istemcisi olarak ekleyin:
# NPS'e RADIUS istemcisi olarak VPN sunucusu ekle
New-NpsRadiusClient `
-Address "10.0.1.50" `
-Name "VPN-Sunucu-01" `
-SharedSecret "Gizli_RADIUS_Sifre_2024!" `
-VendorName "Microsoft"
VPN Sunucusu Yapılandırması
VPN sunucusunda IKEv2 için gerekli ayarları yapılandırın:
# IKEv2 için idle timeout ve diğer ayarlar
Set-VpnAuthProtocol `
-UserAuthProtocolAccepted Certificate, EAP `
-PassThru
# VPN için IP adres havuzu tanımla
Set-VpnServerIPsecConfiguration `
-TunnelType IKEv2 `
-EncryptionMethod AES256 `
-IntegrityCheckMethod SHA256 `
-DHGroup Group14 `
-PfsGroup PFS2048 `
-CipherTransformConstants AES256 `
-AuthenticationTransformConstants SHA256128
İstemci Profili Oluşturma
Always On VPN’in en güçlü yanı istemci profilleri. Bu profilleri XML olarak oluşturup Intune veya SCCM üzerinden dağıtabilirsiniz. Aşağıda temel bir profil şablonu var:
# VPN profili XML oluştur ve WMI üzerinden uygula
$VPNProfileXML = @"
<VPNProfile>
<RememberCredentials>true</RememberCredentials>
<TrustedNetworkDetection>sirketim.local</TrustedNetworkDetection>
<DeviceTunnel>false</DeviceTunnel>
<AlwaysOn>true</AlwaysOn>
<DnsSuffix>sirketim.local</DnsSuffix>
<NativeProfile>
<Servers>vpn.sirketim.com</Servers>
<NativeProtocolType>IKEv2</NativeProtocolType>
<Authentication>
<UserMethod>Eap</UserMethod>
<Eap>
<Configuration><!-- EAP Config buraya --></Configuration>
</Eap>
</Authentication>
<RoutingPolicyType>SplitTunnel</RoutingPolicyType>
</NativeProfile>
<Route>
<Address>10.0.0.0</Address>
<PrefixSize>8</PrefixSize>
</Route>
</VPNProfile>
"@
# Profili uygula
$ProfileName = "Sirket_AlwaysOnVPN"
$ProfileXML = $VPNProfileXML -replace "<", "<" -replace ">", ">"
$nodeCSPUri = "./Vendor/MSFT/VPNv2"
$namespaceName = "rootcimv2mdmdmmap"
$className = "MDM_VPNv2_01"
$session = New-CimSession
$options = New-Object Microsoft.Management.Infrastructure.Options.CimOperationOptions
$options.SetCustomOption("PolicyPlatformContext_PrincipalContext_Type", "PolicyPlatform_UserContext", $false)
$deleteInstances = $session.EnumerateInstances($namespaceName, $className, $options)
foreach ($deleteInstance in $deleteInstances) {
$InstanceId = $deleteInstance.InstanceID
if ("$InstanceId" -eq "$ProfileName") {
$session.DeleteInstance($namespaceName, $deleteInstance, $options)
}
}
Device Tunnel Yapılandırması
Always On VPN’in DirectAccess’e en çok benzeyen özelliği Device Tunnel. Bu sayede kullanıcı oturum açmadan önce bile cihaz domain controller’a bağlanabiliyor. Bu özelliği etkinleştirmek için:
# Device Tunnel profili oluştur (yönetici yetkisi gerekli)
$DeviceTunnelXML = @"
<VPNProfile>
<DeviceTunnel>true</DeviceTunnel>
<AlwaysOn>true</AlwaysOn>
<TrustedNetworkDetection>sirketim.local</TrustedNetworkDetection>
<NativeProfile>
<Servers>vpn.sirketim.com</Servers>
<NativeProtocolType>IKEv2</NativeProtocolType>
<Authentication>
<MachineMethod>Certificate</MachineMethod>
</Authentication>
<RoutingPolicyType>SplitTunnel</RoutingPolicyType>
</NativeProfile>
<Route>
<Address>10.0.0.0</Address>
<PrefixSize>8</PrefixSize>
</Route>
<Route>
<Address>192.168.100.0</Address>
<PrefixSize>24</PrefixSize>
</Route>
</VPNProfile>
"@
Device Tunnel yalnızca bilgisayar sertifikasıyla çalışıyor ve yalnızca local system bağlamında çalışıyor. Bu nedenle kurulum mutlaka SYSTEM yetkisiyle yapılmalı.
Birlikte Çalışma Senaryosu
Gerçek dünya senaryosuna gelelim. Müşterim 400 Windows 10 cihazı olan bir şirketti. Eski altyapı tamamen DirectAccess üzerine kuruluydu. Always On VPN’e geçmek istiyorlardı ama bir gecede yapamazlardı. Hybrid bir yaklaşım benimsedik:
- Yeni alınan cihazlar: Always On VPN profili ile başlangıçtan itibaren yapılandırıldı
- Mevcut cihazlar: DirectAccess korundu, kademeli olarak Always On VPN’e geçirildi
- Sunucu tarafı: Aynı Remote Access sunucusu her iki teknolojiyi aynı anda çalıştırdı
Bu geçiş sürecinde en kritik nokta NLS (Network Location Server) çakışmasını önlemekti. DirectAccess, NLS’e erişebildiğinde iç ağda olduğunu anlıyor. Always On VPN ise TrustedNetworkDetection ile bunu yapıyor. Her ikisini aynı sunucuda çalıştırırken NLS endpoint’inin doğru yapılandırıldığından emin olun:
# Mevcut DirectAccess yapılandırmasını kontrol et
Get-DAServer
# NLS URL'ini doğrula
Get-RemoteAccess | Select-Object -ExpandProperty NlsUrl
# Her iki teknoloji için durum raporu al
Get-RemoteAccessHealth
Sertifika Yönetimi
İki teknoloji de sertifika kullanıyor ama farklı şekillerde. DirectAccess hem sunucu hem istemci sertifikası istiyor. Always On VPN IKEv2 kullanıyorsa makine sertifikası zorunlu, EAP-TLS kullanıyorsa kullanıcı sertifikası da gerekiyor.
Auto-enrollment yapılandırılmadıysa sertifikalar dağıtım akışını bozabilir. Bunu kontrol etmek için:
# Sertifika şablonlarını kontrol et
certutil -TCAInfo
# İstemcide sertifika durumunu görüntüle
Get-ChildItem -Path Cert:LocalMachineMy |
Where-Object {$_.EnhancedKeyUsageList -match "Client Authentication"} |
Select-Object Subject, NotAfter, Thumbprint
# Sertifika zincirini doğrula
$cert = Get-ChildItem -Path Cert:LocalMachineMy |
Where-Object {$_.Subject -like "*bilgisayar01*"}
Test-Certificate -Cert $cert -Policy SSL
Sertifika süresi dolduğunda bağlantı kopuyor ve kullanıcılar neden bağlanamadıklarını anlamıyorlar. Bu yüzden sertifika izleme sistemi kurmak şart. Basit bir PowerShell script ile süresi 30 gün içinde dolacak sertifikaları tespit edebilirsiniz:
# Süresi yakın sertifikaları tespit et
$UyariGunu = 30
$Bugun = Get-Date
Get-ChildItem -Path Cert:LocalMachineMy |
Where-Object {
$_.NotAfter -lt $Bugun.AddDays($UyariGunu) -and
$_.NotAfter -gt $Bugun
} |
Select-Object Subject, NotAfter, Thumbprint |
ForEach-Object {
$KalanGun = ($_.NotAfter - $Bugun).Days
Write-Host "UYARI: $($_.Subject) sertifikasi $KalanGun gun sonra dolacak!" -ForegroundColor Yellow
Write-Host "Thumbprint: $($_.Thumbprint)" -ForegroundColor Gray
}
Sorun Giderme Yaklaşımı
Her iki teknolojide de karşılaşılan yaygın sorunlar ve çözümleri:
DirectAccess bağlantı sorunları için:
# DirectAccess bağlantı durumunu kontrol et
Get-DAConnectionStatus
# IP-HTTPS tünelini kontrol et
netsh interface httpstunnel show interfaces
# DirectAccess event loglarını incele
Get-WinEvent -LogName "Microsoft-Windows-NCSI/Operational" -MaxEvents 50 |
Where-Object {$_.LevelDisplayName -eq "Error"} |
Select-Object TimeCreated, Message
Always On VPN sorunlarında:
# VPN bağlantı loglarını kontrol et
Get-VpnConnection -AllUserConnection
# Rasphone logunu incele
$LogPath = "$env:APPDATAMicrosoftNetworkConnectionsPbk"
Get-Content "$LogPathrasphone.pbk" | Select-String "Error"
# IKEv2 loglama etkinleştir
netsh ras set tracing * enabled
# Test yap
netsh ras set tracing * disabled
# Logları incele
Get-Content "C:Windowstracingauth.log" | Select-String -Pattern "Error|Fail" | Select-Object -Last 20
Monitoring ve Raporlama
Üretim ortamında bağlı kullanıcıları ve tünel durumlarını izlemek çok önemli. Basit ama etkili bir script:
# Anlık bağlantı istatistikleri
$RAStatus = Get-RemoteAccessConnectionStatistics
Write-Host "=== Uzak Erisim Ozeti ===" -ForegroundColor Cyan
Write-Host "DirectAccess Baglantilari: $($RAStatus.DirectAccessConnectionCount)"
Write-Host "VPN Baglantilari: $($RAStatus.VpnConnectionCount)"
Write-Host "Toplam Aktif Baglanti: $($RAStatus.TotalActiveConnections)"
# Detaylı kullanıcı listesi
Get-RemoteAccessConnectionStatistics |
Select-Object -ExpandProperty DirectAccessConnections |
Select-Object UserName, ClientIPAddress, ConnectionDuration, TunnelType |
Sort-Object ConnectionDuration -Descending |
Format-Table -AutoSize
Güvenlik Sertleştirme
Her iki teknoloji için de güvenlik sertleştirme yapılması gerekiyor. IKEv2 için zayıf şifreleme algoritmalarını devre dışı bırakmak önemli:
# IKEv2 güvenlik politikasını sertleştir
Set-VpnServerIPsecConfiguration `
-EncryptionMethod AES256 `
-IntegrityCheckMethod SHA384 `
-DHGroup Group14 `
-PfsGroup PFS2048 `
-SALifeTimeSeconds 28800 `
-MMSALifeTimeSeconds 86400 `
-PassThru
# Eski protokolleri devre dışı bırak
Set-SslCertificateBinding -Protocol TLS12
# PPTP ve L2TP'yi kapat, sadece IKEv2 ve SSTP bırak
netsh ras set conf confstate = enabled
Set-VpnAuthProtocol -TunnelType IKEv2,Sstp
Split Tunneling Değerlendirmesi
Split tunneling her ortamda uygun değil. Eğer tam tünel istiyorsanız, yani tüm trafiğin şirket üzerinden geçmesini istiyorsanız, RoutingPolicyType’ı ForceTunnel olarak ayarlayın. Ancak bu bant genişliğinizi ciddi şekilde etkiler. Bizim senaryomuzda şirket iç kaynaklarına giden trafik için split tunnel, DLP kritik veriler için ayrı bir profil oluşturduk.
Force tunnel senaryosunda bir sorunla karşılaştım: kullanıcılar Teams ve Office 365 için de tünelden geçince gecikme şikayetleri başladı. Microsoft’un önerdiği Office 365 optimizasyon rotalarını ekleyerek çözdük:
# Office 365 trafiğini tünelden hariç tut (split tunnel için)
Add-VpnConnectionRoute -ConnectionName "Sirket_AlwaysOnVPN" `
-DestinationPrefix "13.107.6.152/31" -PassThru
Add-VpnConnectionRoute -ConnectionName "Sirket_AlwaysOnVPN" `
-DestinationPrefix "13.107.18.10/31" -PassThru
# Microsoft'un güncel IP listesini kullanın
Sonuç
DirectAccess ve Always On VPN birbirinin rakibi değil, birbirini tamamlayan teknolojiler olarak düşünülebilir. Özellikle büyük kurumsal geçişlerde iki teknolojiyi paralel işletmek hem riski azaltıyor hem de geçiş sürecini kullanıcı tarafında neredeyse şeffaf hale getiriyor.
Pratikte öğrendiklerimin özeti şu: Always On VPN’in esnekliği ve modern protokol desteği çok değerli, ama DirectAccess’in “sıfır kullanıcı etkileşimi” mantığına yaklaşmak için Device Tunnel’ı mutlaka etkinleştirin. Sertifika yönetimini ihmal etmeyin, çünkü iki teknolojinin de en sık bağlantı kesen nedeni sertifika sorunları. Ve izleme scriptlerini production’a almadan önce test ortamında kapsamlı şekilde deneyin.
Microsoft’un yol haritası Always On VPN yönünde net. DirectAccess’i hâlâ çalıştırıyorsanız, geçiş planınızı şimdiden hazırlamaya başlayın. Ancak acele etmeyin. Planlı bir geçiş, aceleyle yapılan bir geçişten her zaman daha az baş ağrısı doğurur.
