Limitar peticiones POST por IP y configurar URLs de excepción


#1

Introducción

Core-Admin permite restringir las peticiones HTTP POST a un hosting web para que solo se acepten desde determinadas direcciones IP. Esto es útil para proteger formularios de login, paneles de administración o cualquier endpoint que reciba datos mediante POST.

Además, es posible definir URLs específicas que queden excluidas de esta restricción, permitiendo que ciertos endpoints (como callbacks de pasarelas de pago, webhooks o APIs públicas) sigan aceptando POST desde cualquier IP.

Ambas opciones se configuran desde el panel de opciones del hosting en Webhosting Management.

Configurar limit_post_to_ips

Esta opción permite definir una lista de direcciones IP autorizadas para enviar peticiones POST al hosting. Todas las peticiones POST que provengan de IPs que no estén en la lista serán denegadas con un error 403 (Forbidden).

Valores aceptados

Se pueden combinar los siguientes tipos de valores, separados por comas o espacios:

Tipo Ejemplo
IPv4 192.168.1.100
IPv6 2001:db8::1
Red CIDR (IPv4) 192.168.1.0/24
Red CIDR (IPv6) 2001:db8::/32
Nombre de host servidor.ejemplo.com

Nota: Los nombres de host (dominios) se almacenan pero no tienen efecto en la directiva Apache generada, ya que la restricción se aplica sobre REMOTE_ADDR. Se recomienda usar siempre direcciones IP o redes CIDR.

Pasos para configurar

  1. Acceda a Webhosting Management y seleccione el hosting que desea proteger.

  2. Pulse en la pestaña Options del hosting.

  1. Localice la opción limit_post_to_ips en la lista y pulse sobre ella para editarla.

  2. Introduzca las direcciones IP autorizadas, separadas por comas o una por línea. Por ejemplo:

    203.0.113.10, 198.51.100.0/24, 2001:db8::1
    
  1. Pulse Save para aplicar la configuración. Core-Admin regenerará la configuración de Apache y reiniciará el servicio automáticamente.

Resultado en Apache

Core-Admin genera directivas mod_rewrite dentro del VirtualHost. El mecanismo funciona así:

  • Se activa RewriteEngine On.
  • Se verifica que el método HTTP sea POST.
  • Se comprueba que la IP de origen (REMOTE_ADDR) no coincida con ninguna de las IPs/redes configuradas.
  • Si no coincide con ninguna, se deniega el acceso.

Ejemplo de configuración generada:

# Core-Admin limit_post_to_ips directive
RewriteEngine On
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.10$
RewriteCond %{REMOTE_ADDR} !^198\.51\.100\.
RewriteCond %{REMOTE_ADDR} !^2001\:db8\:\:1$
RewriteRule .* - [F]

Importante: Esta protección es compatible con mod_remoteip. Si tiene configurado un proxy inverso con mod_remoteip, REMOTE_ADDR contendrá la IP real del cliente y la restricción funcionará correctamente.

Configurar skip_limit_post_to_ips_urls

Una vez activada la restricción limit_post_to_ips, puede que necesite que ciertas URLs del hosting sigan aceptando POST desde cualquier IP. Casos típicos:

  • Callbacks de pasarelas de pago (PayPal IPN, Stripe webhooks, Redsys, etc.)
  • Webhooks de servicios externos (GitHub, GitLab, servicios de notificación)
  • APIs públicas que deben ser accesibles desde cualquier origen
  • Endpoints de autenticación federada (SAML, OAuth callbacks)

La opción skip_limit_post_to_ips_urls permite definir estas URLs de excepción.

Formato de las URLs

  • Cada URL debe ser una ruta relativa que comience con /.
  • No debe incluir el protocolo (https://) ni el nombre del host.
  • Se pueden introducir separadas por comas, espacios o una por línea.
Correcto Incorrecto
/wp-login.php https://ejemplo.com/wp-login.php
/api/webhook api/webhook
/tienda/notificacion-pago.php tienda/notificacion-pago.php

Pasos para configurar

  1. Acceda a las Options del hosting (mismo panel donde configuró limit_post_to_ips).

  2. Localice la opción skip_limit_post_to_ips_urls y pulse sobre ella para editarla.

  1. Introduzca las rutas URL que desea excluir de la restricción. Por ejemplo:

    /wp-admin/admin-ajax.php
    /tienda/notificacion-pago.php
    /api/webhook
    
  2. Pulse Save para aplicar los cambios.

Resultado en Apache

Las URLs configuradas se añaden como condiciones adicionales en las reglas de reescritura. Cada URL excluida genera una línea RewriteCond que permite el acceso POST a esa ruta independientemente de la IP de origen:

# Core-Admin limit_post_to_ips directive
RewriteEngine On
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.10$
RewriteCond %{REMOTE_ADDR} !^198\.51\.100\.
RewriteCond %{REQUEST_URI} !/wp\-admin/admin\-ajax\.php$ [NC]
RewriteCond %{REQUEST_URI} !/tienda/notificacion\-pago\.php$ [NC]
RewriteCond %{REQUEST_URI} !/api/webhook$ [NC]
RewriteRule .* - [F]

La lógica es: denegar el POST solo si la IP no está autorizada y la URL no está en la lista de excepciones. Es decir, todas las condiciones RewriteCond deben cumplirse (operador AND) para que se aplique la denegación. Si la URL coincide con alguna excepción, esa condición no se cumple y la petición pasa.

Nota: La comparación de URLs es case-insensitive (flag [NC]), por lo que /API/Webhook y /api/webhook se tratan como equivalentes.

Ejemplo completo

Supongamos que tiene una tienda online en tienda.ejemplo.com y quiere:

  • Permitir POST solo desde la IP de su oficina (203.0.113.50) y la red de su proveedor (198.51.100.0/24).
  • Pero permitir que la pasarela de pago envíe notificaciones POST a /pago/callback.php desde cualquier IP.
  • Y que el formulario de contacto en /contacto.php también sea accesible públicamente.

Configuración de limit_post_to_ips:

203.0.113.50, 198.51.100.0/24

Configuración de skip_limit_post_to_ips_urls:

/pago/callback.php
/contacto.php

Con esta configuración:

Petición IP origen Resultado
POST /wp-admin/ 203.0.113.50 (oficina) Permitido
POST /wp-admin/ 45.67.89.10 (externa) Denegado (403)
POST /pago/callback.php 45.67.89.10 (externa) Permitido (URL excluida)
POST /contacto.php 1.2.3.4 (cualquiera) Permitido (URL excluida)
GET /cualquier-pagina 1.2.3.4 (cualquiera) Permitido (solo afecta a POST)

Consideraciones importantes

  • Solo afecta a POST: Las peticiones GET, HEAD y otros métodos HTTP no se ven afectadas por esta restricción. Los visitantes pueden seguir navegando por la web con normalidad.

  • Reinicio de Apache: Al guardar cualquiera de estas opciones, Core-Admin regenera la configuración del VirtualHost y reinicia Apache. Si desea hacer varios cambios seguidos, puede marcar la casilla Skip service restart para evitar reinicios intermedios y reiniciar manualmente al terminar.

  • Orden de configuración: Configure primero limit_post_to_ips y después skip_limit_post_to_ips_urls. Si limit_post_to_ips está vacío, no se genera ninguna restricción y skip_limit_post_to_ips_urls no tiene efecto.

  • Validación automática: Core-Admin valida las IPs y redes introducidas, eliminando duplicados y normalizando el formato. Las URLs se validan comprobando que comiencen con /.