RDP Bağlantı Sorunları: Hata Tespiti ve Çözüm Yöntemleri

Bir müşteriyi aradığınızda “RDP bağlanamıyorum, acil!” mesajıyla karşılaşmak, her sysadmin’in kabusu. Özellikle bu durum gece yarısı gerçekleştiğinde ve sunucuya fiziksel erişiminiz yoksa, sistematik düşünmeden hata tespit etmek neredeyse imkansız hale gelir. Bu yazıda RDP bağlantı sorunlarını nasıl katmanlı bir şekilde analiz ettiğimizi, hangi araçları kullandığımızı ve gerçek senaryolarda nasıl çözdüğümüzü adım adım inceleyeceğiz.

RDP Bağlantı Sorunlarını Anlamak

RDP (Remote Desktop Protocol) temelde TCP 3389 portundan çalışan bir protokoldür. Bağlantı başarısız olduğunda sorunun kaynağı genellikle şu katmanlardan birinde gizlidir:

  • Ağ katmanı: Firewall, routing, NAT sorunları
  • Servis katmanı: TermService’in çalışmaması, port çakışmaları
  • Kimlik doğrulama katmanı: NLA, sertifika, grup politikası sorunları
  • Kaynak katmanı: RAM dolması, session limitleri, lisans sorunları

Sorunu doğru katmanda aramak, çözüm süresini dramatik biçimde kısaltır. “Her şeyi dene ve bir şeyler olsun” yaklaşımı değil, sistematik hata ayıklama bizim yöntemimiz olacak.

Temel Tanı Adımları

1. Sunucuya Erişilebilirlik Testi

İlk adım her zaman sunucunun ağ üzerinden erişilebilir olup olmadığını test etmektir. Bunu istemci tarafından yapıyoruz.

# Basit ping testi
ping -n 10 192.168.1.100

# Port erişilebilirlik testi (PowerShell)
Test-NetConnection -ComputerName 192.168.1.100 -Port 3389

# Telnet alternatifi olarak PowerShell kullanımı
(New-Object System.Net.Sockets.TcpClient).Connect("192.168.1.100", 3389)

Test-NetConnection komutu size TCP bağlantısının başarılı olup olmadığını, gecikme süresini ve route bilgisini verir. Eğer TcpTestSucceeded: False görüyorsanız, sorun ağ veya firewall katmanındadır, RDP servisiyle henüz ilgisi yoktur.

2. Sunucu Tarafında RDP Servisini Kontrol Etme

Sunucuya başka bir yöntemle (konsol, iDRAC, VMware console) erişebildiğinizi varsayarak servis durumunu kontrol edin.

# TermService servisinin durumunu kontrol et
Get-Service -Name TermService | Select-Object Name, Status, StartType

# Servis başlatılamıyorsa bağımlılıklarını da kontrol et
Get-Service -Name TermService -DependentServices
Get-Service -Name SessionEnv | Select-Object Name, Status

# Servisi yeniden başlat
Restart-Service -Name TermService -Force

Gerçek bir senaryodan bahsedeyim: Bir müşteride TermService çalışıyor görünüyordu ama kimse bağlanamıyordu. Kontrol ettiğimizde SessionEnv servisinin (Remote Desktop Configuration) stopped durumunda olduğunu gördük. TermService bu servise bağımlıdır ve SessionEnv olmadan yeni oturumları kabul etmez.

3. RDP Portunu ve Dinleme Durumunu Kontrol Etme

# Hangi portların dinlendiğini kontrol et
netstat -ano | findstr :3389

# RDP portunu registry'den oku (default 3389)
Get-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name PortNumber

# Tüm aktif bağlantıları ve process ID ile listele
Get-NetTCPConnection -State Listen | Where-Object {$_.LocalPort -eq 3389}

Bazı sistemlerde güvenlik gerekçesiyle RDP portu değiştirilmiş olabilir. Registry’den gerçek port numarasını öğrendikten sonra istemci tarafında bağlantıyı bilgisayar_adi:port formatında deneyin.

Firewall Sorunlarını Gidermek

Windows Firewall, RDP sorunlarının en sık görülen nedenidir. Özellikle Windows Update sonrasında veya GPO değişikliklerinden sonra kurallar bozulabilir.

# RDP firewall kurallarını listele
Get-NetFirewallRule -DisplayName "*Remote Desktop*" | Select-Object DisplayName, Enabled, Direction, Action

