Ubuntu · Cloudflare · Servidores
Publica una aplicación que corre en tu servidor Ubuntu mediante un dominio de Cloudflare, sin abrir puertos en el router y sin exponer directamente el servicio local.
cloudflaredinstalado en Ubuntu.- Un Tunnel administrado desde Cloudflare.
- Un subdominio apuntando a una aplicación local.
- El conector ejecutándose como servicio de systemd.
Paso 1
Antes de comenzar
Cloudflare Tunnel crea conexiones salientes desde tu servidor hacia la red de Cloudflare. Esto permite publicar una aplicación sin configurar redirección de puertos en el router.
Necesitas
- Una cuenta de Cloudflare.
- Un dominio administrado por Cloudflare.
- Un servidor o máquina virtual con Ubuntu y acceso a Internet.
- Una aplicación local funcionando, por ejemplo en
http://localhost:3000. - Acceso con permisos
sudo.
Usaremos una aplicación local en http://localhost:3000 y la publicaremos como app.example.com. Sustituye esos valores por los de tu proyecto.
Una aplicación publicada mediante un hostname público puede ser accesible desde Internet. Para paneles administrativos o servicios privados, añade Cloudflare Access.
Paso 2
Comprobar que la aplicación funciona localmente
Antes de crear el Tunnel, comprueba que el servicio responde desde el propio servidor. Esto evita confundir un problema de la aplicación con un problema de Cloudflare.
curl -I http://localhost:3000Una respuesta HTTP 200, 301, 302 u otro estado esperado de tu aplicación indica que el servicio está accesible.
También puedes usar una dirección como http://192.168.1.20:3000. El servidor que ejecuta cloudflared debe poder alcanzar esa IP y puerto.
Paso 3
Instalar cloudflared en Ubuntu
Cloudflare ofrece un repositorio APT oficial para Debian y Ubuntu. Primero crea el directorio de llaves y descarga la llave de firma:
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/nullAñade el repositorio:
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main" | sudo tee /etc/apt/sources.list.d/cloudflared.listActualiza los índices e instala el paquete:
sudo apt-get update && sudo apt-get install cloudflaredComprueba la instalación:
cloudflared --versionPaso 4
Crear el Tunnel desde Cloudflare
Para la mayoría de instalaciones nuevas recomendamos el método administrado desde Cloudflare.
- Entra al Dashboard de Cloudflare.
- Ve a Networking → Tunnels.
- Selecciona Create Tunnel.
- Escribe un nombre descriptivo, por ejemplo
servidor-casa. - Confirma con Create Tunnel.
- En Setup Environment, selecciona Linux y la arquitectura de tu servidor.
La configuración del Tunnel queda almacenada en Cloudflare y puedes administrar rutas y aplicaciones desde el Dashboard sin editar archivos YAML en el servidor.
Paso 5
Conectar Ubuntu al Tunnel
Cloudflare mostrará un comando que contiene un token exclusivo del Tunnel. El formato es similar a este:
sudo cloudflared service install <TUNNEL_TOKEN>Copia el comando real que aparece en tu Dashboard y ejecútalo en Ubuntu. Esto registra cloudflared como servicio y conecta el servidor con tu Tunnel.
No lo publiques en GitHub, capturas, videos, foros ni archivos compartidos. Quien tenga un token válido puede ejecutar un conector para ese Tunnel.
Comprueba el servicio:
sudo systemctl status cloudflaredEn el Dashboard, el Tunnel debería aparecer como Healthy.
Paso 6
Publicar la aplicación con un subdominio
Ahora vamos a asociar un hostname público con el servicio local.
- Abre el Tunnel que acabas de crear.
- Ve a Routes y selecciona Add route.
- Selecciona Published application.
- En Hostname, escribe el subdominio y selecciona tu dominio, por ejemplo
app.example.com. - En Service URL, escribe
http://localhost:3000. - Guarda con Add route.
Cuando agregas la ruta desde el Dashboard, Cloudflare crea el registro DNS que apunta al Tunnel. No necesitas abrir el puerto 3000 en el router.
Si la aplicación corre en otro equipo de tu red, el Service URL puede ser algo como http://192.168.1.20:3000.
Si el servicio de origen utiliza HTTPS, usa una URL como https://localhost:8443. Si hay certificados propios o nombres de servidor específicos, revisa las opciones TLS del origen antes de desactivar la verificación de certificados.
Paso 7
Comprobar que el Tunnel funciona
Abre el hostname desde un navegador o comprueba las cabeceras desde la terminal:
curl -I https://app.example.comTambién puedes revisar las últimas líneas del servicio:
sudo journalctl -u cloudflared -n 50 --no-pagerEl Tunnel aparece Healthy, el servicio local sigue respondiendo y el hostname público abre la aplicación mediante HTTPS.
Paso 8
Uso diario y seguridad
Comprobar el estado del servicio
systemctl status cloudflaredReiniciar el conector
sudo systemctl restart cloudflaredVer logs en tiempo real
sudo journalctl -u cloudflared -fAgregar más aplicaciones
Un mismo Tunnel puede publicar múltiples aplicaciones. Desde Routes, añade otro hostname y apunta cada uno al puerto o servicio local correspondiente.
Proteger aplicaciones privadas con Cloudflare Access
Si publicas Home Assistant, un panel administrativo, una API interna u otra aplicación que no debería ser pública, crea una aplicación de Cloudflare Access y una política que exija autenticación antes de permitir el acceso.
Cloudflare Tunnel transporta y publica el tráfico. Si el hostname no tiene una política de Access ni autenticación propia, cualquier persona que conozca la URL puede intentar acceder.
Alternativa
Tunnel administrado localmente con config.yml
Cloudflare mantiene el método administrado localmente para escenarios específicos. En este modelo, el servidor conserva las credenciales y las reglas de ingress en archivos locales.
Primero autentica cloudflared:
cloudflared tunnel loginCrea el Tunnel:
cloudflared tunnel create mi-tunnelComprueba los túneles disponibles:
cloudflared tunnel listUna configuración típica con varias reglas usa un archivo config.yml parecido a este:
tunnel: <TUNNEL-UUID>
credentials-file: /home/usuario/.cloudflared/<TUNNEL-UUID>.json
ingress:
- hostname: app.example.com
service: http://localhost:3000
- service: http_status:404Las reglas de ingress deben terminar con una regla catch-all. Para crear el DNS:
cloudflared tunnel route dns mi-tunnel app.example.comY para probar el Tunnel manualmente:
cloudflared tunnel run mi-tunnelSi no necesitas mantener la configuración localmente, utiliza el método administrado desde el Dashboard. Es el flujo recomendado actualmente por Cloudflare para la mayoría de casos.
Listo
Tu aplicación ya está publicada mediante Cloudflare Tunnel
Desde este punto puedes añadir más hostnames, proteger servicios con Cloudflare Access y mantener varias aplicaciones detrás del mismo servidor sin abrir puertos de entrada en el router.
