Windows28 de mayo de 2026 7 vistas

Bloquear los ataques de fuerza bruta RDP en un VPS Windows en 2026

Bloquear los ataques de fuerza bruta RDP en un VPS Windows en 2026

Usted gestiona un VPS Windows expuesto en Internet y descubre en el Visor de eventos miles de intentos de conexión RDP fallidos por día. Es normal: todo VPS Windows con el puerto 3389 abierto es escaneado constantemente por botnets. Sin protección, una sola mala configuración es suficiente para que un atacante entre.

Esta guía explica cómo bloquear los ataques de fuerza bruta RDP en 3 niveles: (1) higiene básica de RDP, (2) prohibición automática de las IP atacantes, (3) arquitectura VPN/Gateway para eliminar la exposición. Saldrá con una solución completa probada, gratuita y adaptable a cualquier VPS Windows Server 2019, 2022 o 2025.

Resumen rápido - Lo mínimo vital en 5 minutos

  • Activar NLA (Network Level Authentication): Sistema → Escritorio remoto → Avanzado → exigir NLA
  • Política de bloqueo de cuenta: 5 fallos = bloqueo 30 min (a través de secpol.msc)
  • Instalar IPBan (1 comando PowerShell, prohibición automática de IP maliciosas):
iex (irm https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install-latest.ps1)
  • Cambiar el puerto RDP 3389 → 49xxx a través de regedit (ralentiza los escaneos automatizados).

Detalles y opciones avanzadas a continuación.

Por qué RDP es el objetivo n°1 de las botnets

El Protocolo de Escritorio Remoto está expuesto en el puerto 3389/TCP, y este puerto es escaneado continuamente en toda la IPv4 por botnets automatizados. Un VPS Windows nuevo, puesto en línea hoy sin ninguna otra acción, recibirá típicamente:

  • 5,000 a 50,000 intentos de conexión por día desde las primeras horas.
  • Intentos en las cuentas por defecto: Administrator, admin, user, test, sql, backup.
  • Intentos en las cuentas estándar de Windows descubiertas a través de enumeración SMB / NetBIOS.
  • Intentos con listas de contraseñas (rockyou.txt y derivados), a un ritmo de 1 intento cada 1 a 5 segundos por IP.

Si el atacante encuentra una contraseña débil, él:

  • Crea una nueva cuenta de administrador "discreta" (ej: Helpdesk$, IUSR_X).
  • Desactiva Windows Defender.
  • Instala un minero de criptomonedas, un bot de spam o un ransomware.
  • Vende el acceso en los mercados negros (ej: xDedic histórico).

El tiempo promedio entre la compromisión y el primer impacto malicioso: 15 minutos.

De ahí el objetivo de esta guía: hacer que su VPS sea poco interesante para los bots y bloquear las IP que intentan de todos modos.

Diagnosticar un ataque de fuerza bruta en curso

Contar los intentos fallidos

Abra PowerShell como administrador y ejecute:

# Número de fallos de conexión en las últimas 24h
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddDays(-1)} |
    Measure-Object | Select-Object -ExpandProperty Count

El Event ID 4625 es el identificador de Windows para un fallo de autenticación. Si ve más de unas pocas decenas por día, usted es un objetivo.

Ver las IP atacantes en claro

Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 |
    ForEach-Object {
        $xml = [xml]$_.ToXml()
        $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' } | Select-Object -ExpandProperty '#text'
    } |
    Where-Object { $_ -and $_ -ne '-' } |
    Group-Object | Sort-Object Count -Descending | Select-Object -First 20

Obtendrá el top 20 de las IP atacantes con su número de intentos. Si una IP acumula más de 50 intentos, es claramente maliciosa - debe ser prohibida.

Identificar las cuentas objetivo

Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 |
    ForEach-Object {
        $xml = [xml]$_.ToXml()
        $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' } | Select-Object -ExpandProperty '#text'
    } |
    Group-Object | Sort-Object Count -Descending | Select-Object -First 20