# RDP kuralını etkinleştir
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

# Manuel kural ekleme (port değiştirildiyse)
New-NetFirewallRule -DisplayName "Custom RDP" -Direction Inbound -Protocol TCP -LocalPort 4489 -Action Allow -Profile Any

# Firewall durumunu profil bazında kontrol et
Get-NetFirewallProfile | Select-Object Name, Enabled

Önemli not: Eğer sunucu bir domain’deyse ve GPO üzerinden firewall yönetiliyorsa, manuel yaptığınız değişiklikler GPO refresh sonrasında kaybolabilir. Bu durumda değişikliği GPO seviyesinde yapmanız gerekir.

Windows Firewall’ı Bypass Ederek Test Etme

Acil durumda firewall’ı geçici olarak devre dışı bırakmak sorunun nereden kaynaklandığını anlamanıza yardımcı olur:

# Tüm profillerde firewall'ı kapat (SADECE TEST AMAÇLI, güvenli ortamlarda)
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

# Test sonrası mutlaka tekrar aç
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True

Bu adımdan sonra bağlantı başarılı olduysa sorun kesinlikle firewall kaynaklıdır ve kural bazında incelemeniz gerekir.

NLA (Network Level Authentication) Sorunları

NLA etkin olduğunda kimlik doğrulama, masaüstü oturumu açılmadan önce gerçekleşir. Bu güvenli bir özelliktir ama bazen sorun yaratır. Özellikle eski istemcilerden veya sertifika sorunları yaşandığında bağlantı NLA aşamasında düşer.

