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

  1. Ve a Zero Trust > Access > Applications
  2. Haz clic en Add an Application
  3. Selecciona Self-hosted
  4. Configura:
    • Application name: Panel de administración
    • Session Duration: 24 horas
    • Application domain: panel.tudominio.com
  5. 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.