Si ve Administrator, admin o cuentas inexistentes, es un ataque de fuerza bruta ciego (el caso más común).

Capa 1 - Higiene RDP (lo mínimo no negociable)

Antes de hablar de herramientas anti-fuerza bruta, configure estos 5 ajustes básicos. Ninguna herramienta compensará su ausencia.

1.1 Activar NLA (Network Level Authentication)

NLA fuerza la autenticación ANTES de la apertura de la sesión RDP. Sin NLA, el atacante puede iniciar la sesión, ver la pantalla de inicio de sesión y hacer fuerza bruta mucho más rápido.

# Activar NLA a través del registro
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" `
    -Name "UserAuthentication" -Value 1

O a través de la interfaz: sysdm.cpl → pestaña Uso remoto → marcar Permitir solo conexiones con NLA.

1.2 Renombrar (o desactivar) la cuenta Administrator

La cuenta Administrator representa el 80 % de los objetivos de fuerza bruta. Renómbrala:

$adminSID = "S-1-5-21-*-500"
$adminAccount = Get-LocalUser | Where-Object { $_.SID -like $adminSID }
Rename-LocalUser -Name $adminAccount.Name -NewName "Admin_$(Get-Random -Maximum 9999)"

Mejor aún: cree una nueva cuenta de administrador con un nombre no adivinable y desactive completamente Administrator:

Disable-LocalUser -Name "Administrator"

⚠️ Antes de desactivar Administrator, verifique que otra cuenta de administrador funcione y que pueda conectarse a través de RDP. De lo contrario, se bloqueará fuera del VPS.

1.3 Política de bloqueo de cuenta (Account Lockout Policy)

5 intentos fallidos = cuenta bloqueada 30 minutos. Configuración a través de secpol.msc → Estrategias de cuenta → Estrategia de bloqueo de cuenta:

Parámetro Valor recomendado
Umbral de bloqueo de cuenta 5 intentos
Duración del bloqueo de cuenta 30 minutos
Restablecer el contador después 30 minutos

O en línea de comandos:

net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30

1.4 Política de contraseñas fuertes

net accounts /minpwlen:14 /maxpwage:90 /minpwage:1 /uniquepw:5
  • Mínimo 14 caracteres
  • Expiración cada 90 días
  • 1 día mínimo antes del cambio (anti-ciclado)
  • Prohibir las 5 últimas contraseñas

1.5 Cambiar el puerto RDP por defecto (3389 → puerto aleatorio)

Esto no bloquea a un atacante dirigido, pero elimina el 95 % del ruido de los escaneos automatizados.

$newPort = 53389  # Elegir un puerto aleatorio entre 49152 y 65535
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" `
    -Name "PortNumber" -Value $newPort

