Sufrir ataques DDoS puede parecer un daño colateral inevitable al publicar servicios a internet y cuanto más notable sea un sitio o servicio, más probable es que sea el objetivo de un ataque en algún momento. Este problema afecta a millones de servicios en todo el mundo cada año y el número de ataques en aumento es exponencial. Por ese motivo, en Clouding ofrecemos por defecto un Anti-DDoS flexible y un Filtrado Anti-DDoS Estricto configurable.
Actualmente un ataque de denegación de servicio es bastante fácil de realizar y no requiere de mucho conocimiento, cada día hay más herramientas para realizarlo de forma sencilla. Aunque también es posible reducir las posibilidades de que un ataque DDoS afecte a un sitio Web o servicio, con una configuración adecuada y añadiendo protección. En particular, un servidor Web necesitará alguna mitigación DDoS dedicada mediante un proxy y sobre todo porque normalmente el tráfico es encriptado (HTTPS).
Nuestra recomendación es utilizar Cloudflare para un sitio Web, ofrecen una mitigación de ataques DDoS ilimitada para mantener el rendimiento y la disponibilidad. Adicionalmente, se explicará cómo configurar un bloqueo para permitir exclusivamente el acceso por Cloudflare al servidor Web. Primero, tendrás que configurar todos los dominios en Cloudflare del servidor y en modo Proxy (salvo los registros para el funcionamiento del correo electrónico).
Cómo configurar el servidor Web para Cloudflare
Cuando el tráfico de un sitio web se enruta a través de la red de Cloudflare, actúa como un proxy inverso. Como resultado, al responder las solicitudes y registrarlas, el servidor de origen devuelve una dirección IP de Cloudflare. Por lo tanto, será necesario configurar en el servidor Web para que obtenga la IP real del visitante utilizando el encabezado CF-Connecting-IP.
Nuestra recomendación es utilizar systemd para automatizar la introducción de las direcciones IP de Cloudflare, así si añaden una adicional el servicio actualizará la configurará para NGINX. Para ello deberás un servicio y un temporizador para restablecer la dirección IP real de los visitantes para NGINX de forma automática.
Primero necesitarás crear un archivo de servicio para systemd, puedes hacerlo con un editor de texto como nano o vim. Por ejemplo, puedes ejecutar lo siguiente para crearlo y editarlo con nano:
# nano /etc/systemd/system/cloudflare-ip-reset.service
El contenido deberá ser el siguiente:
[Unit]
Description=Cloudflare IP reset service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cloudflare-ip-reset
[Install]
WantedBy=multi-user.target
En este archivo, estamos especificando que el servicio se llama "Cloudflare IP reset service" y que se iniciará una vez con el comando /usr/local/bin/cloudflare-ip-reset. También se esta indicando que el servicio debe estar disponible cuando se alcance el objetivo "multi-user.target".
Posteriormente, asegúrate que en la configuración de NGINX tenga incluido el directorio conf.d:
# grep -Ri include /etc/nginx/nginx.conf
En caso afirmativo, crea un archivo para indicar el encabezado y almacenar las direcciones IP de Cloudflare:
# touch /etc/nginx/conf.d/cloudflare.conf
Una vez que hayas creado este archivo, necesitarás crear un script que se ejecutará cuando se inicie el servicio:
# nano /usr/local/bin/cloudflare-ip-reset
Este script debe realizar la tarea de restablecer la dirección IP real de los visitantes de Cloudflare para NGINX. Puedes hacerlo con un lenguaje de programación como Python o Bash. Por ejemplo, aquí hay un posible script en Bash que podría hacerlo:
#!/bin/bash
# Ruta del archivo de configuración para Cloudflare
CLOUDFLARE_RUTA=/etc/nginx/conf.d/cloudflare.conf
# Limpiar y añadir comentario en el archivo
echo "# Configuración para Cloudflare" > $CLOUDFLARE_RUTA;
# Añadir direcciones IPv4 de Cloudflare
echo "" >> $CLOUDFLARE_RUTA;
echo "# - IPv4" >> $CLOUDFLARE_RUTA;
for i in `curl -s -L https://www.cloudflare.com/ips-v4`; do
echo "set_real_ip_from $i;" >> $CLOUDFLARE_RUTA;
done
# Añadir direcciones IPv6 de Cloudflare
echo "" >> $CLOUDFLARE_RUTA;
echo "# - IPv6" >> $CLOUDFLARE_RUTA;
for i in `curl -s -L https://www.cloudflare.com/ips-v6`; do
echo "set_real_ip_from $i;" >> $CLOUDFLARE_RUTA;
done
# Configurar encabezado de Cloudflare
echo "" >> $CLOUDFLARE_RUTA;
echo "real_ip_header CF-Connecting-IP;" >> $CLOUDFLARE_RUTA;
# Recargar configuración de NGINX
nginx -s reload
En este script, primero se obtiene la dirección IP real de los visitantes de Cloudflare para NGINX del archivo de configuración de NGINX. Luego, se obtiene la nueva dirección IP real de los visitantes de Cloudflare desde la página web de Cloudflare. Si la dirección IP real ha cambiado, se actualiza el archivo de configuración de NGINX y se recarga el servicio de NGINX.
Una vez que hayas creado el script, debes asegurarte de que tenga permisos de ejecución:
# chmod 700 /usr/local/bin/cloudflare-ip-reset
Y luego puedes probarlo manualmente ejecutando el comando:
# systemctl start cloudflare-ip-reset && journalctl --unit=cloudflare-ip-reset --no-pager
Para configurar un temporizador para que el servicio se ejecute periódicamente, necesitarás crear un archivo de temporizador para systemd. Puedes hacerlo con un editor de texto como nano o vim. Por ejemplo, puedes crear un archivo llamado "cloudflare-ip-reset.timer" en /etc/systemd/system:
# nano /etc/systemd/system/cloudflare-ip-reset.timer
Con el siguiente contenido:
[Unit]
Description=Cloudflare IP reset timer
[Timer]
OnBootSec=10min
OnUnitActiveSec=24h
[Install]
WantedBy=multi-user.target
En este archivo, estamos especificando que el temporizador se llama "Cloudflare IP reset timer" y que se iniciará 10 minutos después de que se inicie el sistema. También estamos indicando que el temporizador se activará cada veinticuatro horas después de que se inicie. También estamos indicando que el temporizador debe estar disponible cuando se alcance el objetivo "multi-user.target".
Una vez que hayas creado este archivo, debes enlazarlo con el servicio que acabas de crear. Puedes hacerlo ejecutando el comando:
# systemctl enable --now cloudflare-ip-reset.timer
Este comando habilitará el temporizador y también lo iniciará inmediatamente.
A partir de ese momento, el servicio se ejecutará automáticamente cada 24 horas y restablecerá la dirección IP real de los visitantes de Cloudflare para NGINX si ha cambiado. Puedes verificar el estado del temporizador y el servicio ejecutando el comando:
# systemctl status cloudflare-ip-reset.timer
Cloudflare ya no actualiza ni admite mod_cloudflare. Sin embargo, si utilizas un servidor web Apache, pero puedes utilizar módulo oficial mod_remoteip de Apache para registrar la dirección IP original de tu visitante.
Para activar el módulo mod_remoteip en tu servidor web Apache ejecuta lo siguiente:
# a2enmod remoteip
Posteriormente deberás actualizar la configuración del servidor para la entrada LogFormat combinada en apache.conf o de los sites, sustituyendo %h por %a para que los logs aparezca la dirección real:
# nano /etc/apache2/apache2.conf
Por ejemplo, si tu entrada LogFormat actual tuviera la forma siguiente:
LogFormat "%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined
Debes actualizar el LogFormat como se muestra a continuación:
LogFormat "%a %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined
Nuestra recomendación es utilizar systemd para automatizar la introducción de las direcciones IP de Cloudflare, así si añaden una adicional el servicio actualizará la configurará para Apache. Para ello deberás un servicio y un temporizador para restablecer la dirección IP real de los visitantes para Apache de forma automática.
Primero necesitarás crear un archivo de servicio para systemd, puedes hacerlo con un editor de texto como nano o vim. Por ejemplo, puedes ejecutar lo siguiente para crearlo y editarlo con nano:
# nano /etc/systemd/system/cloudflare-ip-reset.service
El contenido deberá ser el siguiente:
[Unit]
Description=Cloudflare IP reset service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cloudflare-ip-reset
[Install]
WantedBy=multi-user.target
En este archivo, estamos especificando que el servicio se llama "Cloudflare IP reset service" y que se iniciará una vez con el comando /usr/local/bin/cloudflare-ip-reset. También se esta indicando que el servicio debe estar disponible cuando se alcance el objetivo "multi-user.target".
Crea un archivo de configuración para indicar el encabezado y almacenar las direcciones IP de Cloudflare:
# touch /etc/apache2/conf-available/remoteipcloudflare.conf
Una vez que hayas creado este archivo, necesitarás crear un script que se ejecutará cuando se inicie el servicio:
# nano /usr/local/bin/cloudflare-ip-reset
Este script debe realizar la tarea de restablecer la dirección IP real de los visitantes de Cloudflare para Apache. Puedes hacerlo con un lenguaje de programación como Python o Bash. Por ejemplo, aquí hay un posible script en Bash que podría hacerlo:
#!/bin/bash
# Ruta del archivo de configuración para Cloudflare
CLOUDFLARE_RUTA=/etc/apache2/conf-available/remoteipcloudflare.conf
# Limpiar y añadir comentario en el archivo
echo "# Configuración para Cloudflare" > $CLOUDFLARE_RUTA;
# Configurar encabezado de Cloudflare
echo "RemoteIPHeader CF-Connecting-IP > $CLOUDFLARE_RUTA;
# Añadir direcciones IPv4 de Cloudflare
echo "" >> $CLOUDFLARE_RUTA;
echo "# - IPv4" >> $CLOUDFLARE_RUTA;
for i in `curl -s -L https://www.cloudflare.com/ips-v4`; do
echo "RemoteIPTrustedProxy $i;" >> $CLOUDFLARE_RUTA;
done
# Añadir direcciones IPv6 de Cloudflare
echo "" >> $CLOUDFLARE_RUTA;
echo "# - IPv6" >> $CLOUDFLARE_RUTA;
for i in `curl -s -L https://www.cloudflare.com/ips-v6`; do
echo "RemoteIPTrustedProxy $i" >> $CLOUDFLARE_RUTA;
done
# Recargar configuración de Apache
systemctl restart apache2
En este script, primero se obtiene la dirección IP real de los visitantes de Cloudflare para NGINX del archivo de configuración de Apache. Luego, se obtiene la nueva dirección IP real de los visitantes de Cloudflare desde la página web de Cloudflare. Si la dirección IP real ha cambiado, se actualiza el archivo de configuración de Apache y se recarga el servicio.
Una vez que hayas creado el script, debes asegurarte de que tenga permisos de ejecución y luego puedes probarlo manualmente ejecutando el comando:
# systemctl start cloudflare-ip-reset && journalctl --unit=cloudflare-ip-reset --no-pager
Para configurar un temporizador para que el servicio se ejecute periódicamente, necesitarás crear un archivo de temporizador para systemd. Puedes hacerlo con un editor de texto como nano o vim. Por ejemplo, puedes crear un archivo llamado "cloudflare-ip-reset.timer" en /etc/systemd/system con el siguiente contenido:
[Unit]
Description=Cloudflare IP reset timer
[Timer]
OnBootSec=10min
OnUnitActiveSec=24h
[Install]
WantedBy=multi-user.target
En este archivo, estamos especificando que el temporizador se llama "Cloudflare IP reset timer" y que se iniciará 10 minutos después de que se inicie el sistema. También estamos indicando que el temporizador se activará cada veinticuatro horas después de que se inicie. También estamos indicando que el temporizador debe estar disponible cuando se alcance el objetivo "multi-user.target".
Una vez que hayas creado este archivo, debes enlazarlo con el servicio que acabas de crear. Puedes hacerlo ejecutando el comando:
# systemctl enable --now cloudflare-ip-reset.timer
Este comando habilitará el temporizador y también lo iniciará inmediatamente.
A partir de ese momento, el servicio se ejecutará automáticamente cada 24 horas y restablecerá la dirección IP real de los visitantes de Cloudflare para Apache si ha cambiado. Puedes verificar el estado del temporizador y el servicio ejecutando el comando:
# systemctl status cloudflare-ip-reset.timer
Posteriormente activa la configuración de Apache:
# a2enconf remoteipcloudflare
Por último, prueba la configuración de Apache:
# apache2ctl configtest
Y en caso de obtener "Syntax OK" reinicia Apache
# systemctl restart apache2
Para obtener más información sobre mod_remoteip, consulta la documentación del módulo de Apache.
En un Plesk con NGINX, puedes utilizar el propio script que proporcionan en página de soporte:
# curl -L -so /root/cf.sh https://plesk.zendesk.com/hc/article_attachments/4406613093138/cf.sh && chmod 700 /root/cf.sh && sh /root/cf.sh
Aunque recuerda añadir un trabajo programado o crear un servicio para que se ejecute periódicamente para actualizar las direcciones IP de Cloudflare.
En caso de utilizar exclusivamente Apache en Plesk o buscar una configuración para únicamente un dominio, en el siguiente artículo del soporte oficial de Plesk tienes más información: Incorrect IP addresses are logged by Plesk behind a Cloudflare or Google Cloud Load Balancing
La configuración de cPanel al utilizar Apache/httpd, es bastante parecida a una configuración de Apache de una distribución Linux. En el siguiente artículo del soporte oficial de cPanel tienes más información: Restoring visitors IP with mod_remoteip
Aunque recuerda realizar una actualización de las direcciones IP de Cloudflare en la configuración, puedes revisar la pestaña de la configuración de Apache para tener un ejemplo con systemd.
La configuración de LiteSpeed para restaurar las IP reales de los visitantes, puedes utilizar la Consola de OpenLiteSpeed o LiteSpeed WebAdmin dentro del apartado Configuración del servidor y Configuración general. Deberás establecer "Usar IP del cliente" en el encabezado como "Sólo IP de confianza" y añade las IPs/Subredes de CloudFlare a la lista de confianza. En el siguiente artículo oficial de OpenLiteSpeed tienes más información: Show Real Visitor IP Instead of CloudFlare IPs.
Aunque recuerda actualizar de forma periódica las direcciones de Cloudflare, puedes utilizar un trabajo programado o un servicio de systemd cómo en la configuración de la pestaña Apache.
Desde IIS 8.5 en adelante, el registro personalizado es una opción incorporada. Consulta el Registro Mejorado de IIS.
- En el Administrador de IIS, haz doble clic en Registro en el menú Acciones del sitio en el que estás trabajando.
- Una vez que se abra esto, selecciona W3C como el formato y luego haz clic en Seleccionar Campos junto al menú desplegable de formato en la subsección Archivo de registro.
- Haz clic en Agregar Campo y añade el encabezado CF-Connecting-IP.
- Haz clic en Aceptar. Deberías ver tu nueva entrada reflejada bajo Campos Personalizados. Haz clic en Aplicar cuando estés de vuelta en la ventana de Registro.
- Si esto es exitoso, el archivo de registro ahora debería tener un guión bajo: También deberías ver el cambio en los campos:
- Reinicia el sitio, luego W3SVC, y luego la instancia completa si el cambio no se refleja de inmediato. Cuando se utiliza el registro mejorado en IIS 8.5+, no restaura la IP original del visitante a nivel de la aplicación.
En caso de no aparecer tu servidor Web en el artículo, puedes consultar directamente la configuración en página oficial de Cloudflare en Cómo restablecer las IP originales del visitante.
Cómo permitir únicamente Cloudflare (Linux)
Para permitir únicamente el acceso Web a Cloudflare y bloquear los posibles ataques DDoS directos, puedes utilizar un servicio y un temporizador de systemd. De esta forma, se actualizarán las reglas de iptables automáticamente para permitir las presentes y futuras direcciones IP de Cloudflare y bloquear el resto de tráfico Web.
Recomendación
Recomendamos filtrar las direcciones IP de Cloudflare directamente con el perfil de Firewall de Clouding del servidor, en vez de utilizar reglas iptables cómo explica a continuación. Así el servidor no tendrá que procesar los paquetes y no repercutirá en su tiempo de respuesta.
Primero, crea un archivo de servicio con un editor. Por ejemplo, con el editor nano:
# nano /etc/systemd/system/cloudflare-iptables.service
Añade el siguiente contenido en él:
[Unit]
Description=Cloudflare IPTables Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cloudflare-iptables
[Install]
WantedBy=multi-user.target
A continuación, guarda los cambios y crea otro archivo para script del servicio:
# nano /usr/local/bin/cloudflare-iptables
Con el siguiente contenido:
#!/bin/bash
# https://www.cloudflare.com/ips
# https://developers.cloudflare.com/fundamentals/get-started/setup/allow-cloudflare-ip-addresses/
iptables -F INPUT
ip6tables -F INPUT
# Obtener la lista de direcciones IP de Cloudflare y permitir únicamente las direcciones IP de Cloudflare en la regla de filtrado de entrada de iptables
for i in $(curl -s https://www.cloudflare.com/ips-v4); do iptables -I INPUT -p tcp -m multiport --dports http,https -s $i -j ACCEPT; done
for i in $(curl -s https://www.cloudflare.com/ips-v6); do ip6tables -I INPUT -p tcp -m multiport --dports http,https -s $i -j ACCEPT; done # Bloquear todo el tráfico web no permitido
# ADVERTENCIA: Si recibes un ataque y CloudFlare te da de baja, tu(s) sitio(s) será(n) inaccesible(s).
iptables -A INPUT -p tcp -m multiport --dports http,https -j DROP
ip6tables -A INPUT -p tcp -m multiport --dports http,https -j DROP
Asegúrate de que el archivo de script tenga permisos de ejecución utilizando el comando:
# chmod +x /usr/local/bin/cloudflare-iptables
Luego inicia y habilita el servicio utilizando el comando:
# systemctl start cloudflare-iptables.service && systemctl enable cloudflare-iptables.service
Finalmente, crea un archivo para el temporizador:
# nano /etc/systemd/system/cloudflare-iptables.timer
Con el siguiente contenido:
[Unit]
Description=Cloudflare IPTables Timer
[Timer]
OnCalendar=daily
[Install]
WantedBy=timers.target
Por último, inicia y habilita el temporizador utilizando el comando:
# systemctl start cloudflare-iptables.timer && systemctl enable cloudflare-iptables.timer
Puedes listar los timers para ver la próxima ejecución:
# systemctl list-timers --all
Para verificar el funcionamiento de los servicio, puedes ejecutar el siguiente comando:
# service cloudflare-iptables start && journalctl --unit=cloudflare-iptables --no-pager
Con esta configuración, el servicio se ejecutará diariamente para actualizar la regla de filtrado de entrada de iptables y permitir únicamente las direcciones IP de Cloudflare, bloqueando el resto del tráfico web no permitido. Ten en cuenta que esto es solo un ejemplo y puede requerir modificaciones en función de la configuración específica del servidor y de las necesidades de seguridad.
Es importante tener cuidado al configurar iptables, ya que una configuración incorrecta puede afectar negativamente el rendimiento y la disponibilidad del sitio o servicio Web. Además, es importante recordar que esta configuración solo protege contra ataques DDoS utilizando el filtrado de Cloudflare, por lo que es importante implementar medidas adicionales de seguridad para protegerse contra otros tipos de ataques cibernéticos.
Cómo listar las direcciones con más accesos:
Adicionalmente, un comando puede interesarte o serte de utilidad es el siguiente:
# cat /var/www/vhosts/*/logs/access_ssl_log | awk '{print $1}' | sort | uniq -c | sort -rn | head
Puedes utilizarlo para revisar si hay algun cliente con múltiples intentos de acceso, normalmente en la realización de DDoS se utiliza una misma dirección para varias conexiones y puedes utilizarlo para añadir un bloqueo a dichas direcciones. También puedes utilizarlo cómo ejemplo para cualquier otro servidor Web adaptándolo.
Recuerda, si tienes consultas sobre esta u otra cuestión relacionada con tus servidores en Clouding, no dudes en escribir a soporte@clouding.io ¡Estamos a tu lado para lo que necesites, consúltanos!