Windows RDP Brute-Force Saldırı Engelleme ve Otomatik IP Banlama Rehberi (Fail2Ban)

Hızlı Çözüm & Pratik Özet

Bu sorunu en kısa yoldan çözmek için temel adımlar

Windows'ta RDP brute-force saldırılarını engellemek ve saldıran IP'leri otomatik banlamak için: 1) 'C:\RDPBlocker' klasörü açıp içine Event ID 4625 loglarını tarayan 'Block-BruteForce.ps1' PowerShell betiğini yerleştirin. 2) Windows Görev Zamanlayıcı (Task Scheduler) ile betiği 'NT AUTHORITY\SYSTEM' yetkisinde 7/24 arka plan görevi olarak başlatın. 3) Banlanan IP'leri listelemek için 'Import-Csv "C:\RDPBlocker\BlockedIPs_Log.csv" | Out-GridView -Title "Banlı IP Listesi"' komutunu veya 'Get-NetFirewallRule' komutunu çalıştırın.

Sistem Gereksinimleri & Geçerlilik:
Windows Server (2025, 2022, 2019, 2016, 2012 R2) Windows 11 / Windows 10 Pro veya Enterprise Yönetici (Administrator) PowerShell Yetkisi Windows Güvenlik Olay Günlükleri (Security Event Log 4625) Windows Defender Güvenlik Duvarı & Görev Zamanlayıcı (Task Scheduler)

Bu Rehberdeki Başlıklar (İçindekiler)

Windows'ta RDP Kaba Kuvvet (Brute-Force) Saldırıları Nedir?

İnternete açık Windows Server (2025, 2022, 2019, 2016) veya Windows 10/11 sistemleri, 3389 Uzak Masaüstü (RDP) portu üzerinden sürekli olarak otomatik botnet orduları tarafından kaba kuvvet (Brute-Force) şifre deneme saldırılarına maruz kalır. Bu saldırılar sistem kaynaklarını tüketir, log dosyalarını şişirir ve sunucunun şifresinin kırılma riskini artırır.

Linux dünyasındaki popüler Fail2ban mantığını hiçbir üçüncü taraf ücretli yazılıma ihtiyaç duymadan, Windows'un yerleşik PowerShell, Windows Defender Güvenlik Duvarı ve Olay Görüntüleyicisi (Event Viewer) bileşenleriyle %100 yerel ve otomatik çalışan bir savunma kalkanına dönüştürebilirsiniz.

Sistemin Çalışma Mantığı: Arka planda 7/24 çalışan PowerShell motoru, her 5 saniyede bir Windows Güvenlik Günlüklerini (Security Log - Event ID 4625) tarar. 2 veya daha fazla hatalı şifre denemesi yapan saldırgan IP adresini anında yakalar, IPv6/IPv4 formatını temizler, Windows Güvenlik Duvarı'ndaki AutoBlock-RDP-Global kuralına ekleyerek sunucuya erişimini tamamen keser ve 24 saat sonra banı otomatik kaldırır.

Adım 1: RDPBlocker Klasörünü Hazırlama

  1. 1
    Sunucunuzda Yerel Disk (C:) sürücüsünü açın.
  2. 2
    İçinde RDPBlocker adında yeni bir klasör oluşturun (Klasör yolu tam olarak C:\RDPBlocker olmalıdır).

Adım 2: Gelişmiş PowerShell Banlama Betiğini Oluşturma

Başlat menüsünden Not Defteri (Notepad) uygulamasını açın ve aşağıdaki kodun tamamını yapıştırın:

PowerShell (Block-BruteForce.ps1)
# --- YAPILANDIRMA ---
$Threshold = 2                    # 2 Hatalı denemede ANINDA BAN
$BanDurationMinutes = 1440        # 24 Saat Ban
$ScanIntervalSeconds = 5          # Her 5 Saniyede Bir Kontrol Et
$MainRuleName = "AutoBlock-RDP-Global"
$LogFile = "C:\RDPBlocker\BlockedIPs_Log.csv"

if (-not (Test-Path $LogFile)) {
    "IP,BlockedAt" | Out-File -FilePath $LogFile -Encoding utf8
}