# Abrir el nuevo puerto en el firewall
New-NetFirewallRule -DisplayName "RDP Custom Port" -Direction Inbound `
    -LocalPort $newPort -Protocol TCP -Action Allow

# Cerrar el puerto 3389
Get-NetFirewallRule -DisplayName "Remote Desktop*" | Disable-NetFirewallRule

Para volver a conectarse, use ahora <ip>:53389 en el cliente RDP. Reinicie el servidor para que el nuevo puerto esté activo.

⚠️ Antes de reiniciar, pruebe la nueva regla del firewall desde otra IP o anote la consola fuera de banda (consola KVM/IPMI de su proveedor) para recuperar el acceso en caso de error.

1.6 Limitar el acceso RDP por IP (reglas de alcance del firewall)

Si se conecta siempre desde las mismas IP (oficina, VPN, IP fija), autorice solo estas IP:

# Reemplace por sus IP autorizadas (separadas por comas)
$allowedIPs = "203.0.113.42", "198.51.100.10"

Get-NetFirewallRule -DisplayName "*Remote Desktop*" | ForEach-Object {
    Set-NetFirewallRule -Name $_.Name -RemoteAddress $allowedIPs
}

Esta es la medida más efectiva: si el atacante no proviene de una IP en la lista blanca, su paquete es rechazado antes de llegar al servicio RDP. Fuerza bruta imposible.

Para un uso nómada, vea la capa 3 con VPN.

Capa 2 - Prohibición automática de IP maliciosas

Sus ajustes básicos están en su lugar, pero los bots seguirán intentando. La auto-prohibición detecta automáticamente las IP que multiplican los fallos y las prohíbe a través del Firewall de Windows.

Comparativa de las 6 herramientas principales

Herramienta Licencia Mantenimiento Tipo Recomendación
IPBan (DigitalRuby) Gratis (Pro de pago) Activo 2025+ Servicio Windows ⭐ La más popular y sólida
Fail2Ban4Win (Aldaviva) Gratis, MIT Activo Servicio Windows Excelente, moderno, .NET
EZWinBan (neil-sabol) Gratis Moderado Script PS + Programador de tareas Sencillo, ideal para servidor pequeño
wail2ban (glasnt) Gratis Bajo (2017) Script PS Histórico, a evitar
EvlWatcher Gratis Activo Servicio Windows Bueno, menos documentado
RDPGuard Comercial (~99$) Activo Servicio Windows Cubre también FTP/SMTP/SQL

Recomendación para OuiHeberg: IPBan en versión gratuita cubre el 99 % de las necesidades. Si desea una alternativa 100 % de código abierto moderna, Fail2Ban4Win.

Tutorial IPBan - instalación, configuración, verificación

Paso 1 - Instalación en un comando

Abra PowerShell como administrador y ejecute:

iex (irm https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install-latest.ps1)

El script descarga la última versión, la instala como un servicio de Windows y configura el servicio IPBan para que se inicie automáticamente.

Paso 2 - Verificar que el servicio esté en funcionamiento

Get-Service -Name IPBan

Debe mostrar Status: Running.

Paso 3 - Editar la configuración

El archivo de configuración se encuentra en:

C:\Program Files\IPBan\ipban.config

Los parámetros esenciales:

<!-- Número de fallos antes de la prohibición -->
<add key="FailedLoginAttemptsBeforeBan" value="5"/>

<!-- Duración de la prohibición (en días.horas:minutos:segundos) -->
<!-- Formato especial: 00:30:00 = 30 minutos -->
<add key="ExpireTime" value="01:00:00:00"/>  <!-- 1 día -->

<!-- Ventana de conteo de fallos -->
<add key="CycleTime" value="00:00:00:15"/>  <!-- 15 segundos -->

<!-- Whitelist (IPs nunca prohibidas) -->
<add key="Whitelist" value="203.0.113.42,198.51.100.0/24"/>

<!-- Blacklist permanente -->
<add key="Blacklist" value=""/>

Para activar una política estricta (recomendada para producción):

  • FailedLoginAttemptsBeforeBan = 3
  • ExpireTime = 30:00:00:00 (30 días)
  • Incluya todas sus IP de gestión en la lista blanca.

Paso 4 - Reiniciar el servicio después de la modificación

Restart-Service IPBan

Paso 5 - Ver las IP prohibidas en tiempo real

IPBan crea automáticamente una regla de firewall llamada IPBan_*. Para consultarla:

Get-NetFirewallRule -DisplayName "IPBan*" |
    Get-NetFirewallAddressFilter |
    Select-Object -ExpandProperty RemoteAddress

O más visual, mirando los registros de IPBan:

Get-Content "C:\Program Files\IPBan\ipban.log" -Tail 50 -Wait

Verá en directo cada IP prohibida con la marca de tiempo y el número de fallos.

Paso 6 - Desprohibir una IP por error

# Método 1: retirar del firewall directamente
Remove-NetFirewallRule -DisplayName "IPBan_*" -ErrorAction SilentlyContinue

# Método 2: agregar la IP a la lista blanca en ipban.config y luego reiniciar
Restart-Service IPBan

Configuración recomendada por perfil

Perfil Intentos antes de la prohibición Duración de la prohibición Ciclo
Servidor personal / dev 5 1 día 15 seg
Servidor de producción expuesto 3 7 días 15 seg
Servidor crítico 2 30 días 15 seg
Bastión / servidor único 1 365 días 15 seg

Alternativa - Script PowerShell custom auto-prohibición (sin dependencia)

Si no desea ninguna dependencia externa ni servicio de terceros, aquí hay un script PowerShell autónomo que hace el trabajo. Escanea los Event ID 4625 y prohíbe cualquier IP que acumule más de N fallos en 1 hora.

Guarde este script en C:\Scripts\AutoBanRDP.ps1:

# === OuiHeberg - Auto-prohibición RDP fuerza bruta (sin dependencia) ===

param(
    [int]$Threshold = 10,       # Número de fallos antes de la prohibición
    [int]$WindowHours = 1,      # Ventana de conteo en horas
    [int]$BanDays = 7           # Duración de la prohibición en días
)

$ruleName = "OuiHeberg_AutoBan_RDP"
$startTime = (Get-Date).AddHours(-$WindowHours)

# Recuperar las IP atacantes
$attackers = Get-WinEvent -FilterHashtable @{
    LogName   = 'Security'
    ID        = 4625
    StartTime = $startTime
} -ErrorAction SilentlyContinue | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $ip = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
    if ($ip -and $ip -ne '-' -and $ip -ne '::1' -and $ip -ne '127.0.0.1') { $ip }
} | Group-Object | Where-Object { $_.Count -ge $Threshold } | Select-Object -ExpandProperty Name

if (-not $attackers) {
    Write-Host "Ninguna IP a prohibir (umbral = $Threshold en $WindowHours h)." -ForegroundColor Green
    return
}

# Recuperar la regla existente o crearla
$existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
if ($existingRule) {
    $currentIPs = ($existingRule | Get-NetFirewallAddressFilter).RemoteAddress
    $allIPs = ($currentIPs + $attackers) | Sort-Object -Unique
    Set-NetFirewallRule -DisplayName $ruleName -RemoteAddress $allIPs
} else {
    New-NetFirewallRule -DisplayName $ruleName `
        -Direction Inbound -Action Block `
        -RemoteAddress $attackers `
        -Description "Auto-prohibición OuiHeberg: crea el $(Get-Date -Format 'yyyy-MM-dd HH:mm')"
}

