En un post anterior te mostré cómo exponer servicios usando Nginx Proxy Manager, port forwarding en el router y certificados SSL de Cloudflare. Funciona bien, pero tiene un costo: necesitas abrir puertos en tu router y tu IP queda expuesta a quien sepa dónde mirar. Cloudflare Tunnel resuelve ambos problemas.
¿Qué es Cloudflare Tunnel?
Es un servicio gratuito de Cloudflare que crea una conexión saliente entre tu servidor y la red de Cloudflare mediante un pequeño demonio llamado cloudflared. Como la conexión la inicia tu servidor hacia afuera, no necesitas abrir ni redirigir ningún puerto en tu router, y tu IP pública nunca queda expuesta directamente.
¿Por qué preferirlo sobre port forwarding?
- No abres ningún puerto en tu router (menor superficie de ataque).
- Funciona aunque tu ISP te entregue una IP detrás de CGNAT (sin IP pública propia).
- El tráfico pasa por la protección DDoS y el WAF de Cloudflare antes de llegar a tu servidor.
- Sigues usando los certificados SSL gratuitos de Cloudflare, igual que con Nginx Proxy Manager.
Paso 1: Crear el túnel en Cloudflare
- Entra al dashboard de Cloudflare Zero Trust.
- Ve a Networks > Tunnels y selecciona Create a tunnel.
- Elige Cloudflared como tipo de conector y ponle un nombre (por ejemplo,
homelab). - Cloudflare te va a mostrar un token de instalación. Guárdalo, lo necesitas en el siguiente paso.
Paso 2: Levantar cloudflared con Docker Compose
En vez de instalar cloudflared directo en el sistema, prefiero correrlo como contenedor junto al resto de mis servicios:
version: '3'
services:
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel run
environment:
TUNNEL_TOKEN: 'tu-token-del-paso-anterior'
Con docker compose up -d el túnel debería aparecer como Healthy en el dashboard de Cloudflare a los pocos segundos.
Paso 3: Configurar los hostnames públicos
Ya con el túnel corriendo, en la misma pantalla del túnel ve a la pestaña Public Hostname y agrega una entrada por cada servicio que quieras exponer:
- Subdomain: el subdominio que quieras usar (por ejemplo
immich). - Domain: tu dominio conectado a Cloudflare.
- Service: el tipo (
HTTPoHTTPS) y la dirección interna de tu servicio, por ejemplohttp://localhost:3000ohttp://192.168.1.50:3000si corre en otra máquina de tu red.
Cloudflare crea automáticamente el registro DNS necesario, así que no tienes que tocar nada en la sección de DNS del dominio.
Conclusión
Si vienes usando port forwarding + Nginx Proxy Manager como en el post anterior, no tienes que elegir uno u otro: puedes migrar tus servicios a Cloudflare Tunnel de a poco, dejando NPM solo para lo que todavía no hayas movido. En mi caso, terminé usando Cloudflare Tunnel para todo lo que expongo a internet, y dejé el acceso directo por IP solo para servicios que uso exclusivamente dentro de mi red local.