Una de las primeras cosas que te indican en Cloudflare al configurar tu web para usar su DNS es que bloquees explícitamente todo el tráfico que no provenga de direcciones IP de Cloudflare. Así vas a evitar que la IP de tu servidor quede al descubierto (evitas ataques).
Eso es lo que te voy a contar en esta entrada usando Firewalld en tu servidor. En mi caso, es el cortafuegos que viene por defecto cuando instalas Virtualmin (junto con Fail2ban. Configúralo, merece la pena). Lo voy a instalar todo en Rocky Linux 9 con Apache.
¿Cuáles son las IP de Cloudflare?
Es lo primero que tenemos que saber. Las puedes consultar en este link: https://www.cloudflare.com/es-es/ips/. No cambian mucho, pero hay que estar atento por si lo hacen. Mucha gente actualiza su firewall con las IP que van cambiando con un script automático. Yo prefiero hacerlo de forma manual, pero tengo un script en el cron de Rocky Linux para que me mande un correo si se produce un cambio de IPs.

He creado un archivo llamado cloudflarecheck.sh (puedes ponerlo en la ruta que quieras; yo lo he puesto en /root) con el siguiente contenido (pon tu e-mail):
#!/bin/bash
# Crear carpeta si no existe
mkdir -p /root/cloudflare
# Descargar IPs actuales de Cloudflare a temporales
curl -s https://www.cloudflare.com/ips-v4 -o /root/cloudflare/ips-v4-new.txt
curl -s https://www.cloudflare.com/ips-v6 -o /root/cloudflare/ips-v6-new.txt
# Comparar con los archivos antiguos
CHANGED=false
if ! cmp -s /root/cloudflare/ips-v4.txt /root/cloudflare/ips-v4-new.txt; then
CHANGED=true
fi
if ! cmp -s /root/cloudflare/ips-v6.txt /root/cloudflare/ips-v6-new.txt; then
CHANGED=true
fi
# Si hubo cambios, enviar email y actualizar archivos
if [ "$CHANGED" = true ]; then
echo "Se detectaron cambios en las IPs de Cloudflare." | mail -s "Cambio de IPs Cloudflare detectado" tucorreo@dominio.com
mv /root/cloudflare/ips-v4-new.txt /root/cloudflare/ips-v4.txt
mv /root/cloudflare/ips-v6-new.txt /root/cloudflare/ips-v6.txt
echo "$(date) - Cambios detectados y notificación enviada." >> /root/cloudflare/cloudflare-check.log
fi
Le das permisos de ejecución:
chmod +x /root/cloudflare-check.sh
Y creas un cron en Linux (lo comprobará lunes y jueves a las 3 am):
crontab -e
#Ponemos lo siguiente
0 3 * * 1,4 /root/cloudflare-check.sh
Cuando haya un cambio de IP en Cloudflare, deberás añadir o quitar la nueva IP en tu firewall.
Ahora que ya sabemos cuáles son las IP de Cloudflare, debemos configurar Firewalld con ellas.
Firewalld: configuración de la IP de Cloudflare
Voy a suponer que tienes Firewalld instalado y activo (es opcional tener Fail2ban). También que tu tráfico pasa correctamente por Cloudflare (DNS apuntando a Cloudflare, proxy «nube naranja» activado). Si no, al bloquear la zona public, dejarás de ver tu sitio web. También tienes que tener activo en tu servidor Apache, mod_remoteip (o el equivalente en Nginx), que es el que se encarga de que puedas ver las IP de tus visitantes en vez de solo las de Cloudflare. Sigue mi tutorial para configurarlo: https://algoentremanos.com/configuracion-mod_remoteip-apache-cloudflare/. Por seguridad, deja una conexión SSH activa a tu servidor hasta comprobar que todo funciona bien.
1.-Comprobamos el estado actual de Firewalld y sus zonas activas
firewall-cmd --get-active-zones
firewall-cmd --zone=public --list-all
2.- Creamos una nueva zona llamada Cloudflare
firewall-cmd --permanent --new-zone=cloudflare
firewall-cmd --reload
3.- Añadimos a esa zona las IP de Cloudflare
#Creamos directorio y accedemos a él
mkdir -p /root/cloudflare
cd /root/cloudflare
#Descargamos el listado de IPs en el directorio anterior
curl -s https://www.cloudflare.com/ips-v4 > ips-v4.txt
curl -s https://www.cloudflare.com/ips-v6 > ips-v6.txt
Ahora añadimos las IPv4 e IPv6 a Firewalld:
while read -r ip; do
firewall-cmd --permanent --zone=cloudflare --add-source="$ip"
done < ips-v4.txt
while read -r ip; do
firewall-cmd --permanent --zone=cloudflare --add-source="$ip"
done < ips-v6.txt
Y reiniciamos el firewall:
firewall-cmd --reload
Revisamos que está todo bien:
firewall-cmd --zone=cloudflare --list-sources
4.- Permitimos las conexiones HTTP/HTTPS en la zona de Cloudflare.
firewall-cmd --permanent --zone=cloudflare --add-service=http
firewall-cmd --permanent --zone=cloudflare --add-service=https
firewall-cmd --reload
Hacemos esto para permitir el tráfico HTTP y HTTPS en nuestro servidor, pero solo a través de las IP de Cloudflare.
5.- Quitamos HTTP y HTTPS de la zona Public
- Recuerda: revisa que tienes todo bien configurado para no quedarte fuera de tu servidor. Abre una conexión SSH antes de hacer este paso, por si acaso. En el peor de los casos, los proveedores de hosting suelen ofrecer opciones extra desde su panel de configuración para poder acceder a tus servidores si te quedas bloqueado (Linode y Hetzner te lo permiten).
Probablemente tenías configurado HTTP y HTTPS en tu zona PUBLIC de Firewalld. Ha llegado el momento de quitarlas de allí (si antes has comprobado que todo está correcto) y así evitar que haya tráfico directo a la IP de nuestro servidor:
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --permanent --zone=public --remove-service=https
firewall-cmd --permanent --zone=public --remove-port=80/udp
firewall-cmd --permanent --zone=public --remove-port=443/udp
firewall-cmd --reload