Write-Host "$($attackers.Count) IP prohibida(s): $($attackers -join ', ')" -ForegroundColor Yellow

# Programar la desprohibición automática (eliminación de la regla después de BanDays días)
$logPath = "C:\Scripts\AutoBanRDP.log"
$attackers | ForEach-Object {
    "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')`tBAN`t$_`tEXPIRE=$((Get-Date).AddDays($BanDays))" | Out-File -Append $logPath
}

Programar la ejecución cada 15 minutos

$action = New-ScheduledTaskAction -Execute "powershell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\AutoBanRDP.ps1"

$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) `
    -RepetitionInterval (New-TimeSpan -Minutes 15) `
    -RepetitionDuration (New-TimeSpan -Days 365)

Register-ScheduledTask -TaskName "OuiHeberg-AutoBanRDP" `
    -Action $action -Trigger $trigger `
    -User "SYSTEM" -RunLevel Highest -Force

El script se ejecuta cada 15 minutos en segundo plano. Puede ajustar $Threshold, $WindowHours y $BanDays según su tolerancia.

Ventajas del script custom

  • ✓ Sin dependencia externa.
  • ✓ Código 100 % auditable y modificable.
  • ✓ Registros locales completos.

Limitaciones

  • ❌ Sin desprohibición automática (a scriptar como complemento).
  • ❌ Sin detección multi-servicios (solo RDP a través del Evento 4625).
  • ❌ Para > 10,000 IP prohibidas, la regla del firewall se vuelve pesada - preferir IPBan.

Capa 3 - Arquitectura segura (la verdadera solución)

Las capas 1 y 2 reducen drásticamente los riesgos. La verdadera seguridad consiste en no exponer RDP en absoluto. Tres arquitecturas recomendadas:

Opción A - VPN delante de RDP (la más simple)

  • Instale un servidor WireGuard o OpenVPN en su VPS (o en frontal).
  • Bloquee el puerto RDP excepto desde la IP interna de la VPN.
  • Se conecta primero a la VPN, luego a RDP como si estuviera en la LAN.

Ventajas: RDP se vuelve invisible desde Internet. Costo: 30 min de instalación, rendimiento nativo.

Opción B - RD Gateway (Remote Desktop Gateway)

Solución nativa de Microsoft: un servidor RD Gateway actúa como proxy HTTPS para sus sesiones RDP. El cliente se conecta en HTTPS (puerto 443) al Gateway, que reenvía en RDP internamente.

Ventajas: compatible con el cliente RDP estándar, cifrado HTTPS, integración AD. Inconveniente: requiere una licencia RDS y más configuración.

Opción C - Bastión / Jump host

Un servidor "bastión" minimalista con solo SSH o RDP a través de clave. Todas sus conexiones pasan por él. Si el bastión se ve comprometido, sus servidores reales permanecen intactos.

Recomendado para infraestructuras de más de 3-5 VPS.

Verificación y monitoreo

Medir la eficacia después de 24h

Reinicie el script de diagnóstico de la sección anterior. Si sus medidas son efectivas, debería ver:

  • Evento 4625: < 100/día (vs miles antes).
  • Top IP atacantes: 1-3 intentos cada uno (vs cientos).
  • Reglas del firewall IPBan: crecimiento regular de las IP prohibidas.

Alerta por correo en caso de ataque masivo

Script a programar cada hora para alertar si > 500 fallos/hora:

$count = (Get-WinEvent -FilterHashtable @{
    LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-1)
} -ErrorAction SilentlyContinue | Measure-Object).Count

