Introducción
Hola y bienvenido a este tutorial sobre cómo proteger tu sitio web con Cloudflare. Explica cómo alojar un sitio web en un servidor, cómo protegerlo con la excelente protección L7 gratuita de Cloudflare, manteniendo la seguridad, y cómo bloquear los puertos del servidor para que un atacante no pueda eludir Cloudflare y atacar el servidor directamente.
Acerca de Cloudflare
Antes de empezar, una pequeña nota sobre Cloudflare y sus características:
- Cloudflare es una de las redes más grandes del mundo. Hoy en día, empresas, organizaciones sin fines de lucro, blogueros y cualquier persona con presencia en internet presumen de sitios web y aplicaciones más rápidos y seguros. Están protegidos contra ataques DDoS y sus servidores backend están protegidos contra atacantes. Cloudflare también ofrece un conjunto de servicios de seguridad que protegen los sitios web de ataques como inyección SQL, XSS y DDoS.
- Cloudflare impulsa las solicitudes de Internet de millones de sitios web y atiende un promedio de 55 millones de solicitudes HTTP por segundo.
- Cloudflare ha implementado numerosas mejoras en la seguridad y el rendimiento de internet. Es una excelente herramienta para que los propietarios de sitios web puedan protegerlos de ataques y mejorar su rendimiento. Lo mejor es que es gratuito.
- A medida que aumenta su tráfico, siempre puede actualizar a un plan pago para obtener más funciones y un mejor rendimiento.
Requisitos previos
- Un nombre de dominio
- Una cuenta de Cloudflare con un dominio agregado
- Un servidor que ejecuta Debian 12
- Un sitio web para la protección
Paso 1: Actualice el servidor e instale NGINX
En primer lugar, necesitamos actualizar el servidor, luego debemos agregar el repositorio NGINX e instalar NGINX.
apt update && apt upgrade -y
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y
# Add the signing key for the nginx packages
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
# Add the NGINX repository
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# Pin down the NGINX repository to avoid conflicts with the default Debian repository
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
apt update
# Install NGINX
apt install nginx -yPaso 2 – Configuración del sitio web
Configurar NGINX para servir un sitio web está más allá del alcance de este tutorial, pero usaremos la configuración predeterminada para este tutorial y protegeremos el servidor con Cloudflare.
Debes tener un certificado de origen de Cloudflare Crearlo y listarlo /etc/nginx/ssl, eso es cf.crt y tecla cf. Ponlo.
Puede crear un certificado de origen en el panel de Cloudflare seleccionando su dominio y yendo a SSL/TLS » Servidor de origen » Crear certificado.
Puede adaptar la siguiente configuración (por ejemplo, /etc/nginx/sites-available/default) a las necesidades de su sitio web.
server {
listen 443 ssl;
server_name <example.com>;
access_log /var/log/nginx/host.access.log main;
ssl_certificate /etc/nginx/ssl/cf.crt;
ssl_certificate_key /etc/nginx/ssl/cf.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}Paso 2.1 – Recargar NGINX
En este punto, recargamos NGINX para aplicar los cambios y apuntar el dominio al servidor.
systemctl reload nginx
Una vez recargado NGINX, puede apuntar el dominio al servidor añadiendo un registro A en el panel de control de Cloudflare. Asegúrese de que el estado del proxy esté configurado como "Proxy" para habilitar la protección L7 de Cloudflare; de lo contrario, el servidor quedará expuesto a internet.
Paso 3 – 60% del camino recorrido
Ya hemos completado el 60 % del proceso. El sitio web ya está protegido por la protección L7 de Cloudflare, pero el servidor sigue expuesto a internet y un atacante puede eludir Cloudflare y atacarlo directamente.
En los próximos pasos, bloquearemos los puertos del servidor y solo permitiremos que los rangos de IP de Cloudflare accedan al servidor.
Podemos usar iptables para lograr esto, pero iremos un paso más allá y usaremos Hetzner Cloud Firewall para bloquear los puertos del servidor.
Paso 4: Configuración del firewall en la nube de Hetzner
En este paso, configuraremos Hetzner Cloud Firewall para bloquear los puertos del servidor y solo permitir que los rangos de IP de Cloudflare accedan al servidor.
Puede hacerlo a través de la consola de Hetzner Cloud, seleccionando su proyecto y haciendo clic en la pestaña "Firewalls". Sin embargo, los rangos de IP de Cloudflare son dinámicos y pueden cambiar con el tiempo. Por ello, utilizaremos la API de Hetzner Cloud para automatizar este proceso.
Primero, debes hacer algunas cosas en la consola en la nube de Hetzner:
- Genere un token de API. Para ello, vaya a "Seguridad" « "Tokens de API" y haga clic en "Generar token de API". Asegúrese de otorgarle permisos de lectura y escritura.
- Anote el ID del firewall. Puede encontrarlo en la URL cuando esté en la página del firewall:
- Asegúrese de que se aplique un firewall en el servidor, de lo contrario es inútil.
De vuelta en su servidor, guarde el siguiente script en un archivo, por ejemplo, firewall.py. Este script incluirá en la lista blanca el rango de IP de Cloudflare en el firewall de la nube de Hetzner.
Nota: El siguiente script sobrescribirá cualquier regla de firewall existente que haya especificado, así que asegúrese de que su firewall no contenga otras reglas importantes. Si las contiene, puede agregarlas al script, como abrir un puerto SSH.
import requests
import json
HETZNER_API_TOKEN = "YOUR_HETZNER_API_TOKEN"
HETZNER_FIREWALL_ID = "YOUR_HETZNER_FIREWALL_ID"
def get_cloudflare_ips():
response = requests.get('https://www.cloudflare.com/ips-v4')
if response.status_code == 200:
return response.text.strip().split('\n')
else:
print("Failed to retrieve Cloudflare IP ranges")
return []
def whitelist_ips_in_hetzner(ip_ranges):
headers = {
'Authorization': f'Bearer {HETZNER_API_TOKEN}',
'Content-Type': 'application/json',
}
payload = {
"rules": [
{
"direction": "in",
"source_ips": ip_ranges,
"port": "443",
"protocol": "tcp",
"description": "Accept port 443"
},
#{
# "direction": "in",
# "source_ips": ["0.0.0.0/0","::/0"],
# "port": "22",
# "protocol": "tcp",
# "description": "Accept SSH connections"
#}
]
}
response = requests.post(f'https://api.hetzner.cloud/v1/firewalls/{HETZNER_FIREWALL_ID}/actions/set_rules', headers=headers, data=json.dumps(payload))
if 200 <= response.status_code < 203:
print("IPs whitelisted successfully in Hetzner Firewall")
else:
print("Failed to whitelist IPs in Hetzner Firewall", response.json())
if __name__ == "__main__":
cloudflare_ips = get_cloudflare_ips()
whitelist_ips_in_hetzner(cloudflare_ips)Paso 5 – Ejecutar y automatizar el script
- Instalar Python
Para ejecutar el script, necesita instalar Python en el servidor. Si aún no tiene Python instalado, puede instalarlo ejecutando:
apt install python3 -y
- Ejecute el script.
Una vez que tengas Python instalado, puedes ejecutar el script con:
python3 firewall.py
Debes esperar un mensaje como "IPs incluidas correctamente en la lista blanca del firewall de Hetzner". De lo contrario, puedes revisar el mensaje de error y solucionar el problema.
- Automatizar
Una vez que el script se haya ejecutado correctamente, puede automatizarlo agregándolo a un trabajo cron, de modo que el script se ejecute cada 24 horas y actualice Hetzner Cloud Firewall con el rango de IP de Cloudflare.
Puede agregar un trabajo cron ejecutando crontab -e y agregando la siguiente línea al archivo.
* 0 * * * /usr/bin/python3 /path/to/firewall.py
Paso 6: Reforzar la protección del lado de Cloudflare
Inicie sesión en su panel de Cloudflare.
- Vaya a la pestaña “SSL/TLS”
Para garantizar que el sitio web siempre se sirva a través de HTTPS y que la comunicación entre Cloudflare y el servidor esté cifrada y sea segura:
- Habilitar "Usar siempre HTTPS" – Habilitar "Reescritura automática de HTTPS" – Establecer el modo de cifrado SSL/TLS en "Completo (Fuerte)".
Vaya a la pestaña “Seguridad”
Para garantizar que el sitio web esté protegido contra bots, enlaces directos y otros ataques:
- Habilitar “Comprobación de integridad del navegador” – Habilitar “Protección de enlace directo” – Habilitar “Modo de lucha contra bots”
Tenga en cuenta que esta no es una solución única y que siempre debe estar atento a su panel de Cloudflare y cambiar la configuración según las necesidades de su sitio web.
- También puedes habilitar la «Limitación de velocidad» para proteger aún más tu sitio web de ataques y, afortunadamente, Cloudflare ofrece un nivel gratuito para esta función (incluida una regla).
- También puede utilizar la función de almacenamiento en caché de Cloudflare para almacenar en caché el contenido estático del sitio web y reducir la carga del servidor.
Y una vez más, debes monitorear el tráfico y cambiar la configuración según las necesidades de tu sitio web.
También existe este script: https://github.com/guided-hacking/cfautouam
Puedes usar este script para activar automáticamente Cloudflare en modo de ataque cuando el servidor utiliza demasiada CPU o RAM. Esto puede ser útil para proteger el servidor de ataques, pero queda fuera del alcance de este tutorial.
Resultado
En este tutorial, aprendiste a proteger un sitio web con la protección L7 de Cloudflare, protegiendo el servidor y el sitio web de ataques sin exponer los puertos a internet. También automatizaste la actualización del firewall en la nube de Hetzner con el rango de IP de Cloudflare, reforzando la protección en el lado de Cloudflare.










