Túneles de Cloudflare para Acceso Seguro al Servidor
Los túneles de Cloudflare (Cloudflare Tunnels) permiten exponer servicios de tu servidor a internet sin abrir puertos en el firewall ni revelar la IP pública del servidor. Con cloudflared instalado en tu VPS, el servidor establece una conexión saliente cifrada hacia Cloudflare, que enruta el tráfico entrante de forma segura. Esta guía cubre la instalación de cloudflared, la creación de túneles, la configuración de reglas de entrada y la integración con Zero Trust Access.
Requisitos Previos
- Servidor Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+)
- Cuenta de Cloudflare con un dominio activo y con proxy habilitado
- Acceso root o sudo en el servidor
- Dominio apuntando a Cloudflare (nameservers configurados)
Instalación de cloudflared
Ubuntu/Debian
# Añadir el repositorio de Cloudflare
curl -L --output cloudflared.deb \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
# Verificar la instalación
cloudflared --version
CentOS/Rocky Linux
# Descargar el paquete RPM
curl -L --output cloudflared.rpm \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
sudo rpm -ivh cloudflared.rpm
# Verificar
cloudflared --version
Instalación desde binario
# Descargar el binario directamente
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 \
-o /usr/local/bin/cloudflared
# Dar permisos de ejecución
chmod +x /usr/local/bin/cloudflared
cloudflared --version
Autenticación con Cloudflare
# Iniciar el proceso de autenticación
cloudflared tunnel login
Este comando mostrará una URL. Ábrela en el navegador, selecciona el dominio que quieres usar y autoriza la aplicación. Cloudflared guardará automáticamente el certificado en ~/.cloudflared/cert.pem.
# Verificar que la autenticación fue exitosa
ls -la ~/.cloudflared/
# Deberías ver: cert.pem
Creación de un Túnel
# Crear un nuevo túnel con nombre descriptivo
cloudflared tunnel create mi-servidor
# La salida mostrará el ID del túnel (guardar este valor)
# Created tunnel mi-servidor with id abc12345-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Listar los túneles creados
cloudflared tunnel list
# Ver los detalles de un túnel
cloudflared tunnel info mi-servidor
Estructura de archivos generada
# Cloudflared crea un archivo de credenciales JSON
ls ~/.cloudflared/
# cert.pem
# abc12345-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json (credenciales del túnel)
Configuración de Reglas de Entrada
Crea el archivo de configuración del túnel:
# Crear el archivo de configuración
mkdir -p ~/.cloudflared/
cat > ~/.cloudflared/config.yml << 'EOF'
tunnel: mi-servidor
credentials-file: /root/.cloudflared/abc12345-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
ingress:
# Enrutar el dominio principal al servidor web local
- hostname: tudominio.com
service: http://localhost:80
# Enrutar subdominio a una aplicación en otro puerto
- hostname: app.tudominio.com
service: http://localhost:3000
# Enrutar subdominio a un servicio HTTPS interno
- hostname: panel.tudominio.com
service: https://localhost:8443
originRequest:
noTLSVerify: true
# Regla por defecto: rechazar todo lo que no coincida
- service: http_status:404
EOF
Configurar los registros DNS en Cloudflare
# Crear los registros CNAME en Cloudflare apuntando al túnel
cloudflared tunnel route dns mi-servidor tudominio.com
cloudflared tunnel route dns mi-servidor app.tudominio.com
cloudflared tunnel route dns mi-servidor panel.tudominio.com
Esto crea automáticamente registros CNAME en Cloudflare que apuntan al túnel.
Verificar la configuración
# Validar el archivo de configuración
cloudflared tunnel ingress validate
# Probar qué regla se aplicaría para una URL
cloudflared tunnel ingress rule https://app.tudominio.com
Ejecutar el Túnel como Servicio
Para que el túnel se inicie automáticamente con el sistema, instálalo como servicio systemd:
# Instalar cloudflared como servicio del sistema
sudo cloudflared service install
# Iniciar el servicio
sudo systemctl start cloudflared
# Habilitar inicio automático
sudo systemctl enable cloudflared
# Verificar el estado
sudo systemctl status cloudflared
# Ver los logs en tiempo real
sudo journalctl -u cloudflared -f
Alternativa: configuración como otro usuario
# Si el archivo config.yml está en /etc/cloudflared/
sudo mkdir -p /etc/cloudflared/
sudo cp ~/.cloudflared/config.yml /etc/cloudflared/
sudo cp ~/.cloudflared/*.json /etc/cloudflared/
# Actualizar la ruta en config.yml
sudo sed -i 's|/root/.cloudflared/|/etc/cloudflared/|g' /etc/cloudflared/config.yml
# Instalar el servicio
sudo cloudflared --config /etc/cloudflared/config.yml service install
sudo systemctl start cloudflared
Acceso SSH a través del Túnel
Cloudflare Tunnels también puede enrutar tráfico SSH de forma segura.
Configuración en el servidor
# Añadir SSH a las reglas de ingress en config.yml
cat >> ~/.cloudflared/config.yml << 'EOF'
# Ruta SSH (añadir ANTES de la regla 404 por defecto)
- hostname: ssh.tudominio.com
service: ssh://localhost:22
EOF
# Recargar el servicio
sudo systemctl restart cloudflared
# Crear el registro DNS para SSH
cloudflared tunnel route dns mi-servidor ssh.tudominio.com
Configuración en el cliente (tu máquina local)
# Instalar cloudflared también en el cliente local
# En macOS: brew install cloudflare/cloudflare/cloudflared
# Configurar SSH para usar cloudflared como proxy
cat >> ~/.ssh/config << 'EOF'
Host ssh.tudominio.com
ProxyCommand cloudflared access ssh --hostname %h
User tu-usuario
IdentityFile ~/.ssh/id_rsa
EOF
# Conectar al servidor vía SSH a través del túnel
ssh ssh.tudominio.com
Políticas de Zero Trust Access
Cloudflare Zero Trust (anteriormente Cloudflare Access) permite añadir autenticación a cualquier servicio expuesto a través del túnel.
Configurar en el panel de Cloudflare
- Ve a Zero Trust > Access > Applications
- Haz clic en Add an Application
- Selecciona Self-hosted
- Configura:
- Application name: Panel de administración
- Session Duration: 24 horas
- Application domain:
panel.tudominio.com
- Crea una política de acceso:
- Policy name: Solo empleados
- Action: Allow
- Include: Email ends with
@tuempresa.com - O incluye usuarios específicos por email
Tipos de autenticación disponibles
- Email OTP (código de un solo uso enviado al email)
- Google Workspace
- GitHub
- Azure AD / Microsoft
- SAML genérico
- One-time PIN
Grupos de acceso
# Los grupos se configuran en Zero Trust > Access > Groups
# Ejemplo: grupo "Administradores" con emails específicos
# Luego se referencia en las políticas de aplicaciones
Solución de Problemas
El túnel no conecta
# Ver logs detallados
sudo journalctl -u cloudflared -n 50 --no-pager
# Ejecutar cloudflared manualmente para ver errores
cloudflared tunnel --config ~/.cloudflared/config.yml run
# Verificar conectividad a Cloudflare
curl -I https://cloudflare.com
Error: "No ingress rules match"
# Verificar las reglas de ingress
cloudflared tunnel ingress validate --config ~/.cloudflared/config.yml
El servicio no aparece en Cloudflare
# Verificar que el registro DNS se creó correctamente
cloudflared tunnel route dns mi-servidor tudominio.com
# Ver las rutas DNS del túnel
cloudflared tunnel route ip show
Actualizar cloudflared
# Actualizar a la última versión
sudo cloudflared update
sudo systemctl restart cloudflared
Error de certificado expirado
# Renovar el certificado de autenticación
cloudflared tunnel login
Conclusión
Los túneles de Cloudflare ofrecen una forma elegante y segura de exponer servicios de tu VPS sin abrir puertos en el firewall ni revelar la IP del servidor. La combinación de túneles con las políticas de Zero Trust Access crea una capa de seguridad robusta que protege paneles de administración, APIs internas y herramientas de desarrollo sin necesidad de una VPN tradicional.