if ($count -gt 500) {
    Send-MailMessage -From "[email protected]" -To "[email protected]" `
        -Subject "⚠️ Ataque RDP en curso: $count intentos en 1h" `
        -Body "VPS objetivo. Verificar IPBan y registros." `
        -SmtpServer "smtp.votreservice.com"
}

Auditoría semanal de cuentas

Una vez a la semana, verifique que no se haya creado ninguna cuenta sospechosa:

Get-LocalUser | Where-Object { $_.Enabled -eq $true } | Format-Table Name, LastLogon, Description

Monitoree las cuentas que aparecieron recientemente y que no reconoce.

FAQ - Asegurar RDP contra los ataques de fuerza bruta

¿Cuántos intentos de conexión RDP se supone que debo sufrir en un VPS?

En un VPS Windows recién desplegado con el puerto 3389 estándar expuesto, cuente de 5,000 a 50,000 intentos por día desde las primeras horas. Este tráfico proviene de botnets que escanean continuamente el IPv4. Una reducción a menos de 100/día es el objetivo después de aplicar la guía.

¿Cuál es el comando para ver las IP que atacan mi RDP?

En PowerShell admin: Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 luego extraiga los campos IpAddress del XML. El script completo está en la sección de diagnóstico. Le da el top 20 de las IP con el número de intentos.

¿IPBan o Fail2Ban4Win, cuál elegir?

IPBan es más maduro, mejor documentado, y ofrece una versión Pro con panel de control. Fail2Ban4Win es más moderno (.NET 6+), 100 % open source MIT, y más ligero. Para la mayoría de los usos, IPBan en versión gratuita es más que suficiente. Fail2Ban4Win es más adecuado si desea contribuir al código o integrarlo en una CI.

¿Cambiar el puerto RDP de 3389 a otro es suficiente para protegerse?

No, pero es útil como complemento. Cambiar el puerto elimina el 95 % del ruido de los escaneos automatizados (los bots solo escanean 3389 por defecto). Pero un atacante dirigido hará un escaneo completo de sus puertos en unos minutos. Combine puerto personalizado + NLA + bloqueo + IPBan para una verdadera protección.

¿Cómo saber si mi VPS ya ha sido comprometido?

Verifique: (1) lista de cuentas locales (Get-LocalUser) - cualquier cuenta no creada por usted es sospechosa; (2) tareas programadas (Get-ScheduledTask) - busque scripts desconocidos; (3) procesos en ejecución (Get-Process) - busque mineros (xmrig, ethminer) o conexiones salientes inusuales; (4) Event Log Application/System - busque instalaciones recientes inesperadas. En caso de duda seria, reinstale el VPS desde cero - un VPS comprometido no se limpia, se reemplaza.

¿El blanqueo por IP funciona si trabajo de forma nómada?

Mal. Si su IP cambia regularmente (3G/4G, hoteles, coworking), el blanqueo se vuelve impracticable. Solución: monte un VPN en el VPS (WireGuard ideal, 10 min de instalación) y autorice RDP solo desde la IP interna del VPN. Mantiene la protección sin tener que mantener una lista de IP.

¿Qué hacer si estoy bloqueado afuera después de haber configurado mal el firewall?

Utilice la consola fuera de banda de su proveedor de alojamiento (VNC, KVM, IPMI) - en OuiHeberg, accesible desde el área de cliente. Esta consola da acceso directo al VPS sin pasar por RDP, por lo tanto, independientemente del firewall. Puede corregir o desactivar la regla problemática.

¿Cuánto tiempo se necesita para que un ataque de fuerza bruta tenga éxito en una cuenta débil?

Con una contraseña de 8 caracteres en minúsculas: unos minutos. Con 12 caracteres mezclados: unos días. Con 14+ caracteres fuertes: varios años. Por eso la política de contraseñas (net accounts /minpwlen:14) combinada con el bloqueo de cuentas hace que el ataque de fuerza bruta sea prácticamente imposible.

¿IPBan ralentiza mi servidor?

No. IPBan funciona como un servicio ligero que lee los Event Log y añade reglas al firewall nativo de Windows. El consumo es negligible (< 30 Mo RAM, < 1 % CPU incluso bajo un ataque masivo). Las reglas del firewall de Windows están optimizadas para manejar decenas de miles de IP sin impacto perceptible.

¿Qué hacer con las IP prohibidas después de varios meses?

Puede purgar periódicamente las viejas IP a través de IPBan (parámetro ExpireTime). Una ventana de 30 a 90 días es un buen compromiso: los botnets renuevan sus IP regularmente, no mantenerlas ad vitam aeternam evita que la lista se vuelva ingobernable.

Conclusión

Bloquear los ataques de fuerza bruta RDP en un VPS Windows requiere tres capas complementarias: (1) higiene RDP - NLA, bloqueo, contraseñas fuertes, puerto personalizado; (2) auto-baneo con IPBan o un script de PowerShell personalizado; (3) idealmente, un VPN o bastión para no exponer RDP en absoluto.

Con estas tres capas, pasa de 20,000 intentos/día a menos de 100, y las raras IP que aún intentan son prohibidas automáticamente. Su VPS sigue siendo fácilmente accesible para usted, pero se convierte en un muro infranqueable para los bots.

¿Quiere un VPS Windows ya configurado con IPBan, firewall endurecido y consola fuera de banda gratuita incluida? Los VPS Windows de OuiHeberg están preconfigurados para la producción: NLA activado, política de bloqueo estricta, VPN WireGuard opcional, soporte 7 días a la semana basado en Francia.