$Rule = Get-NetFirewallRule -DisplayName $MainRuleName -ErrorAction SilentlyContinue
if (-not $Rule) {
    New-NetFirewallRule -DisplayName $MainRuleName -Direction Inbound -Action Block -Protocol Any -Profile Any
}

while ($true) {
    try {
        # 1. 24 Saati Dolan IP'leri Temizle
        $BlockedLog = Import-Csv -Path $LogFile -ErrorAction SilentlyContinue
        $ValidEntries = @()

        if ($BlockedLog) {
            foreach ($Entry in $BlockedLog) {
                if ($Entry.BlockedAt) {
                    $BlockedDate = [DateTime]::Parse($Entry.BlockedAt)
                    if ((Get-Date) -lt $BlockedDate.AddMinutes($BanDurationMinutes)) {
                        $ValidEntries += $Entry
                    }
                }
            }
        }

        # 2. Son 3 Dakikadaki Tüm Hatalı Girişleri Tara (4625)
        $Since = (Get-Date).AddMinutes(-3)
        $Events = Get-WinEvent -FilterHashtable @{ LogName = 'Security'; Id = 4625; StartTime = $Since } -ErrorAction SilentlyContinue

        $BadIPs = @()
        if ($Events) {
            foreach ($Event in $Events) {
                $Xml = [xml]$Event.ToXml()
                $IP = ($Xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
                if ($IP) {
                    # IPv6 formatını düzelt (::ffff:1.2.3.4 -> 1.2.3.4)
                    $CleanIP = $IP -replace '::ffff:', ''
                    if ($CleanIP -and $CleanIP -ne '-' -and $CleanIP -ne '127.0.0.1' -and $CleanIP -ne '::1' -and $CleanIP -ne '0.0.0.0') {
                        $BadIPs += $CleanIP
                    }
                }
            }
        }

        # 3. Eşiği Aşan Yeni IP'leri Listeye Ekle
        if ($BadIPs) {
            $Grouped = $BadIPs | Group-Object | Where-Object { $_.Count -ge $Threshold }
            foreach ($Item in $Grouped) {
                $TargetIP = $Item.Name
                if (-not ($ValidEntries.IP -contains $TargetIP)) {
                    $ValidEntries += [PSCustomObject]@{
                        IP        = $TargetIP
                        BlockedAt = (Get-Date).ToString("o")
                    }
                }
            }
        }

        # 4. CSV ve Güvenlik Duvarını Güncelle
        if ($ValidEntries) {
            $ValidEntries | Export-Csv -Path $LogFile -NoTypeInformation -Encoding utf8
            $ActiveIPs = $ValidEntries.IP | Select-Object -Unique
            Set-NetFirewallRule -DisplayName $MainRuleName -RemoteAddress $ActiveIPs
        }
    }
    catch {
        # Hata koruması
    }

    Start-Sleep -Seconds $ScanIntervalSeconds
}

Not Defterinde Dosya > Farklı Kaydet yolunu izleyin:
Kayıt Yeri: C:\RDPBlocker
Dosya Adı: Block-BruteForce.ps1
Kayıt Türü: Tüm Dosyalar (*.*)
şeklinde kaydedip pencereyi kapatın.

Adım 3: Görev Zamanlayıcı (Task Scheduler) ile 7/24 Arka Plan Servisi Yapma

Betiğin sunucu açıldığında otomatik başlaması ve arka planda kullanıcı oturumundan bağımsız olarak kesintisiz çalışması için PowerShell'i Yönetici Olarak açın ve şu komut bloğunu çalıştırın:

PowerShell (Zamanlanmış Görev Kurulumu)
# Eski görevi temizle (varsa)
Unregister-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" -Confirm:$false -ErrorAction SilentlyContinue

# Gizli ve SYSTEM yetkisinde çalışan eylemi tanımla
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NonInteractive -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\RDPBlocker\Block-BruteForce.ps1"'
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartCount 99 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit (New-TimeSpan -Days 365)

# Görevi kaydet ve hemen başlat
Register-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" -Action $action -Trigger $trigger -Settings $settings -User "NT AUTHORITY\SYSTEM" -RunLevel Highest

Start-ScheduledTask -TaskName "RDP-Continuous-AutoBlock"
Get-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" | Select-Object TaskName, State
Doğrulama: Çıktıda State: Running yazısını görüyorsanız sistem aktifleşmiştir ve sunucunuz yeniden başlasa bile otomatik olarak arka planda çalışacaktır.

Banlı IP'leri Kontrol Etme & Listeleme Yöntemleri

Sistemin hangi IP'leri yakalayıp banladığını kontrol etmek için aşağıdaki yöntemlerden birini kullanabilirsiniz:

1. Arayüzlü Grafik Tablo Şeklinde Açmak (En Pratik Yol)

PowerShell'de şu komutu çalıştırdığınızda önünüze üst kısmında canlı arama çubuğu olan, tarihe göre sıralanabilen şık bir tablo açılır:

PowerShell
Import-Csv "C:\RDPBlocker\BlockedIPs_Log.csv" | Out-GridView -Title "Banlı IP Listesi"

2. Konsol Üzerinden Hızlı Liste Almak

PowerShell
Import-Csv "C:\RDPBlocker\BlockedIPs_Log.csv" | Format-Table -AutoSize

3. Güvenlik Duvarında Engellenen IP'leri Canlı Doğrulama

Güvenlik Duvarı kuralının içine işlenen IP adreslerini doğrudan çekmek için:

PowerShell
(Get-NetFirewallRule -DisplayName "AutoBlock-RDP-Global" | Get-NetFirewallAddressFilter).RemoteAddress

Betiği Güncelledikten Sonra Görevi Yeniden Başlatma

Betiğin kodunu değiştirdiğinizde PowerShell'de Restart-ScheduledTask komutu bulunmadığı için şu durdur-başlat komutunu kullanmalısınız:

PowerShell
Stop-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" -ErrorAction SilentlyContinue
Start-ScheduledTask -TaskName "RDP-Continuous-AutoBlock"
Get-ScheduledTask -TaskName "RDP-Continuous-AutoBlock" | Select-Object TaskName, State

Saldırıları %99 Oranında Tamamen Kesmek İçin Ek Tavsiye

Otomatik IP banlama sistemi gelen her saldırganı etkisiz hale getirir; ancak botnetler milyonlarca IP'ye sahip olduğu için Event Viewer'da log görmeye devam edebilirsiniz. Saldırıları neredeyse sıfırlamak için en kesin çözüm varsayılan 3389 RDP portunu değiştirmektir:

PowerShell (Örnek: Port 54321)
# Portu Kayıt Defterinde Değiştir (Örnek: 54321)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "PortNumber" -Value 54321

# Yeni Port İçin Güvenlik Duvarı İzni Aç
New-NetFirewallRule -DisplayName "RDP-CustomPort-54321" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 54321

# Uzak Masaüstü Servisini Yeniden Başlat
Restart-Service -Name "TermService" -Force

Adım Adım Uygulama Rehberi

1

C:\RDPBlocker Klasörünü Oluşturun

Sunucunuzun C: sürücüsünde 'RDPBlocker' adında yeni bir klasör oluşturun.

2

Otomatik Banlama Betiğini (Block-BruteForce.ps1) Kaydedin

Olay Günlüğü 4625 kayıtlarını tarayan ve güvenlik duvarında 'AutoBlock-RDP-Global' kuralını güncelleyen PowerShell kodunu C:\RDPBlocker\Block-BruteForce.ps1 olarak kaydedin.

3

Görev Zamanlayıcı (Task Scheduler) ile 7/24 Servis Olarak Başlatın

Betiği sistem açılışında 'NT AUTHORITY\SYSTEM' yetkisiyle otomatik başlayacak şekilde zamanlanmış görev olarak kaydedip başlatın.

4

Banlı IP Listesini ve Güvenlik Duvarı Durumunu Kontrol Edin

Out-GridView veya Get-NetFirewallRule komutlarıyla anlık olarak hangi IP'lerin engellendiğini doğrulayın.

Sıkça Sorulan Sorular (SSS)

PowerShell'de 'Import-Csv "C:\RDPBlocker\BlockedIPs_Log.csv" | Out-GridView -Title "Banlı IP Listesi"' komutunu çalıştırarak arama ve sıralama yapılabilen grafik tabloyu açabilir veya '(Get-NetFirewallRule -DisplayName "AutoBlock-RDP-Global" | Get-NetFirewallAddressFilter).RemoteAddress' komutuyla doğrudan Güvenlik Duvarındaki engelli IP'leri görebilirsiniz.