⏱️ ¿Qué es Rate Limiting?
El Rate Limiting (limitación de tasa) controla cuántas peticiones puede hacer una IP en un período de tiempo determinado. Si una IP supera el límite configurado, se activa una acción (monitoreo, desafío o bloqueo). Es la defensa principal contra ataques de fuerza bruta (intentos de login masivos), scraping (extracción automatizada de contenido) y abuso de recursos (peticiones excesivas a APIs o formularios).
🎯 ¿Qué protege?
- Login / wp-admin: Frena ataques de fuerza bruta contra wp-login.php, wp-admin y páginas de registro.
- XML-RPC: Protege el endpoint xmlrpc.php contra ataques de amplificación y enumeración de usuarios.
- API REST: Limita peticiones a /wp-json/ para evitar saturación por scraping o abuso.
- Sitio general: Cubre todo el sitio (front-end) contra rastreadores agresivos y bots.
⚙️ Cómo funciona RPM + Burst
RPM (Requests Per Minute) es el límite sostenido de peticiones por minuto: cuántas veces puede una IP cargar contenido en un minuto (un humano navegando a ritmo normal genera unas 5-15 peticiones/min; un bot agresivo, 100+). Burst es cuántas de esas peticiones pueden llegar de forma prácticamente instantánea — cargar una sola página ya dispara varias a la vez (HTML, CSS, JS, imágenes). Si se supera el Burst, el servidor responde pidiendo esperar unos segundos antes de la siguiente petición; esto no bloquea la IP por sí solo mientras siga por debajo del límite de RPM. Esto diferencia entre tráfico humano real (ráfagas cortas ocasionales al cargar una página) y ataques automatizados (ráfagas continuas y sostenidas).
Acción: Monitor / Challenge / Block
La acción define qué ocurre cuando una IP supera el límite configurado. Cada modo ofrece un nivel distinto de severidad:
📋 Monitor (Log Only)
Registra cada vez que una IP supera el límite, pero no toma ninguna acción. Ideal para la fase de observación inicial. Úsalo las primeras 24-48h para establecer una línea base de tráfico legítimo.
⚠️ Challenge (HTTP 429)
Responde con el código HTTP 429 Too Many Requests e incluye un header Retry-After. El navegador o cliente debe esperar antes de reintentar. Es la opción recomendada para producción: frena abusos sin un bloqueo permanente.
🚫 Block (HTTP 403)
Responde con HTTP 403 Forbidden y bloquea la IP inmediatamente. La IP se añade a la lista de bloqueados y todas las peticiones posteriores son rechazadas. Úsalo solo cuando estés seguro de que los límites no afectan tráfico legítimo.
Presets y Límites Personalizados
SeenSecure incluye presets preconfigurados para los escenarios más comunes. Puedes seleccionar un preset o configurar límites personalizados manualmente. Los presets ajustan tanto RPM como Burst automáticamente:
Personalizado
Tú defines RPM (1-3600) y Burst (1-1000). Ideal para sitios con necesidades específicas o después de analizar los logs en modo Monitor.
🧪 Testing (50/10)
50 RPM + Burst 10. Pensado para pruebas y desarrollo. Límite muy permisivo para evitar interferencias mientras ajustas la configuración.
🔑 Login (50/10)
50 RPM + Burst 10. Optimizado para proteger wp-login.php y wp-admin. 50 intentos de login por minuto es suficiente para usuarios legítimos pero frena ataques de fuerza bruta.
🔌 XML-RPC (30/5)
30 RPM + Burst 5. Límite más restrictivo porque xmlrpc.php es un vector común de ataques de amplificación. Si no usas XML-RPC, considera desactivarlo por completo.
🌐 API REST (1000/100)
1000 RPM + Burst 100. Límite alto para no interferir con integraciones legítimas (plugins, temas, apps externas). Ajusta si tu API tiene mucho tráfico.
🌍 Sitio (1000/100)
1000 RPM + Burst 100. Cobertura general para el front-end del sitio. Adecuado para la mayoría de sitios con tráfico moderado. Monitorea los logs y reduce si ves abusos.
🔧 Límites personalizados
Al seleccionar "Personalizado" puedes definir:
- RPM: Rango 1-3600. Peticiones por minuto sostenidas.
- Burst: Rango 1-1000. Máximo de peticiones consecutivas en ráfaga.
Contextos Protegidos
Rate Limiting se aplica de forma independiente en cuatro contextos distintos. Cada contexto tiene su propio contador de RPM/Burst, lo que permite límites específicos sin afectar otras áreas del sitio:
🔐 Login / wp-admin
Protege wp-login.php, wp-admin/, páginas de registro y recuperación de contraseña. El contexto más crítico: un ataque exitoso aquí puede comprometer todo el sitio. Usa el preset Login (50 RPM) o un límite personalizado más restrictivo.
🔌 XML-RPC
Protege xmlrpc.php. Este endpoint es famoso por ataques de amplificación DDoS y enumeración de usuarios. El preset XML-RPC (30 RPM + Burst 5) es muy restrictivo porque idealmente este endpoint debería tener tráfico mínimo o nulo.
🌐 API REST
Protege /wp-json/. Muchos plugins y temas hacen peticiones frecuentes a la REST API. El preset (1000 RPM + Burst 100) es alto para no romper integraciones. Monitorea los logs para identificar si algún plugin externo necesita más o menos límite.
🌍 Sitio General
Cubre todo el front-end del sitio: páginas, posts, archivos, búsquedas y cualquier URL no cubierta por los otros contextos. El preset (1000 RPM + Burst 100) es adecuado para la mayoría. Reduce si ves scraping agresivo de contenido.
Escalada Progresiva
El sistema de escalada progresiva aumenta automáticamente la severidad de las penalizaciones para IPs reincidentes. En lugar de aplicar el mismo castigo siempre, las sanciones se endurecen cuanto más persiste el abuso:
Nivel 1 (Leve)
Penalización inicial de corta duración. La IP recibe un timeout breve (unos minutos) antes de poder reintentar. Si cesa el abuso, la IP vuelve a la normalidad automáticamente.
Nivel 2 (Moderado)
Si la IP reincide dentro de la ventana de escalada, la penalización se alarga significativamente (minutos a horas). El sistema registra la reincidencia y aplica un tiempo de bloqueo mayor.
🚫 Bloqueo Permanente
Si la IP supera el umbral de reincidencias dentro de la ventana de escalada configurada, se añade automáticamente a la lista de bloqueados de forma permanente. Solo un administrador puede desbloquearla manualmente desde la lista de IPs bloqueadas.
⚙️ Parámetros configurables
- Nivel 1 Duración: Tiempo de penalización inicial (por defecto 15 minutos, configurable entre 1 y 60).
- Nivel 2 Duración: Penalización para reincidentes (por defecto 120 minutos / 2 horas, configurable entre 30 y 1440).
- Umbral Permanente: Número de reincidencias antes del bloqueo permanente (por defecto 5, configurable entre 2 y 10).
- Ventana de Escalada: Período de tiempo durante el cual se cuentan las reincidencias (por defecto 24 horas, configurable entre 1 y 168). Si la IP se porta bien durante este período, el contador se reinicia.
❓ FAQ — Preguntas Frecuentes
🔹 ¿Qué hago si un servicio externo (API, webhook) queda bloqueado?
Si un servicio externo que tu sitio necesita (gateway de pago, CRM, webhook de terceros) queda bloqueado por Rate Limiting:
- Revisa los logs — Ve al registro de Rate Limiting e identifica la IP o rango de IPs del servicio bloqueado.
- Añade la IP a la whitelist — En la sección de Whitelist del firewall, agrega la IP o rango CIDR (ej: 203.0.113.0/24) para que el tráfico de ese servicio no pase por Rate Limiting.
- Verifica conectividad — Haz una prueba para confirmar que el servicio funciona correctamente.
🔹 ¿Cuánto tiempo debo usar el modo Monitor antes de pasar a Challenge?
Recomendamos 24-48 horas en modo Monitor como mínimo. Esto te permite:
- Identificar picos de tráfico legítimo (lanzamientos, promociones, campañas de email).
- Establecer la línea base de RPM para cada contexto.
- Detectar IPs abusivas antes de activar bloqueos.
- Ajustar los presets o crear límites personalizados informados.
Después de ese período, cambia a Challenge (HTTP 429). Monitorea otros 7 días antes de considerar Block.
🔹 ¿El logueo (logging toggle) afecta el rendimiento?
El toggle de logging activa o desactiva el registro detallado de eventos de Rate Limiting. Con el logging activado, cada vez que una IP supera un límite se escribe una entrada en el log. Con el logging desactivado, las acciones (Challenge/Block) siguen ejecutándose pero no se registran. Recomendamos mantener el logging activado durante las fases de Monitor y Challenge para tener visibilidad, y se puede desactivar en producción si el volumen de registros es muy alto.
🔹 ¿Puedo tener límites distintos para cada contexto?
Sí. Cada contexto (Login, XML-RPC, API REST, Sitio) tiene su propia configuración de RPM y Burst. Puedes tener, por ejemplo, 50 RPM en Login, 30 RPM en XML-RPC, 1000 RPM en API REST y 1000 RPM en Sitio general, todo al mismo tiempo.
🔹 ¿El Rate Limiting afecta a los motores de búsqueda (Googlebot)?
Los bots de motores de búsqueda legítimos (Googlebot, Bingbot, etc.) están identificados por su User-Agent y generalmente no superan los límites de un preset estándar (1000 RPM). Si tienes dudas, revisa los logs en modo Monitor para ver si algún crawler está siendo limitado. En ese caso, puedes añadir su IP a la whitelist o aumentar el límite del contexto Sitio general.
🔹 ¿Qué es la "Primera Línea" que aparece en esta pestaña?
Es una capa de protección adicional (no específica de bots) que actúa antes incluso de cargar WordPress, pensada para picos de tráfico y ataques muy intensos que podrían saturar el resto del sitio. Se activa y configura aquí mismo, en la sección "🚀 Primera Línea". Como parte de esa protección, también evita perjudicar tu posicionamiento: antes de aplicar cualquier límite, comprueba si la visita pertenece de verdad a un buscador o asistente de IA legítimo (contrastando su IP, no solo el texto que envía) para dejarla pasar sin fricción.
🔹 Se bloqueó permanentemente a alguien legítimo por reincidencia ¿cómo lo desbloqueo?
El bloqueo permanente por escalada progresiva solo lo puede revertir un administrador, a mano, desde la lista de IPs bloqueadas del firewall (o añadiendo la IP a la whitelist, que tiene prioridad sobre cualquier bloqueo). No se revierte solo aunque la IP deje de generar tráfico.
🔹 ¿Qué significa exactamente que una petición reciba HTTP 429?
Es la respuesta estándar de "demasiadas peticiones" cuando el modo activo es Challenge: el visitante puede reintentar pasado un tiempo. No es un bloqueo permanente ni indica actividad maliciosa confirmada, solo que ha superado el límite RPM configurado para ese contexto.