📋 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
•
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:
- DNS → Records
- Eliminar A record para mytechzone.dev
- Agregar CNAME:
mytechzone.dev → UUID.cfargotunnel.com - 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
• 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
📚 Recursos Útiles
💭 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 cloudflaredtiene 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:
• 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%.