📋 Contexto

Exponer servicios locales a internet tradicionalmente requiere abrir puertos en el router, configurar port forwarding, lidiar con IPs dinámicas, y preocuparse por seguridad. Cloudflare Tunnel (anteriormente Argo Tunnel) elimina todos estos problemas.

Con Cloudflare Tunnel, tus servicios son accesibles públicamente sin exponer tu IP real ni abrir un solo puerto en el router. Todo el tráfico pasa por la red de Cloudflare, obteniendo DDoS protection, SSL/TLS automático, y Web Application Firewall gratis.

🎯 Objetivo

  • Exponer mi sitio web y n8n a internet de forma segura
  • No abrir puertos en el router (seguridad y simplicidad)
  • SSL/TLS automático con certificados de Cloudflare
  • Múltiples servicios bajo diferentes subdominios
  • DDoS protection incluido

🛠️ Implementación

Prerequisitos

  • Dominio registrado (el mío: mytechzone.dev)
  • DNS gestionado por Cloudflare (gratis)
  • Cuenta en Cloudflare (plan Free es suficiente)
  • Servidor con servicios corriendo localmente

Paso 1: Instalar cloudflared

# En Debian/Ubuntu
curl -L --output cloudflared.deb \
  https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb

sudo dpkg -i cloudflared.deb

# Verificar instalación
cloudflared --version

Paso 2: Autenticar con Cloudflare

# Este comando abre el navegador para login
cloudflared tunnel login

# Elige el dominio que quieres usar (mytechzone.dev)
# Se guarda el cert en ~/.cloudflared/cert.pem

Paso 3: Crear el Tunnel

# Crear tunnel con nombre descriptivo
cloudflared tunnel create homelab

# Output mostrará el Tunnel ID (guárdalo)
# Tunnel credentials guardadas en ~/.cloudflared/UUID.json

Paso 4: Configurar DNS

# Asociar dominio/subdominio al tunnel
cloudflared tunnel route dns homelab mytechzone.dev
cloudflared tunnel route dns homelab n8n.mytechzone.dev

# Esto crea registros CNAME en Cloudflare DNS automáticamente

Paso 5: Archivo de Configuración

Crear /etc/cloudflared/config.yml:

tunnel: 50f67800-5704-41d7-b744-8c1660353215  # Tu Tunnel ID
credentials-file: /root/.cloudflared/50f67800-5704-41d7-b744-8c1660353215.json

ingress:
  # Sitio web principal
  - hostname: mytechzone.dev
    service: http://localhost:8080
    originRequest:
      noTLSVerify: true
  
  # n8n automation
  - hostname: n8n.mytechzone.dev
    service: http://localhost:5678
    originRequest:
      noTLSVerify: true
  
  # Catch-all: regresa 404 para dominios no configurados
  - service: http_status:404
💡 Explicación de la configuración:
hostname: El dominio/subdominio público
service: A dónde redirigir el tráfico (puerto local)
originRequest.noTLSVerify: Útil si tu servicio local usa HTTP (no HTTPS)
http_status:404: Catch-all para dominios no configurados

Paso 6: Iniciar Tunnel Manualmente (Test)

# Test en foreground para ver logs
cloudflared tunnel --config /etc/cloudflared/config.yml run homelab

# Deberías ver:
# INF Connection registered
# INF Route propagating...

Paso 7: Configurar como Servicio Systemd

Para que inicie automáticamente con el servidor:

# Instalar como servicio
sudo cloudflared service install

# Habilitar y iniciar
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

# Verificar estado
sudo systemctl status cloudflared

🐛 Troubleshooting: Error 404

Durante mi setup inicial, mytechzone.dev devolvía 404 aunque el tunnel estaba corriendo. Aquí están los problemas que enfrenté y cómo los resolví.

Problema 1: Archivo de Configuración en Ubicación Incorrecta

Síntoma: Tunnel corre pero ignora la configuración de ingress.

Causa: Edité ~/.cloudflared/config.yml pero el servicio systemd usa /etc/cloudflared/config.yml.

Solución:

# Copiar config a la ubicación correcta
sudo cp ~/.cloudflared/config.yml /etc/cloudflared/

# Copiar credentials también
sudo cp ~/.cloudflared/*.json /root/.cloudflared/

# Reiniciar servicio
sudo systemctl restart cloudflared

Problema 2: Ingress Duplicado en config.yml

Síntoma: Error al iniciar: mapping key "ingress" already defined

Causa: Definí dos bloques ingress: en el mismo archivo.

Solución: Un solo bloque ingress con múltiples hostnames:

# ❌ INCORRECTO
ingress:
  - hostname: mytechzone.dev
    service: http://localhost:8080

ingress:  # ← Duplicado!
  - hostname: n8n.mytechzone.dev
    service: http://localhost:5678

# ✅ CORRECTO
ingress:
  - hostname: mytechzone.dev
    service: http://localhost:8080
  - hostname: n8n.mytechzone.dev
    service: http://localhost:5678
  - service: http_status:404

Problema 3: DNS No Propagado

Síntoma: curl devuelve Could not resolve host.

Causa: Cambios DNS tardan en propagarse.

Diagnóstico:

# Verificar DNS desde diferentes servidores
dig @1.1.1.1 mytechzone.dev
nslookup mytechzone.dev 8.8.8.8

# Ver si apunta a Cloudflare
dig mytechzone.dev CNAME

Solución: Esperar 5-10 minutos o limpiar caché DNS local:

# En Mac
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

# En Linux
sudo systemd-resolve --flush-caches

Problema 4: Tipo de Registro DNS Incorrecto

Síntoma: dig muestra A record en lugar de CNAME.

Causa: Creé manualmente un A record en lugar de CNAME al tunnel.

Solución: En Cloudflare Dashboard:

  1. DNS → Records
  2. Eliminar A record para mytechzone.dev
  3. Agregar CNAME: mytechzone.dev → UUID.cfargotunnel.com
  4. O mejor aún, usar cloudflared tunnel route dns

🔍 Verificación del Setup

1. Verificar Tunnel Está Conectado

# Ver tunnels activos
cloudflared tunnel list

# Ver detalles del tunnel
cloudflared tunnel info homelab

# Ver conexiones
sudo journalctl -u cloudflared -n 50

2. Test de Acceso Local

# Verificar servicios locales responden
curl http://localhost:8080
curl http://localhost:5678/healthz

3. Test de Acceso Público

# Desde cualquier máquina (fuera de tu red)
curl -I https://mytechzone.dev
curl -I https://n8n.mytechzone.dev

# Deberías ver HTTP/2 200 (no 404, no 503)

✅ Ventajas de Cloudflare Tunnel

Seguridad:
• Tu IP real permanece oculta
• No abres puertos en el router
• DDoS protection automático
• WAF (Web Application Firewall) incluido

Conveniencia:
• SSL/TLS automático (no más Let's Encrypt manual)
• Funciona con IP dinámica
• CDN global (mejor latencia)
• Configuración centralizada en Cloudflare Dashboard

Costo:
• Gratis para uso personal
• Unlimited bandwidth (en plan Free)

💡 Comparación: Tunnel vs Port Forwarding

Aspecto Port Forwarding Cloudflare Tunnel
IP Expuesta 🔴 Sí (visible públicamente) 🟢 No (oculta detrás de Cloudflare)
Configuración Router 🔴 Requerida (compleja) 🟢 No necesaria
IP Dinámica 🟡 Requiere DDNS 🟢 Sin problema
SSL/TLS 🟡 Manual (Let's Encrypt) 🟢 Automático
DDoS Protection 🔴 No 🟢 Incluido
Múltiples Servicios 🟡 Un puerto por servicio 🟢 Ilimitados (subdominios)

📊 Monitoring y Logs

Ver Logs del Tunnel

# Logs en tiempo real
sudo journalctl -u cloudflared -f

# Últimas 100 líneas
sudo journalctl -u cloudflared -n 100

# Logs de errores
sudo journalctl -u cloudflared -p err

Cloudflare Dashboard Analytics

En el dashboard de Cloudflare puedes ver:

  • Requests por segundo
  • Bandwidth usado
  • Ataques bloqueados por WAF
  • Cache hit rate
  • Países de origen del tráfico

💭 Lecciones Aprendidas

  • Ubicación del config.yml importa: El servicio systemd usa /etc/cloudflared/, no ~/.cloudflared/.
  • Un solo bloque ingress: No duplicar la clave ingress: en el YAML.
  • DNS tarda en propagar: Espera 5-10 minutos después de cambios DNS.
  • CNAME es el tipo correcto: No uses A records para tunnels, usa CNAME.
  • Logs son tu amigo: journalctl -u cloudflared tiene toda la información.

🚀 Configuraciones Avanzadas

Rate Limiting

En Cloudflare Dashboard, puedes agregar rate limiting por IP:

# Ejemplo: Máximo 100 requests por minuto por IP
Security → WAF → Rate limiting rules

Geoblocking

Bloquear países específicos:

Security → WAF → Custom rules
→ Block if country is in {list}

Access Policies

Agregar autenticación extra (OAuth, email OTP):

Zero Trust → Access → Applications
→ Add application → Self-hosted

✅ Resultado Final

Mi setup actual:

Servicios expuestos:
• https://mytechzone.dev → Sitio web personal
• https://n8n.mytechzone.dev → Plataforma n8n
• https://mytechzone.dev/status.html → Server dashboard

Características:
• 🔒 SSL/TLS automático
• 🛡️ DDoS protection activo
• 🌍 CDN global (mejor latencia)
• 🚫 IP real oculta
• 📊 Analytics detallado
• 💰 $0/mes de costo

💭 Conclusión

Cloudflare Tunnel es una solución elegante para exponer servicios de home lab sin comprometer seguridad. Aunque la configuración inicial tiene algunas trampas (especialmente con DNS y ubicación de archivos), una vez funcionando es extremadamente estable.

Lo mejor: es gratis, no requiere configuración de router, y obtienes todas las ventajas de la red de Cloudflare (CDN, DDoS protection, WAF) sin costo adicional. Para cualquier proyecto self-hosted, lo recomiendo 100%.