Desde este momento, el tráfico HTTP y HTTPS está restringido solo a las IP de Cloudflare. Es decir, tus visitantes pasan primero por Cloudflare, y el tráfico es dirigido directamente a tu servidor. En ningún momento la IP de tu servidor está expuesta.

En tu zona PUBLIC solo deberías tener servicios de email, DNS, SSH o los puertos de Virtualmin/Webmin (si los usas). En la zona CLOUDFLARE solo deberías tener los servicios HTTPS y HTTPS en TCP y UDP. Y solo se permite la conexión a HTTPS y HTTP a las IP de Cloudflare.
¿Por qué funciona todo esto? Porque Firewalld aplica las reglas en este orden.
- Direct rules (reglas directas/nftables/iptables)
- Zonas por SOURCE IP (origen)
- Zonas por INTERFACE (interfaz)
- Default zone (zona por defecto)
Vamos, que se van a aplicar primero las reglas aplicadas a las IP de Cloudflare.
Ahora únicamente te falta comprobar que funciona. Desde la terminal de tu ordenador pon lo siguiente (debería fallar):
nc -vz ip_tu_servidor 443
Ahora prueba (debería funcionar):
curl https://tudominio.com
| Zona | Fuentes/IPs Permitidas | Servicios/Puertos Permitidos | Propósito / Descripción |
|---|---|---|---|
| cloudflare | Solo IPs oficiales de Cloudflare (IPv4 e IPv6 desde https://www.cloudflare.com/ips/). | • http (TCP 80) • https (TCP 443) • Los mismos puertos en UDP (80/udp, 443/udp). | Permite que el tráfico HTTP/HTTPS que provenga de los servidores de Cloudflare llegue a tu servidor web (Apache/Nginx). Oculta tu IP real. |
| public (zona por defecto) | Cualquier IP (o las específicas que configures para otros servicios). | • ssh (TCP 22, o el puerto personalizado) • smtp (TCP 25) • smtps (TCP 465) • imap, imaps, pop3, pop3s • dns (TCP/UDP 53) • Puertos personalizados (ej: 10000 para Webmin). | Aquí configuras el acceso a servicios NO web o de gestión que deben ser accesibles directamente, sin pasar por Cloudflare. HTTP y HTTPS se quitan de esta zona. |
drop o block (implícita) | Ninguna (o tráfico no coincidente). | Ninguno. | Todo el tráfico que no coincida con las reglas de las zonas cloudflare o public será bloqueado automáticamente por el orden de prioridad de Firewalld. |
Conclusión
En definitiva, lo que vas a conseguir es lo siguiente:
- Zona cloudflare: El tráfico web desde las IPs de Cloudflare es aceptado.
- Zona public: El tráfico a los puertos de email, SSH, DNS, etc., es aceptado.
- Zona por defecto (public): Cualquier otro tráfico (ej: HTTP/HTTPS directo a tu IP del servidor) es BLOQUEADO.
Esta configuración solo funciona si tu dominio está correctamente configurado en Cloudflare con el proxy (nube naranja) ACTIVADO. Si no, el tráfico de tus usuarios será bloqueado y nunca llegará a tu servidor. Tenlo en cuenta.
Puedes comprobar el estado final de tus zonas en Firewalld con:
# Ver estado de las zonas
sudo firewall-cmd --list-all-zones
# O ver cada zona por separado
sudo firewall-cmd --zone=cloudflare --list-all
sudo firewall-cmd --zone=public --list-all
Ahora tu servidor ya está un poco más seguro, y su IP más oculta detrás de Cloudflare (gracias a Firewalld).
Referencias: