Как настроить RDP сервер, изменить порт RDP по умолчанию 3389, исправить ошибки подключения, внутреннюю ошибку и ошибку подлинности. Готовый скрипт для автоматической блокировки IP через брандмауэр.
PowerShell для защиты RDP: обнаружение брутфорса и автоматическая блокировка IP через брандмауэр
Протокол удаленного рабочего стола (RDP) — один из самых удобных инструментов для удаленного подключения к серверам и компьютерам. Но именно RDP порт 3389 является одной из главных целей для злоумышленников. В этой статье мы разберем, как настроить RDP безопасно, как исправить типичные ошибки RDP, и главное — напишем скрипт PowerShell, который автоматически блокирует IP-адреса при попытках брутфорса RDP.
Краткий чек-лист: что нужно знать о безопасности RDP
- Какой порт у RDP? — по умолчанию 3389. Его рекомендуется изменить для повышения безопасности.
- Как подключиться по RDP? — через штатный клиент mstsc или сторонние RDP клиенты.
- Какие бывают ошибки RDP? — внутренняя ошибка RDP, ошибка подлинности RDP, черный экран, сбои подключения.
- Как защитить RDP от брутфорса? — сменить порт, использовать сетевые уровни аутентификации (NLA), настроить брандмауэр, автоматизировать блокировку IP через PowerShell.
- Что такое RDP wrapper? — утилита, позволяющая включать RDP на Windows Home, где эта функция отсутствует.
Введение: почему RDP — это главная цель для атак
Протокол удалённого рабочего стола (RDP) — это удобнейший инструмент для администрирования серверов и компьютеров. Особенно если вы работаете из дома или управляете несколькими машинами. Но у этой медали есть обратная сторона: RDP порт (по умолчанию 3389) — одна из главных целей для злоумышленников.
Каждый день миллионы ботов сканируют интернет в поисках открытых RDP портов. Как только находится открытый порт, начинается подбор паролей — брутфорс RDP. Слабые пароли ломаются за минуты, после чего сервер становится частью ботнета, майнит криптовалюту или используется для атак на другие системы.
В этой статье мы:
- Разберем, как настроить RDP безопасно
- Научимся находить RDP ошибки и исправлять их
- Напишем скрипт на PowerShell, который:
- Анализирует журналы событий Windows
- Находит неудачные попытки подключения по RDP
- Подсчитывает количество попыток с каждого IP-адреса
- Автоматически добавляет подозрительные IP в блок-лист брандмауэра
Часть 1: Как работает брутфорс RDP и как его обнаружить
Прежде чем писать защиту, нужно понять, что мы ищем. При каждой попытке входа по RDP Windows записывает событие в журнал Security.
- Удачные входы имеют Event ID 4624 (успешный вход) с типом входа 10 (RemoteInteractive).
- Неудачные попытки имеют Event ID 4625 (неудачный вход).
Злоумышленники обычно перебирают пароли с одного IP-адреса или с небольшой сети. Если вы видите десятки или сотни событий 4625 с одного и того же IP за короткое время — это явный признак атаки на RDP сервер.
Как включить RDP и настроить аудит
Прежде чем защищать RDP доступ, убедитесь, что сам протокол включен:
- Как включить RDP в Windows: Параметры → Система → Удаленный рабочий стол → Включить.
- Как открыть RDP порт в брандмауэре: разрешить входящие подключения на порт 3389.
- Как проверить RDP: выполните
netstat -an | findstr 3389— порт должен быть в состоянии LISTENING.
Для обнаружения атак нам нужен журнал аудита. Проверить, включен ли аудит входа, можно командой:
auditpol /get /subcategory:"Logon"
Должно быть «Success and Failure» или хотя бы «Failure».
Часть 2: Базовая команда — читаем журнал событий RDP
Начнём с простого — научимся читать события неудачных попыток подключения к RDP.
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4625
StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message
Эта команда покажет все неудачные попытки входа по RDP за последние 24 часа. Но выводить просто события неудобно — нам нужно сгруппировать их по IP-адресам.
Часть 3: Извлекаем IP-адреса из событий RDP
Информация об IP-адресе атакующего спрятана в тексте сообщения. Нужно распарсить её с помощью регулярных выражений.
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4625
StartTime = (Get-Date).AddHours(-24)
}
$attackers = @{}
foreach ($event in $events) {
# Русская версия Windows
if ($event.Message -match 'Исходный сетевой адрес:\s+(\d+\.\d+\.\d+\.\d+)') {
$ip = $matches[1]
if ($attackers.ContainsKey($ip)) {
$attackers[$ip]++
} else {
$attackers[$ip] = 1
}
}
# Английская версия Windows
elseif ($event.Message -match 'Source Network Address:\s+(\d+\.\d+\.\d+\.\d+)') {
$ip = $matches[1]
if ($attackers.ContainsKey($ip)) {
$attackers[$ip]++
} else {
$attackers[$ip] = 1
}
}
}
$attackers.GetEnumerator() | Sort-Object Value -Descending
Этот скрипт создаёт хеш-таблицу, где ключ — IP-адрес, а значение — количество неудачных попыток подключения к удаленному рабочему столу. В конце выводится список IP с сортировкой по убыванию.
Часть 4: Порог срабатывания — сколько попыток считать атакой
Теперь нужно решить, при каком количестве попыток мы считаем IP злоумышленником. Для домашнего компьютера достаточно 5-10 попыток за сутки. Для публичного RDP сервера порог можно поднять до 50-100.
Добавим фильтр в скрипт:
$threshold = 10
$suspects = $attackers.GetEnumerator() | Where-Object { $_.Value -ge $threshold }
Часть 5: Добавляем IP в брандмауэр Windows
Теперь самое интересное — автоматическая блокировка подозрительных IP через встроенный брандмауэр Windows Defender.
Создадим правило для каждого подозрительного IP:
foreach ($suspect in $suspects) {
$ip = $suspect.Key
$ruleName = "Block RDP Brute Force - $ip"
# Проверяем, нет ли уже такого правила
$existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
if (-not $existingRule) {
New-NetFirewallRule -DisplayName $ruleName `
-Direction Inbound `
-LocalPort 3389 `
-Protocol TCP `
-RemoteAddress $ip `
-Action Block `
-Profile Any
Write-Host "IP $ip заблокирован (попыток: $($suspect.Value))"
}
}
Этот код создаёт правило брандмауэра, которое блокирует весь входящий трафик с указанного IP на порт RDP 3389.
Часть 6: Полный скрипт защиты RDP от брутфорса
Соберём всё вместе в один готовый скрипт, который можно запускать по расписанию для защиты RDP подключения.
# RDP Brute Force Defender
# Запускать от имени администратора
# Защита RDP сервера от брутфорс-атак
param(
[int]$HoursBack = 24,
[int]$Threshold = 10,
[string]$WhitelistFile = "whitelist.txt",
[switch]$Unblock
)
if ($Unblock) {
# Режим разблокировки: удаляем все созданные правила
Get-NetFirewallRule -DisplayName "Block RDP Brute Force -*" | Remove-NetFirewallRule
Write-Host "✅ Все правила блокировки RDP удалены" -ForegroundColor Green
exit
}
Write-Host "🔍 Поиск атак RDP за последние $HoursBack часов..." -ForegroundColor Cyan
# Читаем белый список
$whitelist = @()
if (Test-Path $WhitelistFile) {
$whitelist = Get-Content $WhitelistFile
Write-Host "📋 Белый список загружен: $($whitelist.Count) IP" -ForegroundColor Gray
}
# Получаем события неудачных входов
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4625
StartTime = (Get-Date).AddHours(-$HoursBack)
} -ErrorAction SilentlyContinue
if (-not $events) {
Write-Host "❌ Неудачных попыток входа по RDP не найдено" -ForegroundColor Yellow
exit
}
# Собираем статистику по IP
$attackers = @{}
foreach ($event in $events) {
# Русская версия Windows
if ($event.Message -match 'Исходный сетевой адрес:\s+(\d+\.\d+\.\d+\.\d+)') {
$ip = $matches[1]
}
# Английская версия Windows
elseif ($event.Message -match 'Source Network Address:\s+(\d+\.\d+\.\d+\.\d+)') {
$ip = $matches[1]
}
else {
continue
}
# Пропускаем локальные адреса
if ($ip -match '^127\.|^10\.|^172\.16\.|^192\.168\.') {
continue
}
if ($attackers.ContainsKey($ip)) {
$attackers[$ip]++
} else {
$attackers[$ip] = 1
}
}
if ($attackers.Count -eq 0) {
Write-Host "❌ Не найдено внешних IP с неудачными попытками" -ForegroundColor Yellow
exit
}
# Выводим статистику
Write-Host "`n📊 Статистика попыток RDP подключения:" -ForegroundColor Cyan
$attackers.GetEnumerator() | Sort-Object Value -Descending | ForEach-Object {
Write-Host " $($_.Key): $($_.Value) попыток"
}
# Фильтруем подозрительные IP (выше порога и не в белом списке)
$suspects = $attackers.GetEnumerator() | Where-Object {
$_.Value -ge $Threshold -and $_.Key -notin $whitelist
}
if ($suspects.Count -eq 0) {
Write-Host "`n✅ Подозрительных IP не найдено (порог: $Threshold попыток)" -ForegroundColor Green
exit
}
Write-Host "`n⚠️ Найдено подозрительных IP: $($suspects.Count)" -ForegroundColor Yellow
# Блокируем подозрительные IP
foreach ($suspect in $suspects) {
$ip = $suspect.Key
$ruleName = "Block RDP Brute Force - $ip"
$existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
if (-not $existingRule) {
try {
New-NetFirewallRule -DisplayName $ruleName `
-Direction Inbound `
-LocalPort 3389 `
-Protocol TCP `
-RemoteAddress $ip `
-Action Block `
-Profile Any `
-ErrorAction Stop
Write-Host " 🔒 IP $ip ЗАБЛОКИРОВАН (попыток: $($suspect.Value))" -ForegroundColor Red
}
catch {
Write-Host " ❌ Ошибка при блокировке IP $ip : $_" -ForegroundColor Red
}
} else {
Write-Host " ℹ️ IP $ip уже заблокирован ранее" -ForegroundColor Gray
}
}
Write-Host "`n✅ Защита RDP активирована. Для удаления всех правил запустите с ключом -Unblock" -ForegroundColor Green
Часть 7: Как использовать скрипт защиты RDP
Сохраните код в файл с расширением .ps1, например RDP-Defender.ps1.
Запуск вручную
powershell -ExecutionPolicy Bypass -File RDP-Defender.ps1
С порогом 20 попыток за последние 48 часов
powershell -ExecutionPolicy Bypass -File RDP-Defender.ps1 -HoursBack 48 -Threshold 20
Удалить все созданные правила (разблокировать IP)
powershell -ExecutionPolicy Bypass -File RDP-Defender.ps1 -Unblock
Создание белого списка
Создайте файл whitelist.txt в той же папке, где лежит скрипт, и перечислите IP-адреса по одному в строке:
192.168.1.100
10.0.0.5
89.123.45.67
Часть 8: Автоматический запуск скрипта через планировщик задач
Чтобы защита RDP работала постоянно, добавьте скрипт в планировщик задач Windows.
- Откройте Планировщик задач (Task Scheduler).
- Создайте новую задачу.
- На вкладке Триггеры установите повторение каждый час.
- На вкладке Действия укажите:
- Действие: Запуск программы
- Программа:
powershell.exe - Аргументы:
-ExecutionPolicy Bypass -File "C:\путь\к\RDP-Defender.ps1"
- На вкладке Условия снимите галочку «Запускать только при питании от сети».
- На вкладке Параметры поставьте галочку «Выполнять с наивысшими правами».
Готово. Теперь каждый час система будет проверять логи и блокировать атакующих.
Часть 9: Как изменить порт RDP для дополнительной защиты
Один из самых эффективных способов снизить количество атак — изменить порт RDP с 3389 на любой другой.
- Откройте Редактор реестра (regedit).
- Перейдите по пути:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp - Найдите параметр PortNumber, измените значение (в десятичном формате) на нужный порт, например 53389.
- В брандмауэре Windows создайте новое правило для входящих подключений на новом порту.
- Перезагрузите компьютер.
После этого RDP подключение будет доступно только через новый порт. Не забудьте обновить настройки в скрипте блокировки, заменив LocalPort 3389 на ваш новый порт.
Часть 10: Частые ошибки RDP и способы их исправления
Внутренняя ошибка RDP
Причина: проблемы с сертификатами, сетевыми уровнями аутентификации или настройками TLS.
- Решение 1: Проверьте, что на сервере и клиенте включена проверка подлинности RDP на уровне сети (NLA).
- Решение 2: Обновите сертификаты удаленного рабочего стола.
- Решение 3: Проверьте работу службы
TermService.
Ошибка подлинности RDP
Причина: несоответствие версий протокола или проблемы с Kerberos.
- Решение: В клиенте RDP (mstsc) на вкладке «Подключение» снимите галочку «Всегда запрашивать учетные данные» или настройте параметры аутентификации.
Черный экран при подключении по RDP
Причина: конфликт видеодрайверов, переполнение буфера обмена, проблемы с групповыми политиками.
- Решение 1: Перезапустите службу
Remote Desktop Services. - Решение 2: Отключите перенаправление принтеров и буфера обмена в настройках клиента.
- Решение 3: В реестре измените параметр
fDisableCursorShadowна 1.
RDP не работает после обновления Windows
Причина: обновления безопасности могут изменять настройки RDP или блокировать RDP порт.
- Решение: Проверьте настройки брандмауэра, убедитесь, что RDP доступ разрешен. При необходимости откатите проблемное обновление.
Часть 11: Расширенные возможности скрипта
Уведомления по email при обнаружении атаки
if ($suspects.Count -gt 0) {
$body = "Обнаружены атаки RDP с IP:`n"
foreach ($suspect in $suspects) {
$body += "$($suspect.Key): $($suspect.Value) попыток`n"
}
Send-MailMessage -From "server@domain.com" `
-To "admin@domain.com" `
-Subject "RDP Brute Force Attack Detected" `
-Body $body `
-SmtpServer "smtp.domain.com"
}
Временная блокировка вместо постоянной
Вместо создания постоянных правил можно использовать временную блокировку (например, на 24 часа) с помощью netsh advfirewall и планировщика задач для автоматического удаления.
Часть 12: Альтернативные решения для защиты RDP
Если вы не хотите писать свой скрипт, существуют готовые решения:
- RDP Defender — бесплатная утилита с графическим интерфейсом.
- Fail2Ban для Windows — порт популярной Linux-утилиты.
- RDP Wrapper — позволяет включать RDP на Windows Home, но не защищает от атак.
- Microsoft Advanced Threat Analytics — корпоративное решение для мониторинга безопасности.
Но самодельный скрипт PowerShell даёт главное преимущество — полный контроль и понимание того, что происходит в системе.
Часто задаваемые вопросы о RDP и защите
Вопрос: Как подключиться по RDP к компьютеру в локальной сети?
Ответ: Нажмите Win+R, введите mstsc, введите IP-адрес или имя компьютера, нажмите «Подключиться». Убедитесь, что на целевом компьютере RDP включен и порт 3389 открыт в брандмауэре.
Вопрос: Какой порт у RDP по умолчанию?
Ответ: 3389. Для повышения безопасности рекомендуется изменить порт RDP на любой другой (например, 53389).
Вопрос: Как исправить внутреннюю ошибку RDP?
Ответ: Проверьте настройки NLA, обновите сертификаты, убедитесь, что служба TermService работает. В большинстве случаев помогает отключение и повторное включение RDP на сервере.
Вопрос: Как настроить RDP на Windows Home?
Ответ: В Windows Home функция RDP сервера отсутствует. Можно использовать RDP Wrapper — утилиту, которая добавляет поддержку RDP в Home-версии.
Вопрос: Как проверить, не атакуют ли мой RDP?
Ответ: Используйте наш скрипт, который анализирует события 4625 в журнале Security. Или выполните команду: Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-24)} | Group-Object -Property {$_.Message -replace '(?s).+Исходный сетевой адрес:\s+(\d+\.\d+\.\d+\.\d+).+','$1'} | Sort-Object Count -Descending.
Заключение: автоматическая защита RDP — это просто
Мы создали мощный инструмент защиты от брутфорс-атак на RDP с помощью встроенных средств Windows. Всего несколько десятков строк кода — и ваш RDP сервер автоматически блокирует злоумышленников, не дожидаясь вашего вмешательства.
Этот скрипт можно модифицировать под свои нужды:
- Добавить поддержку других протоколов (FTP, SSH)
- Настроить временную блокировку вместо постоянной
- Интегрировать с системами мониторинга
- Создать веб-интерфейс для управления белым списком
Главное — помните: безопасность RDP начинается с маленьких шагов. Даже простой скрипт, запускаемый по расписанию, может предотвратить взлом и сохранить ваши данные.
Читайте также
















Добавить комментарий