Cloudflare 5 min de lectura

Cloudflare Tunnel para el Homelab: Acceso Seguro Sin Abrir Puertos

Una guía práctica para configurar Cloudflare Tunnel (cloudflared) y exponer servicios auto-alojados a través del borde de Cloudflare — sin puertos abiertos en el firewall, sin IP estática, sin DNS Dinámico.

Abrir puertos en tu router doméstico para exponer servicios es riesgoso. Expone tu red local a todos los bots que escanean rangos de IP, y requiere mantener Dynamic DNS funcionando cuando tu ISP cambia tu dirección IP.

Cloudflare Tunnel (impulsado por cloudflared) resuelve ambos problemas. Tus servicios permanecen detrás de tu firewall, y Cloudflare proxy el tráfico de forma segura a través de una conexión solo de salida — sin necesidad de puertos de entrada abiertos.

Cómo Funciona

Navegador → Edge de Cloudflare → Tunnel (salida) → Tu Servidor → Servicio
  1. Instalas cloudflared en tu servidor
  2. cloudflared establece una conexión de salida al edge de Cloudflare
  3. Cloudflare proxy las solicitudes HTTPS entrantes a través de ese túnel
  4. Tu firewall solo necesita permitir tráfico de salida — sin reenvío de puertos, sin Dynamic DNS

La conexión está encriptada (QUIC o HTTP/2 internamente), autenticada con un certificado y monitoreada por Cloudflare.

Paso 1: Instalar cloudflared

# Debian/Ubuntu
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
  -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# Verificar
cloudflared --version

Paso 2: Autenticar

cloudflared tunnel login

Esto abre un navegador para autorizar el túnel en tu cuenta de Cloudflare. Una vez autorizado, se descarga un certificado en ~/.cloudflared/cert.pem.

Paso 3: Crear el Túnel

cloudflared tunnel create homelab

Este comando:

  • Registra el túnel llamado homelab en tu cuenta de Cloudflare
  • Crea un UUID de túnel
  • Guarda las credenciales en ~/.cloudflared/<UUID>.json

Paso 4: Configurar el Túnel

Crea el archivo de configuración:

mkdir -p ~/.cloudflared
nano ~/.cloudflared/config.yml
# ~/.cloudflared/config.yml
tunnel: <TU_UUID_DEL_TUNEL>
credentials-file: /home/tu-usuario/.cloudflared/<TU_UUID_DEL_TUNEL>.json

ingress:
  # Dashboard (puerto 3000 en diferentes hosts)
  - hostname: uptime.internal.example.com
    service: http://192.168.1.50:3001

  # Proxmox (HTTPS con certificado autofirmado)
  - hostname: pve.internal.example.com
    service: https://192.168.1.10:8006
    originRequest:
      noTLSVerify: true

  # Catch-all (denegar todo lo demás)
  - service: http_status:404

Importante: Cada regla de ingress necesita un hostname público configurado en tu zona DNS de Cloudflare. Cloudflare solo enruta tráfico para dominios que posees.

Puedes encontrar tu UUID del túnel con:

cloudflared tunnel list

Paso 5: Configurar Registros DNS

Para cada hostname en tu configuración de ingress, agrega un registro CNAME en el DNS de Cloudflare:

uptime.internal → <UUID_DEL_TUNEL>.cfargotunnel.com
pve.internal   → <UUID_DEL_TUNEL>.cfargotunnel.com

O créalos mediante CLI:

cloudflared tunnel route dns homelab uptime.internal.example.com
cloudflared tunnel route dns homelab pve.internal.example.com

Paso 6: Ejecutar como Servicio Systemd

Para uso en producción, ejecuta cloudflared como un servicio:

sudo cloudflared service install
sudo systemctl enable --now cloudflared
sudo systemctl status cloudflared

Verifica que el túnel esté saludable:

cloudflared tunnel info homelab

Agregar Cloudflare Access (Zero Trust)

Un nombre DNS público significa que cualquiera que descubra la URL puede acceder a tu servicio. Agrega Cloudflare Access para autenticación:

  1. Ve a Cloudflare Zero TrustAccessApplications
  2. Haz clic en Add an applicationSelf-hosted
  3. Configura:
    • Application name: Uptime Kuma
    • Subdomain: uptime.internal
    • Domain: example.com
  4. En Policies, agrega una regla:
    • Action: Allow
    • Include: Correos electrónicos que terminen en @example.com
    • Selector: Emails
  5. Guarda

Ahora los visitantes deben autenticarse con un correo electrónico verificado por Cloudflare antes de ver la página de inicio de sesión de tu servicio. También puedes usar códigos OTP para acceso único a URLs específicas.

Integración con Docker

Si usas Docker, cloudflared se integra bien en un stack de Compose:

# docker-compose.yml
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=${TUNNEL_TOKEN}
    networks:
      - proxy

networks:
  proxy:
    external: true

Usa un Tunnel Token en lugar del JSON de credenciales — es una sola variable de entorno:

# Obtén el token desde el panel de Cloudflare Zero Trust o mediante CLI
cloudflared tunnel token homelab

Proxy Inverso + Túnel (Recomendado)

Para múltiples servicios, combina Cloudflare Tunnel con un proxy inverso (Traefik o Nginx Proxy Manager):

Navegador → Edge de Cloudflare → Túnel → Nginx Proxy Manager → Servicio

El túnel apunta a tu proxy inverso en el puerto 80/443, y el proxy enruta por hostname internamente. Esto evita tener una regla de ingress por servicio.

ingress:
  - hostname: "*.internal.example.com"
    service: https://nginx-proxy:443
    originRequest:
      originServerName: "*.internal.example.com"
  - service: http_status:404

Consideraciones de Rendimiento

  • Los túneles usan la red global de Cloudflare — el tráfico se enruta a través del PoP de Cloudflare más cercano
  • Para transferencias internas (ej., streaming local de Jellyfin), considera acceso directo o split DNS
  • El tráfico web está bien; ancho de banda muy alto (streaming 4K, transferencias de archivos grandes) puede mostrar latencia
  • El protocolo QUIC ofrece mejor rendimiento que HTTP/2 en conexiones con pérdida

Monitoreo

Cloudflare proporciona métricas de salud del túnel en el panel de Zero Trust. También puedes monitorear el túnel localmente:

# Endpoint de verificación de salud (requiere configurar el flag management.enable)
curl http://localhost:20000/metrics
# Registros de journal
sudo journalctl -u cloudflared -f

Resumen

BeneficioCómo
Sin puertos abiertosSolo conexiones de salida desde tu servidor
Sin IP estáticaCloudflare maneja la IP del edge
Sin Dynamic DNSRegistros CNAME a cfargotunnel.com
HTTPS integradoCloudflare termina TLS en el edge
Control de accesoAgrega Cloudflare Access para autenticación por correo/OTP
GratuitoLos túneles Zero Trust están incluidos en el plan gratuito de Cloudflare

Cloudflare Tunnel es una de las herramientas más impactantes en el kit de un homelab. Elimina la necesidad de reenvío de puertos, reduce tu superficie de ataque a casi cero y se integra limpiamente con el resto del ecosistema de Cloudflare.


¿Tienes preguntas sobre cómo configurar túneles para tu configuración específica? Ponte en contacto.