İnternete açık bir Windows sunucuda 3389 numaralı port, açıldığı ilk saatlerden itibaren parola deneyen botların hedefidir. Portu değiştirmek bu gürültünün büyük kısmını keser; ama yanlış sırayla yapılırsa sizi kendi sunucunuzdan kilitler. Bu rehberdeki komutları Windows Server 2022 çalışan test VDS'imizde sırayla uyguladık; aynı adımlar Windows Server 2019'da da geçerlidir.
Başlamadan önce: geri dönüş yolunuz olsun
RDP ayarlarını, RDP ile bağlıyken değiştiriyorsunuz. Bir adım ters giderse bağlantı kopar ve yeniden bağlanamazsınız. Bu yüzden:
- Sağlayıcınızın sunduğu konsol erişimini (web konsolu, VNC) önceden deneyin. Ağ ya da RDP çalışmasa bile makinenin ekranına oradan ulaşırsınız.
- Yeni port için güvenlik duvarı kuralını portu değiştirmeden önce açın.
- Komutları yönetici yetkili bir PowerShell penceresinde çalıştırın.
Önce mevcut durumu okuyun. Test sunucumuzda port varsayılan değerdeydi ve ağ düzeyinde kimlik doğrulama (NLA) açıktı:
PS> $y = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
PS> (Get-ItemProperty -Path $y).PortNumber
3389
PS> (Get-ItemProperty -Path $y).UserAuthentication
1
UserAuthentication değerinin 1 olması NLA'nın açık olduğunu gösterir: kullanıcı, oturum ekranı açılmadan önce kimliğini doğrular. 0 görüyorsanız portu değiştirmeden önce bunu açın (Sistem Özellikleri → Uzak → "Yalnızca Ağ Düzeyinde Kimlik Doğrulamalı…" seçeneği).
Port değişikliği neyi çözer, neyi çözmez? İnternetin tamamını birkaç dakikada tarayabilen araçlar, varsayılan portlarda dinleyen servisleri sürekli listeler ve bu listelere otomatik parola denemesi yapılır. Standart dışı bir port bu toplu taramaların çoğunun dışında kalır; günlükleriniz temizlenir ve gerçek bir saldırı girişimi gürültü arasında kaybolmaz. Ancak tüm portları tarayan biri RDP'yi yine bulur. Bu yüzden rehberin sonraki adımları, yani IP kısıtı ve hesap kilitleme, portu değiştirmekten daha önemlidir.
1. Yeni port için güvenlik duvarı kuralı ekleyin
Örnekte 49833 numaralı portu kullandık; kendi seçtiğiniz portla değiştirin. RDP, TCP'nin yanında UDP de kullanabildiği için iki kural ekliyoruz.
New-NetFirewallRule -DisplayName "RDP 49833 TCP" -Direction Inbound -Protocol TCP -LocalPort 49833 -Action Allow
New-NetFirewallRule -DisplayName "RDP 49833 UDP" -Direction Inbound -Protocol UDP -LocalPort 49833 -Action Allow
Sunucunuz bir sağlayıcı güvenlik duvarının ya da ağ geçidinin arkasındaysa yeni portu orada da açtırın.
2. Kayıt defterinde portu değiştirin
Set-ItemProperty -Path $y -Name PortNumber -Value 49833
(Get-ItemProperty -Path $y).PortNumber
49833
Grafik arayüzü tercih ediyorsanız aynı değer regedit ile HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp altındaki PortNumber (DWORD) anahtarıdır; düzenlerken "Ondalık" seçeneğini işaretleyin.
3. Uzak Masaüstü servisini yeniden başlatın
Değişiklik servis yeniden başlayınca etkinleşir. Bu komut mevcut RDP oturumunuzu düşürür; oturumdaki uygulamalar kapanmaz, yeni portla bağlandığınızda kaldığınız yerden devam edersiniz.
Restart-Service -Name TermService -Force
Get-NetTCPConnection -State Listen -LocalPort 49833 | Select-Object LocalAddress,LocalPort,State
LocalAddress LocalPort State
------------ --------- -----
:: 49833 Listen
0.0.0.0 49833 Listen
Kendi bilgisayarınızda Uzak Masaüstü Bağlantısı'nı açın ve adresi sunucu-ip:49833 biçiminde yazın. Test sunucumuzu dışarıdan denediğimizde yeni port RDP el sıkışmasına cevap verdi, 3389 ise artık kapalıydı.
4. Eski kuralları kapatın
Yeni portla bağlandığınızı doğruladıktan sonra Windows'un hazır "Remote Desktop" kurallarını devre dışı bırakın. Silmek yerine kapatmak, gerektiğinde tek komutla geri açmanızı sağlar.
Disable-NetFirewallRule -DisplayGroup "Remote Desktop"
Get-NetFirewallRule -DisplayGroup "Remote Desktop" | Select-Object DisplayName,Enabled
DisplayName Enabled
----------- -------
Remote Desktop - Shadow (TCP-In) False
Remote Desktop - User Mode (TCP-In) False
Remote Desktop - User Mode (UDP-In) False
Arayüz dilinde Türkçe kurulmuş bir sunucuda grup adı "Uzak Masaüstü" olabilir; Get-NetFirewallRule | Where-Object DisplayGroup -like "*Masaüstü*" ile bulabilirsiniz.
5. Erişimi IP adresinizle sınırlayın
Sabit bir ofis IP'niz varsa port değiştirmekten çok daha güçlü olan adım budur: kural yalnız o adresten gelen bağlantıyı kabul eder.
Set-NetFirewallRule -DisplayName "RDP 49833 TCP","RDP 49833 UDP" -RemoteAddress 203.0.113.50
(Get-NetFirewallRule -DisplayName "RDP 49833 TCP" | Get-NetFirewallAddressFilter).RemoteAddress
203.0.113.50
Testte kuralı bizim olmayan bir adrese kısıtladığımızda dışarıdan bağlantı kurulamadı; kendi IP'mizi yazdığımızda bağlantı yeniden açıldı. Birden çok adres için virgülle ayırın (-RemoteAddress 203.0.113.50,198.51.100.0/24). IP'niz değişkense bu adımın yerine bir VPN kurmayı düşünün; RDP'yi yalnız VPN arayüzüne açmak, internete açık bir RDP'den her zaman daha güvenlidir.
6. Hesap kilitleme ilkesini açın
Test sunucumuzun şablonunda hesap kilitleme kapalıydı (Lockout threshold: Never); yani bir bot sınırsız parola deneyebilirdi. Beş hatalı denemede hesabı 30 dakika kilitlemek için:
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
net accounts | Select-String "Lockout"
Lockout threshold: 5
Lockout duration (minutes): 30
Lockout observation window (minutes): 30
Etki alanı denetleyicisi (domain controller) olan sunucularda bu ilke Grup İlkesi'nden yönetilir; yerel komut etki alanı hesaplarını kapsamaz.
7. Uzak masaüstü için ayrı kullanıcı
Yönetici hesabını uzak masaüstü için kullanmamak, saldırganın en çok denediği kullanıcı adını işe yaramaz kılar. Yeni bir yerel kullanıcı açıp yalnız "Remote Desktop Users" grubuna eklemek RDP ile bağlanmasına yeter; yönetici yetkisi gerektiğinde oturum içinden yükseltirsiniz:
$p = Read-Host -AsSecureString "Parola"
New-LocalUser -Name "uzakkullanici" -Password $p -PasswordNeverExpires
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "uzakkullanici"
Get-LocalGroupMember -Group "Remote Desktop Users"
Name PrincipalSource
---- ---------------
K84-WIN\uzakkullanici Local
Türkçe arayüzlü sunucularda grubun adı "Uzak Masaüstü Kullanıcıları" olabilir; Get-LocalGroup ile doğru adı görürsünüz.
Bağlanamıyorsanız: sırayla kontrol
- Port açık mı? Kendi bilgisayarınızdan PowerShell'de
Test-NetConnection sunucu-ip -Port 49833. Test sunucumuzda çıktıTcpTestSucceeded : Trueoldu;Falseise sorun ağda ya da güvenlik duvarındadır. - Servis yeni portu dinliyor mu? Sunucuda (konsoldan)
Get-NetTCPConnection -State Listen -LocalPort 49833. - IP kısıtı: Ev ya da ofis IP'niz değiştiyse kural sizi de dışarıda bırakır. Güncel adresinizi kurala ekleyin.
- Hesap kilitlendi mi? Çok sayıda hatalı denemeden sonra kilit süresi dolana kadar doğru parola da reddedilir.
- NLA hatası: "Kimlik doğrulama hatası" ya da "CredSSP" uyarısı genellikle istemci ile sunucudan birinin güncel olmamasından kaynaklanır; ikisini de güncelleyin, NLA'yı kapatmayın.
Bu adımdan sonra kendi bilgisayarınızdan yeni portla yeniden bağlanıp oturumun açıldığını mutlaka deneyin; ilke yanlış yazıldıysa en iyi fark etme zamanı budur.
Port değişikliğinin yetmediği yerler
- Yönetici hesabının adı: Saldırıların çoğu
Administratoradıyla gelir. Günlük iş için ayrı bir kullanıcı açın, onu "Remote Desktop Users" grubuna ekleyin. - Güncellemeler: RDP'de yıllar içinde ciddi uzaktan kod çalıştırma açıkları çıktı. Port değişikliği güncellemenin yerini tutmaz.
- Başarısız oturum denemelerini izleyin: Güvenlik günlüğündeki 4625 olay kimliği başarısız oturum açma denemesidir.
Get-WinEvent -FilterHashtable @{LogName='Security';Id=4625} -MaxEvents 20son denemeleri listeler. - Uzun ve benzersiz parola: Sözlük saldırısına karşı en ucuz önlem.
Linux sunucular için aynı mantığın SSH karşılığını Linux sunucu güvenliği: ilk gün yazısında anlattık.
Saldırı yoğunluğunu ölçmek
Port değişikliğinin işe yarayıp yaramadığını tahmin etmek yerine ölçün. Aşağıdaki betik, son 24 saatteki başarısız oturum denemelerini (olay 4625) sayar ve en çok deneme yapan IP adreslerini listeler. Değişiklikten önce ve bir hafta sonra çalıştırıp karşılaştırın:
$olaylar = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} -ErrorAction SilentlyContinue
"Son 24 saatte başarısız oturum: " + @($olaylar).Count
$olaylar | ForEach-Object { ([xml]$_.ToXml()).Event.EventData.Data | Where-Object Name -eq 'IpAddress' | Select-Object -ExpandProperty '#text' } |
Group-Object | Sort-Object Count -Descending | Select-Object -First 10 Count, Name
Listede tekrar eden IP adresleri görüyorsanız IP kısıtını (5. adım) uygulamanın zamanı gelmiştir. Tek tek adres engellemek ise kalıcı çözüm değildir; saldırı trafiği sürekli adres değiştirir.
En güvenlisi: RDP'yi internete hiç açmamak
Port değiştirmek ve IP kısıtlamak, RDP'yi internete açık tutmanın riskini azaltır. Riski tamamen kaldırmanın yolu RDP'yi yalnız özel bir ağdan erişilebilir yapmaktır: sunucuya bir VPN (örneğin WireGuard) kurar, RDP kuralını yalnız VPN arayüzünün adres bloğuna açarsınız. Böylece internetten görünen tek port VPN'in portu olur ve o port, geçerli anahtarı olmayan hiçbir pakete cevap vermez. Birden çok kullanıcının bağlandığı kurumsal kurulumlarda Uzak Masaüstü Ağ Geçidi (RD Gateway) de bir seçenektir; bağlantıyı HTTPS üzerinden taşır ve çok faktörlü doğrulamayla birleştirilebilir.
Geri almak isterseniz
Set-ItemProperty -Path $y -Name PortNumber -Value 3389
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
Restart-Service -Name TermService -Force
Geri alırken de sıra aynıdır: önce kural, sonra port. Bağlantınız koparsa konsoldan devam edin.
Sık sorulan sorular
RDP portunu değiştirmek güvenlik sağlar mı?
Kısmen. 3389'u sürekli tarayan otomatik botların büyük kısmından kurtarır ve günlükleri temizler; ama port taraması yapan biri yeni portu bulur. Gerçek güvenlik; güçlü parola, hesap kilitleme, ağ düzeyinde kimlik doğrulama (NLA), güncel sistem ve mümkünse IP kısıtı ya da VPN ile gelir. Port değişikliği bunların yerine değil, yanına yapılır.
Port değiştirdikten sonra nasıl bağlanırım?
Uzak Masaüstü Bağlantısı (mstsc) penceresinde adresi sunucu-ip:yeni-port biçiminde yazın, örneğin 203.0.113.40:49833. Kayıtlı bir .rdp dosyası kullanıyorsanız içindeki adresi de güncelleyin.
Portu değiştirdim, bağlanamıyorum. Ne yapmalıyım?
En sık sebep güvenlik duvarında yeni portun açılmamış olmasıdır. Sağlayıcınızın sunduğu konsol (VNC ya da web konsolu) üzerinden oturum açıp yeni port için gelen kuralını ekleyin ya da kayıt defterindeki PortNumber değerini 3389'a geri alıp servisi yeniden başlatın. Bu yüzden değişikliğe konsol erişiminiz olduğundan emin olarak başlayın.
Hangi port numarasını seçmeliyim?
1024 ile 65535 arasında, sunucuda başka bir servisin kullanmadığı bir port seçin. 49152-65535 aralığı dinamik portlar için ayrılmıştır ve başka bir uygulamanın standart portuyla çakışma olasılığı düşüktür; ancak Windows bu aralıktan giden bağlantılar için de port kullanır. Seçtiğiniz portun boşta olduğunu Get-NetTCPConnection -LocalPort <port> ile kontrol edin.
RDP portunu değiştirmek uygulamalarımı etkiler mi?
Sunucuda çalışan uygulamaları etkilemez; yalnız uzak masaüstüyle bağlanan istemcilerin adresi değişir. Ancak RDP'ye bağlanan başka araçlar da varsa (uzaktan yönetim yazılımları, kayıtlı .rdp dosyaları, izleme sistemlerinin port kontrolü) onların ayarlarını da yeni portla güncelleyin.
Bu adımlar Windows Server 2019'da da geçerli mi?
Evet. Kayıt defteri yolu, TermService servisi, güvenlik duvarı komutları ve net accounts ilkesi Windows Server 2019, 2022 ve 2025'te aynıdır. Rehberi Windows Server 2022 üzerinde denedik.
- #rdp
- #windows server
- #uzak masaüstü
- #güvenlik duvarı
Windows Server mı gerekiyor? VDS paketlerimizde Windows Server 2019 ve 2022 işletim sistemi seçeneği var; yönetici erişimi ve rDNS yönetimi her pakette.
VDS paketlerine bakın