# NLA durumunu kontrol et
(Get-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp").UserAuthentication

# NLA'yı devre dışı bırak (test amaçlı veya eski istemci desteği için)
Set-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "UserAuthentication" -Value 0

# NLA'yı tekrar etkinleştir
Set-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "UserAuthentication" -Value 1

Gerçek dünya senaryosu: Bir şirkette yeni bir Windows Server 2022 kurulumu yapıldı. Kullanıcıların büyük çoğunluğu bağlanabiliyor, sadece iki kişi bağlanamıyor diye şikayet etti. İncelediğimizde bu iki kişinin Windows 7 çalıştırdığını ve güncellemelerin eksik olduğunu gördük. NLA için gerekli CredSSP güncellemesi yoktu. Çözüm ya istemci güncellemesi ya da geçici süreyle NLA’nın devre dışı bırakılması oldu.

Session Limitleri ve Lisans Sorunları

Windows Server’da varsayılan olarak 2 eşzamanlı RDP oturumuna izin verilir (RD Lisansı olmadan). Eğer bu limit doluysa yeni bağlantılar reddedilir.

# Aktif oturumları listele
query session /server:localhost

# Belirli bir oturumu zorla sonlandır (session ID ile)
logoff 3 /server:localhost

# Bağlantısı kesilmiş oturumları temizle
query session | Where-Object {$_ -match "Disc"} | ForEach-Object {
    $sessionId = ($_ -split 's+')[3]
    logoff $sessionId /server:localhost
}

Bir üretim ortamında karşılaştığım durum şuydu: Sabah 9’da herkes işe geldiğinde kimse RDP yapamıyordu. Nedenini incelediğimizde otomatik bir script’in gece boyunca bağlantıyı kesmeden oturumları açık bıraktığını gördük. 10 oturum birikmiş, limit dolmuştu. Session timeout politikasını düzgün ayarlamak ve script’i düzeltmek sorunu çözdü.

RDP Lisans Sorunlarını Tespit Etme

# Lisans modunu kontrol et
(Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerRCMGracePeriod").L$ICENSE_SERVERS

# RD Licensing servisini kontrol et
Get-Service -Name TermServLicensing | Select-Object Status

# Event Log'dan lisans hatalarını filtrele
Get-WinEvent -LogName System | Where-Object {$_.Id -eq 1128 -or $_.Id -eq 1129} | Select-Object TimeCreated, Message -First 10

Event Log Analizi

Olay günlükleri RDP sorunlarında altın madenidir. Doğru log’lara bakıyorsanız sorunun neredeyse her zaman izini bulabilirsiniz.

# RDP ile ilgili kritik event'leri çek
Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" |
    Where-Object {$_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning"} |
    Select-Object TimeCreated, Id, Message |
    Sort-Object TimeCreated -Descending |
    Select-Object -First 20

# Security log'dan başarısız oturum açma denemelerini bul
Get-WinEvent -LogName Security |
    Where-Object {$_.Id -eq 4625} |
    Select-Object TimeCreated, Message |
    Select-Object -First 10

# RemoteConnectionManager log'ları
Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" |
    Select-Object TimeCreated, Id, Message -First 15

Dikkat edilmesi gereken önemli Event ID’ler:

  • 4625: Başarısız oturum açma
  • 1058: Grup politikası uygulanamadı
  • 1129: RD Lisans sunucusuna ulaşılamıyor
  • 56: TermService başlatılamadı
  • 4096: RDP oturumu bağlantısı kesildi

Sertifika Sorunları

Windows Server RDP bağlantıları için SSL sertifikası kullanır. Sertifika süresi dolmuşsa veya bozulmuşsa bağlantı kurulmaz. Bu genellikle “Your remote desktop connection failed because the remote computer cannot be authenticated” hatasıyla kendini gösterir.

# RDP sertifikasını kontrol et
Get-ChildItem -Path "Cert:LocalMachineRemote Desktop" | Select-Object Subject, NotBefore, NotAfter, Thumbprint

# Sertifika parmak izini RDP ayarlarıyla karşılaştır
(Get-WmiObject -Class Win32_TSGeneralSetting -Namespace rootcimv2terminalservices).SSLCertificateSHA1Hash

# Yeni self-signed sertifika oluştur ve RDP'ye ata
$cert = New-SelfSignedCertificate -DnsName "SunucuAdi" -CertStoreLocation "cert:LocalMachineMy"
$wmiPath = (Get-WmiObject -Class Win32_TSGeneralSetting -Namespace rootcimv2terminalservices -Filter "TerminalName='RDP-tcp'").__path
Set-WmiInstance -Path $wmiPath -Argument @{SSLCertificateSHA1Hash=$cert.Thumbprint}

Grup Politikası Kaynaklı Sorunlar

Özellikle domain ortamlarında GPO ayarları RDP bağlantılarını etkileyebilir. En sık karşılaşılan senaryo, “Allow log on through Remote Desktop Services” politikasının yanlış yapılandırılmasıdır.

# Uygulanan GPO'ları listele ve RDP ile ilgilileri ara
gpresult /h C:Tempgporeport.html
# Tarayıcıda aç ve Remote Desktop bölümünü incele

# RDP'yi group policy üzerinden etkinleştirme durumunu kontrol et
Get-ItemProperty -Path "HKLM:SoftwarePoliciesMicrosoftWindows NTTerminal Services" -ErrorAction SilentlyContinue

# fDenyTSConnections değerini kontrol et (0 = RDP açık, 1 = RDP kapalı)
(Get-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal Server").fDenyTSConnections

# RDP'yi etkinleştir (registry üzerinden)
Set-ItemProperty -Path "HKLM:SystemCurrentControlSetControlTerminal Server" -Name "fDenyTSConnections" -Value 0

Pratikte yaşadığım bir durumda, hafta sonu yapılan GPO güncellemesi sonrasında Pazartesi sabahı tüm sunuculara RDP bağlantısı kesildi. “Allow connections only from computers running Remote Desktop with Network Level Authentication” politikası domain seviyesinde zorunlu hale getirilmişti ama bazı sunuculardaki sertifikalar bu konfigürasyonla uyumlu değildi. GPO’yu OU bazında istisnaya almak geçici çözüm oldu.

CredSSP Güncelleme Hatası

2018’de yayımlanan güvenlik güncellemesiyle birlikte CredSSP protokolünde önemli değişiklikler yapıldı. Güncelleme yapılmamış istemci veya sunucular birbirine bağlanamaz hale geldi. Hata mesajı genellikle “An authentication error has occurred. The function requested is not supported” şeklinde görünür.

# CredSSP policy'yi kontrol et
Get-ItemProperty -Path "HKLM:SoftwareMicrosoftWindowsCurrentVersionPoliciesSystemCredSSPParameters" -ErrorAction SilentlyContinue

# Geçici çözüm olarak encryption oracle policy ayarla
# SADECE geçici, güncelleme tamamlanana kadar
New-ItemProperty -Path "HKLM:SoftwareMicrosoftWindowsCurrentVersionPoliciesSystemCredSSPParameters" `
    -Name "AllowEncryptionOracle" -Value 2 -PropertyType DWORD -Force

# Kalıcı çözüm: Her iki tarafı da güncelle
# Önce sunucuyu güncelle, sonra istemciyi

Performans Kaynaklı RDP Sorunları

Bazen RDP bağlantısı teknik olarak kurulur ama yavaş, donuk veya düşen bir deneyim yaşanır. Bu durumda sunucu kaynaklarını incelemeniz gerekir.

# CPU, RAM ve disk kullanımını anlık kontrol et
Get-Counter -Counter "Processor(_Total)% Processor Time", "MemoryAvailable MBytes", "PhysicalDisk(_Total)% Disk Time" -SampleInterval 2 -MaxSamples 5

# RDP oturumuna özgü memory kullanımı
Get-Process -IncludeUserName | Sort-Object WorkingSet -Descending | Select-Object Name, UserName, CPU, WorkingSet -First 15

# Ağ bant genişliği kullanımını kontrol et
Get-NetAdapterStatistics | Select-Object Name, ReceivedBytes, SentBytes

RDP oturumu yavaşsa sunucu tarafında “Low Bandwidth” modunu etkinleştirmek görsel kaliteyi düşürerek performansı artırabilir. İstemci tarafında bağlantı ayarlarından “Connection speed” seçeneğini düşürmek de yardımcı olur.

Pratik Hata Ayıklama Senaryoları

Senaryo 1: “Connection timed out” Hatası

Bu hata genellikle ağ katmanı veya firewall sorunundan kaynaklanır.

  • Önce ping testi yapın, ICMP yanıtı alıyor musunuz?
  • Test-NetConnection ile TCP 3389’u test edin
  • Sunucu tarafında netstat ile 3389’un dinlendiğini doğrulayın
  • Windows Firewall kurallarını kontrol edin
  • Aralarında fiziksel/sanal firewall varsa oradan da kontrol edin

Senaryo 2: “Access denied” Hatası

Bu hata yetkilendirme sorunundan kaynaklanır.

  • Kullanıcının “Remote Desktop Users” grubunda olup olmadığını kontrol edin
  • Domain ortamında GPO ile kısıtlama olup olmadığına bakın
  • Yerel güvenlik politikasında “Allow log on through Remote Desktop Services” ayarını inceleyin
  • Kullanıcı hesabının kilitli veya pasif olmadığını doğrulayın
# Kullanıcıyı Remote Desktop Users grubuna ekle
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "kullanici_adi"

# Kullanıcı hesabı durumunu kontrol et
Get-LocalUser -Name "kullanici_adi" | Select-Object Name, Enabled, LastLogon, PasswordExpired

Senaryo 3: Bağlantı Kurulur Ama Hemen Düşer

Bu durum genellikle lisans sorunu, profil bozulması veya oturum limiti nedeniyle yaşanır.

# Geçici profille giriş dene (profil bozulmasını test etmek için)
# Önce eski profili yedekle
Copy-Item -Path "C:Userskullanici_adi" -Destination "C:Backupkullanici_profil_yedek" -Recurse

# Event log'dan hemen ardından gelen hataları incele
Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" |
    Where-Object {$_.TimeCreated -gt (Get-Date).AddMinutes(-5)} |
    Select-Object TimeCreated, Id, Message

Sonuç

RDP sorunlarını çözmek sistematik düşünmeyi gerektirir. Sorun ağda mı, serviste mi, kimlik doğrulamada mı yoksa kaynaklarda mı diye sormadan “servisi restart edelim, firewall’ı kapatalım” türünde kör testler yapmak hem zaman kaybettirir hem de bazen işleri daha kötüye götürür.

Özetleyecek olursak takip edilmesi gereken sıra şu şekilde olmalıdır: Önce ağ erişilebilirliğini doğrulayın, ardından servis ve port durumunu kontrol edin, firewall kurallarına bakın, kimlik doğrulama ayarlarını inceleyin ve son olarak kaynak kullanımını değerlendirin. Her adımda event log’lardan yardım alın, çünkü Windows size genellikle sorunun tam olarak ne olduğunu söyler, siz sadece doğru yere bakmanız gerekir.

Bu metodoloji birkaç ay içinde içgüdüsel hale gelir ve RDP sorunlarını çok daha hızlı çözebilir hale gelirsiniz. Unutmayın, iyi bir sysadmin sorunları hızlı çözen değil, neden olduğunu anlayan ve tekrar yaşanmaması için önlem alan kişidir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir