commit ed49ee79d432f61b60fbd5a719a3d2e833672cd2 Author: josedario87 Date: Sun Oct 5 02:13:19 2025 -0600 Initial commit: Cloudflare Tunnel → Traefik configuration Configuración de Cloudflare Tunnel con wildcard *.nucleoriofrio.com que apunta a Traefik para mantener autenticación con Authentik. Componentes: - config.yml: Configuración del tunnel con wildcard - docker-compose.yml: Servicio cloudflared - .env.example: Template para variables de entorno - README.md: Documentación completa de setup - .gitignore: Protección de credenciales diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..82f7432 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +# Cloudflare Tunnel ID +# Obtén este ID cuando crees el tunnel con: cloudflared tunnel create +TUNNEL_ID=your-tunnel-id-here diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bdee8d5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Archivos sensibles - NO commitear +credentials.json +.env + +# Logs +*.log + +# Docker +.docker/ + +# Sistema operativo +.DS_Store +Thumbs.db + +# Editors +.vscode/ +.idea/ +*.swp +*.swo +*~ diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae288d3 --- /dev/null +++ b/README.md @@ -0,0 +1,180 @@ +# Cloudflare Tunnel → Traefik + Authentik + +Configuración de Cloudflare Tunnel para exponer servicios a través de Traefik manteniendo la autenticación de Authentik. + +## 🎯 Arquitectura + +``` +Internet → Cloudflare Tunnel → Traefik → Authentik Forward Auth → Apps +``` + +El wildcard `*.nucleoriofrio.com` apunta todo el tráfico a Traefik, que se encarga de: +- Enrutamiento correcto según el hostname +- Autenticación con Authentik +- Certificados SSL/TLS +- Redirecciones HTTP → HTTPS + +## 📋 Requisitos previos + +- Docker y Docker Compose instalados +- Cuenta de Cloudflare con dominio configurado +- Traefik corriendo en la red `traefik_network` +- Authentik configurado con Forward Auth en Traefik + +## 🚀 Setup + +### 1. Crear el tunnel en Cloudflare + +```bash +# Login a Cloudflare +cloudflared tunnel login + +# Crear el tunnel (guarda el TUNNEL_ID que te devuelve) +cloudflared tunnel create nucleorio-tunnel + +# Esto genera el archivo credentials.json en ~/.cloudflared/ +``` + +### 2. Configurar DNS en Cloudflare + +En el dashboard de Cloudflare, crea un registro CNAME: + +``` +Type: CNAME +Name: *.nucleoriofrio.com (o solo *) +Target: .cfargotunnel.com +Proxy: Activado (nube naranja) +``` + +Opcionalmente, también para el dominio raíz: + +``` +Type: CNAME +Name: @ (o nucleoriofrio.com) +Target: .cfargotunnel.com +Proxy: Activado +``` + +### 3. Configurar este repositorio + +```bash +# Copiar el archivo de ejemplo +cp .env.example .env + +# Editar con tu TUNNEL_ID +nano .env +``` + +Pega tu `TUNNEL_ID` en el archivo `.env`: + +```env +TUNNEL_ID=tu-tunnel-id-aqui +``` + +### 4. Copiar credentials.json + +Copia el archivo de credenciales generado por Cloudflare: + +```bash +cp ~/.cloudflared/.json ./credentials.json +``` + +### 5. Levantar el servicio + +```bash +docker-compose up -d +``` + +### 6. Verificar logs + +```bash +docker-compose logs -f +``` + +Deberías ver algo como: + +``` +INF Connection registered connIndex=0 +INF Registered tunnel connection +``` + +## 🔧 Configuración + +### config.yml + +El archivo `config.yml` usa wildcard para capturar todo `*.nucleoriofrio.com` y redirigirlo a Traefik: + +```yaml +ingress: + - hostname: "*.nucleoriofrio.com" + service: http://traefik:80 +``` + +Traefik recibe el tráfico y: +1. Lee el `Host` header +2. Aplica las reglas de enrutamiento +3. Ejecuta Authentik Forward Auth si está configurado +4. Redirige al servicio correcto + +### docker-compose.yml + +El contenedor se conecta a la red `traefik_network` para poder comunicarse con Traefik. + +## ✅ Verificación + +Prueba acceder a tus servicios: + +- https://amigos.nucleoriofrio.com → Debería redirigir a Authentik +- https://wifi.nucleoriofrio.com → Debería redirigir a Authentik +- https://portainer.nucleoriofrio.com → Debería redirigir a Authentik + +## 🐛 Troubleshooting + +### El tunnel no conecta + +```bash +# Verificar logs +docker-compose logs -f + +# Verificar que credentials.json existe y es válido +cat credentials.json +``` + +### Traefik no recibe el tráfico + +```bash +# Verificar que el contenedor está en la red correcta +docker network inspect traefik_network + +# Debería aparecer 'cloudflared-tunnel' en la lista +``` + +### Authentik no intercepta + +Verifica que Traefik tiene configurado el middleware de Authentik Forward Auth para tus servicios. + +### El wildcard no funciona + +Asegúrate de que: +1. El registro DNS CNAME en Cloudflare está configurado como `*` o `*.nucleoriofrio.com` +2. El proxy (nube naranja) está activado +3. El tunnel está corriendo sin errores + +## 📝 Notas importantes + +- **No expongas servicios directamente**: Todo debe pasar por Traefik para mantener Authentik +- **Wildcard DNS**: Con `*.nucleoriofrio.com` no necesitas reconfigurar el tunnel para nuevos subdominios +- **Multiple WAN**: Cloudflare Tunnel maneja automáticamente las reconexiones si tu conexión se cae +- **Credenciales**: Nunca commitees `credentials.json` o `.env` al repositorio + +## 🔐 Seguridad + +Este setup mantiene toda la seguridad de Authentik porque: +- El tunnel termina en Traefik, no en las apps +- Traefik aplica Forward Auth antes de permitir acceso +- Las apps nunca están expuestas directamente a Internet + +## 📚 Referencias + +- [Cloudflare Tunnel Docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/) +- [Wildcard DNS](https://developers.cloudflare.com/dns/manage-dns-records/reference/wildcard-dns-records/) diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..bc4834d --- /dev/null +++ b/config.yml @@ -0,0 +1,28 @@ +# Cloudflare Tunnel Configuration +# Apunta a Traefik para mantener Authentik Forward Auth + +tunnel: ${TUNNEL_ID} +credentials-file: /etc/cloudflared/credentials.json + +# Configuración de ingress - wildcard apunta todo a Traefik +ingress: + # Wildcard - todo *.nucleoriofrio.com pasa por Traefik + - hostname: "*.nucleoriofrio.com" + service: http://traefik:80 + originRequest: + noTLSVerify: false + # Preserve el Host header para que Traefik pueda enrutar correctamente + httpHostHeader: "" + + # Dominio raíz (opcional) + - hostname: nucleoriofrio.com + service: http://traefik:80 + originRequest: + noTLSVerify: false + httpHostHeader: "" + + # Catch-all - rechaza todo lo demás + - service: http_status:404 + +# Logging +loglevel: info diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5165a9a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3.8' + +services: + cloudflared: + image: cloudflare/cloudflared:latest + container_name: cloudflared-tunnel + restart: unless-stopped + command: tunnel --config /etc/cloudflared/config.yml run + volumes: + - ./config.yml:/etc/cloudflared/config.yml:ro + - ./credentials.json:/etc/cloudflared/credentials.json:ro + environment: + - TUNNEL_ID=${TUNNEL_ID} + networks: + - traefik_network + +networks: + traefik_network: + external: true + name: traefik_network