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
-
Acceda a Webhosting Management y seleccione el hosting que desea proteger.
-
Pulse en la pestaña Options del hosting.
-
Localice la opción limit_post_to_ips en la lista y pulse sobre ella para editarla.
-
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
- 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 conmod_remoteip,REMOTE_ADDRcontendrá 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
-
Acceda a las Options del hosting (mismo panel donde configuró
limit_post_to_ips). -
Localice la opción skip_limit_post_to_ips_urls y pulse sobre ella para editarla.
-
Introduzca las rutas URL que desea excluir de la restricción. Por ejemplo:
/wp-admin/admin-ajax.php /tienda/notificacion-pago.php /api/webhook -
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/Webhooky/api/webhookse 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.phpdesde cualquier IP. - Y que el formulario de contacto en
/contacto.phptambié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_ipsy despuésskip_limit_post_to_ips_urls. Silimit_post_to_ipsestá vacío, no se genera ninguna restricción yskip_limit_post_to_ips_urlsno 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
/.