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
- Instalas
cloudflareden tu servidor cloudflaredestablece una conexión de salida al edge de Cloudflare- Cloudflare proxy las solicitudes HTTPS entrantes a través de ese túnel
- 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
homelaben 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:
- Ve a Cloudflare Zero Trust → Access → Applications
- Haz clic en Add an application → Self-hosted
- Configura:
- Application name: Uptime Kuma
- Subdomain:
uptime.internal - Domain:
example.com
- En Policies, agrega una regla:
- Action: Allow
- Include: Correos electrónicos que terminen en
@example.com - Selector: Emails
- 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
| Beneficio | Cómo |
|---|---|
| Sin puertos abiertos | Solo conexiones de salida desde tu servidor |
| Sin IP estática | Cloudflare maneja la IP del edge |
| Sin Dynamic DNS | Registros CNAME a cfargotunnel.com |
| HTTPS integrado | Cloudflare termina TLS en el edge |
| Control de acceso | Agrega Cloudflare Access para autenticación por correo/OTP |
| Gratuito | Los 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.