Guia de Cloudflare Tunnel para VPS 2026: Exponer Servicios Sin Abrir Puertos
Configura Cloudflare Tunnel en tu VPS para exponer aplicaciones web de forma segura sin abrir puertos ni revelar la IP de tu servidor. Guia completa con Docker y configuracion DNS.
Cloudflare Tunnel en VPS: Acceso Seguro Sin Puertos Abiertos
Cloudflare Tunnel te permite exponer servicios en tu VPS a internet sin abrir un solo puerto. No necesitas IP publica, ni reglas de firewall, ni redireccion de puertos — Cloudflare se encarga de todo a traves de una conexion saliente cifrada.
Por que Cloudflare Tunnel?
| Enfoque | Puertos Abiertos | IP Expuesta | Proteccion DDoS | SSL |
|---|---|---|---|---|
| Cloudflare Tunnel | Ninguno | Oculta | Integrada | Automatico |
| Proxy inverso (Nginx) | 80, 443 | Si | Ninguna | Manual (Let’s Encrypt) |
| Redireccion de puertos | Cualquiera | Si | Ninguna | Manual |
| VPN + acceso | Puerto VPN | Oculta | Ninguna | Via VPN |
Configuracion tradicional: abrir puertos → configurar firewall → gestionar SSL → esperar que nadie encuentre tu IP.
Cloudflare Tunnel: instalar cloudflared → apuntarlo a tu servicio local → listo. Tu servidor permanece invisible.
Como Funciona
cloudflaredse ejecuta en tu VPS y crea una conexion saliente hacia el borde de Cloudflare- El trafico llega a tu dominio → Cloudflare lo enruta a traves del tunel → alcanza tu servicio
- Tu VPS nunca acepta conexiones entrantes — solo realiza conexiones salientes
- Cloudflare gestiona SSL, proteccion DDoS y cache automaticamente
Sin puertos abiertos. Sin IP expuesta. Sin superficie de ataque.
Requisitos Previos
- Un dominio en Cloudflare (el plan gratuito funciona)
- Un VPS con Linux (cualquier proveedor)
- Servicios ejecutandose localmente (aplicaciones web, APIs, paneles de control)
Mejor VPS para Cloudflare Tunnel
| Proveedor | Plan | Precio | Por que |
|---|---|---|---|
| Hostinger | KVM1 | $4.99/mes | Mejor relacion calidad-precio, rendimiento solido |
| Hetzner | CX22 | €3.79/mes | El mas economico para la UE |
| Vultr | VC2 | $6/mes | Ubicaciones globales |
| DigitalOcean | Basic | $6/mes | Panel de control sencillo |
Cloudflare Tunnel usa recursos minimos — las especificaciones del VPS importan para tus servicios reales, no para el tunel en si.
Configuracion Rapida (10 Minutos)
Paso 1: Instalar cloudflared
# Debian/Ubuntu
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
apt update
apt install cloudflared -y
# O descargar el binario directamente
curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared
Verificar:
cloudflared --version
Paso 2: Autenticarse
cloudflared tunnel login
Esto abre una URL en el navegador. Selecciona el dominio que quieres usar. Se guarda un certificado en ~/.cloudflared/cert.pem.
Servidor sin interfaz grafica? Copia la URL que imprime, abrela en tu maquina local, autenticate y luego copia
cert.pemde vuelta al servidor.
Paso 3: Crear un Tunel
cloudflared tunnel create my-tunnel
Esto genera un ID de tunel y un archivo de credenciales. Anota el UUID del tunel — lo necesitaras.
# Listar tuneles
cloudflared tunnel list
Paso 4: Configurar el Tunel
Crea el archivo de configuracion:
mkdir -p ~/.cloudflared
cat > ~/.cloudflared/config.yml << 'EOF'
tunnel: YOUR_TUNNEL_UUID
credentials-file: /root/.cloudflared/YOUR_TUNNEL_UUID.json
ingress:
- hostname: app.yourdomain.com
service: http://localhost:3000
- hostname: api.yourdomain.com
service: http://localhost:8080
- service: http_status:404
EOF
Reemplaza:
YOUR_TUNNEL_UUIDcon tu ID de tunel- Los nombres de host y puertos con tus servicios reales
La ultima regla http_status:404 es obligatoria — es la regla general para solicitudes que no coinciden.
Paso 5: Crear Registros DNS
cloudflared tunnel route dns my-tunnel app.yourdomain.com
cloudflared tunnel route dns my-tunnel api.yourdomain.com
Esto crea registros CNAME que apuntan a tu tunel automaticamente.
Paso 6: Ejecutar el Tunel
cloudflared tunnel run my-tunnel
Tus servicios ahora estan disponibles en app.yourdomain.com y api.yourdomain.com — con SSL, proteccion DDoS y cero puertos abiertos.
Ejecutar como Servicio del Sistema
No ejecutes tuneles en una terminal. Configura un servicio adecuado:
cloudflared service install
systemctl enable cloudflared
systemctl start cloudflared
Verificar estado:
systemctl status cloudflared
journalctl -u cloudflared -f
El servicio lee desde ~/.cloudflared/config.yml (o /etc/cloudflared/config.yml en algunos sistemas).
Configuracion con Docker
Servicio Unico
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
command: tunnel --no-autoupdate run --token YOUR_TUNNEL_TOKEN
restart: unless-stopped
network_mode: host
Con Servicios de Docker Compose
services:
cloudflared:
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run --token YOUR_TUNNEL_TOKEN
restart: unless-stopped
depends_on:
- webapp
- api
networks:
- tunnel
webapp:
image: nginx:alpine
networks:
- tunnel
api:
image: your-api:latest
networks:
- tunnel
networks:
tunnel:
Al usar redes Docker, apunta los servicios a los nombres de los contenedores:
ingress:
- hostname: app.yourdomain.com
service: http://webapp:80
- hostname: api.yourdomain.com
service: http://api:8080
- service: http_status:404
Configuracion Basada en Token (Recomendada para Docker)
En lugar de archivos de configuracion, usa el panel de Cloudflare Zero Trust:
- Ve a Panel de Zero Trust → Networks → Tunnels
- Crea un tunel → obtiene el token
- Configura las rutas en el panel
- Ejecuta con solo:
cloudflared tunnel run --token YOUR_TOKEN
No se necesitan archivos de configuracion. Gestiona todo desde el panel.
Multiples Servicios en un Solo Tunel
Un tunel puede servir servicios ilimitados. Agrega mas reglas de ingress:
ingress:
- hostname: grafana.yourdomain.com
service: http://localhost:3000
- hostname: portainer.yourdomain.com
service: http://localhost:9000
- hostname: code.yourdomain.com
service: http://localhost:8443
- hostname: files.yourdomain.com
service: http://localhost:8080
- hostname: yourdomain.com
service: http://localhost:80
- service: http_status:404
Cada nombre de host necesita una ruta DNS:
cloudflared tunnel route dns my-tunnel grafana.yourdomain.com
cloudflared tunnel route dns my-tunnel portainer.yourdomain.com
Control de Acceso con Cloudflare Zero Trust
El tunel por si solo hace los servicios accesibles para todos. Agrega politicas de Zero Trust para restringir el acceso:
Autenticacion Basada en Email
- Panel de Zero Trust → Access → Applications → Add
- Establece el dominio de la aplicacion (ej.,
grafana.yourdomain.com) - Agrega politica: Allow → Emails ending in
@yourdomain.com
Los usuarios ven una pagina de inicio de sesion de Cloudflare antes de acceder a tu aplicacion.
PIN de Un Solo Uso
- Agrega politica: Allow → Emails → direcciones de email especificas
- Autenticacion: One-time PIN
- Los usuarios ingresan su email → reciben un codigo → acceso concedido
Sin contrasenas que gestionar. Sin cuentas que crear.
Tokens de Servicio (para APIs)
# Crea un token de servicio en el panel
# Luego accede con headers:
curl -H "CF-Access-Client-Id: YOUR_CLIENT_ID" \
-H "CF-Access-Client-Secret: YOUR_CLIENT_SECRET" \
https://api.yourdomain.com/endpoint
Casos de Uso Comunes
Paneles de Control Auto-Alojados
Exponer Grafana, Portainer o Uptime Kuma sin abrir puertos:
ingress:
- hostname: monitor.yourdomain.com
service: http://localhost:3001
originRequest:
noTLSVerify: true
Entornos de Desarrollo
Compartir servidores de desarrollo locales temporalmente:
# Tunel rapido (sin configuracion necesaria)
cloudflared tunnel --url http://localhost:3000
Esto crea una URL temporal *.trycloudflare.com. Ideal para demostraciones y pruebas.
Acceso SSH
Accede a tu VPS via SSH a traves de Cloudflare:
Configuracion del servidor:
ingress:
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
- service: http_status:404
Cliente:
# Agregar a ~/.ssh/config
Host ssh.yourdomain.com
ProxyCommand cloudflared access ssh --hostname %h
Ahora puedes usar SSH sin exponer el puerto 22. Combina con politicas de Zero Trust para autenticacion adicional.
Servicios TCP/UDP
Tunelizar servicios no HTTP:
ingress:
- hostname: db.yourdomain.com
service: tcp://localhost:5432
- service: http_status:404
Lado del cliente:
cloudflared access tcp --hostname db.yourdomain.com --url localhost:5432
Optimizacion de Rendimiento
Seleccion de Protocolo
tunnel: YOUR_TUNNEL_UUID
credentials-file: /root/.cloudflared/YOUR_TUNNEL_UUID.json
protocol: quic # Fastest, default in newer versions
ingress:
- hostname: app.yourdomain.com
service: http://localhost:3000
- service: http_status:404
QUIC es mas rapido y maneja mejor la perdida de paquetes que HTTP/2.
Configuracion de Conexion
ingress:
- hostname: app.yourdomain.com
service: http://localhost:3000
originRequest:
connectTimeout: 30s
keepAliveTimeout: 90s
keepAliveConnections: 100
httpHostHeader: app.yourdomain.com
- service: http_status:404
Cache
Como el trafico pasa por Cloudflare, obtienes su cache automaticamente. Configura las reglas de cache en el panel de Cloudflare para recursos estaticos.
Cloudflare Tunnel vs Alternativas
| Caracteristica | Cloudflare Tunnel | Nginx + Let’s Encrypt | Tailscale Funnel |
|---|---|---|---|
| Puertos abiertos | Ninguno | 80, 443 | Ninguno |
| Proteccion DDoS | Si | No | No |
| SSL | Automatico | Renovacion manual | Automatico |
| Dominio personalizado | Si | Si | Limitado |
| Control de acceso | Zero Trust | Hazlo tu mismo | Tailscale ACLs |
| Precio | Gratis | Gratis | Gratis (limitado) |
| Velocidad | Rapida (cache en el borde) | Directa | Buena |
Para exponer servicios web, Cloudflare Tunnel es dificil de superar. Para redes privadas entre dispositivos, consulta WireGuard o Tailscale en su lugar.
Solucion de Problemas
El Tunel No Se Conecta
# Verificar estado del tunel
cloudflared tunnel info my-tunnel
# Verificar logs
journalctl -u cloudflared --no-pager -n 50
# Probar conectividad
cloudflared tunnel run --loglevel debug my-tunnel
502 Bad Gateway
Tu servicio local no esta ejecutandose o esta en un puerto diferente:
# Verificar que el servicio esta escuchando
ss -tlnp | grep :3000
# Verificar si el servicio responde
curl -v http://localhost:3000
DNS No Resuelve
# Verificar que el CNAME existe
dig app.yourdomain.com CNAME
# Deberia apuntar a UUID.cfargotunnel.com
# Si no, vuelve a ejecutar:
cloudflared tunnel route dns my-tunnel app.yourdomain.com
Problemas con WebSocket
Agregar soporte WebSocket:
ingress:
- hostname: ws.yourdomain.com
service: http://localhost:3000
originRequest:
noTLSVerify: false
- service: http_status:404
Cloudflare Tunnel soporta WebSockets de forma nativa — solo asegurate de que tu plan de Cloudflare lo permita (el plan gratuito lo permite para la mayoria de los casos de uso).
Errores de Certificado
# Re-autenticarse
cloudflared tunnel login
# Verificar certificado
ls -la ~/.cloudflared/cert.pem
Mejores Practicas de Seguridad
- Usa politicas de Zero Trust — No expongas paneles de administracion a todo internet
- Rota los tokens de tunel — Elimina y recrea tuneles periodicamente
- Cierra todos los puertos del VPS — Si todo pasa por tuneles, cierra 80/443 por completo
# Bloquear firewall — solo se necesita SSH
ufw default deny incoming
ufw allow ssh
ufw enable
# No se necesita 80/443 en absoluto
- Monitorea los logs de acceso — El panel de Zero Trust muestra todas las solicitudes
- Activa notificaciones — Recibe alertas sobre cambios en el estado del tunel
Multiples Tuneles
Ejecuta tuneles separados para aislamiento:
cloudflared tunnel create production
cloudflared tunnel create staging
Archivos de configuracion separados:
cloudflared tunnel --config ~/.cloudflared/production.yml run production
cloudflared tunnel --config ~/.cloudflared/staging.yml run staging
Precios
| Caracteristica | Gratis | Pro ($20/mes) | Business ($200/mes) |
|---|---|---|---|
| Tuneles | Ilimitados | Ilimitados | Ilimitados |
| Usuarios Zero Trust | 50 | 50 | 50 |
| Proteccion DDoS | Basica | Mejorada | Avanzada |
| Reglas WAF | Limitadas | 20 | 100+ |
El plan gratuito cubre la mayoria de las necesidades de auto-alojamiento. Solo necesitas Pro para reglas WAF avanzadas o soporte prioritario.
Preguntas Frecuentes
Es Cloudflare Tunnel gratuito?
Si. Los tuneles son gratuitos en todos los planes, incluyendo el nivel gratuito. Zero Trust es gratis para hasta 50 usuarios.
Ralentiza mis servicios?
Generalmente lo contrario — la red de borde y el cache de Cloudflare pueden hacer que los servicios sean mas rapidos para usuarios globales.
Puedo usarlo sin un dominio?
Para pruebas rapidas, cloudflared tunnel --url te da un dominio temporal *.trycloudflare.com. Para produccion, necesitas un dominio en Cloudflare.
Que pasa si Cloudflare se cae?
Tus servicios se vuelven inaccesibles. Este es el compromiso — dependes del tiempo de actividad de Cloudflare. Para servicios criticos, manten un metodo de acceso de respaldo (VPN o SSH directo).
Puedo ejecutar multiples tuneles en un VPS?
Si. Cada tunel es un proceso separado con su propia configuracion. Sin limites de tuneles por servidor.
Funciona con Docker?
Perfectamente. Usa la imagen oficial cloudflare/cloudflared. La configuracion basada en token es la mas facil para contenedores.
Configuracion Recomendada
| Caso de Uso | Configuracion | Notas |
|---|---|---|
| Aplicacion web unica | Tunel rapido | cloudflared tunnel --url |
| Multiples servicios | Tunel con nombre + configuracion | Un tunel, multiples reglas de ingress |
| Acceso en equipo | Tunel + Zero Trust | Autenticacion por email o SSO |
| Produccion | Docker + token del panel | Gestion facil, reinicio automatico |
La combinacion de un VPS de Hostinger + Cloudflare Tunnel te da infraestructura de nivel empresarial por menos de $5/mes. Sin puertos que gestionar, sin SSL que renovar, sin DDoS de que preocuparse — solo despliega tus aplicaciones y deja que Cloudflare se encargue del resto.
Ready to get started?
Get the best VPS hosting deal today. Hostinger offers 4GB RAM VPS starting at just $4.99/mo.
Get Hostinger VPS — $4.99/mo// up to 75% off + free domain included
// related topics
// related guides
$1 VPS Hosting 2026: Cheapest VPS Servers Starting at $1/Month
Looking for $1 VPS hosting? Compare the cheapest VPS providers starting from $1-3/month. Real specs, no hidden fees, honest reviews of budget VPS options.
tutorialCaddy Reverse Proxy Guide 2026: Automatic HTTPS Made Easy
Set up Caddy as a reverse proxy with automatic HTTPS, zero-config SSL, and simple Caddyfile syntax. Complete VPS deployment guide.
tutorialCoolify VPS Setup Guide 2026: Self-Hosted Vercel Alternative
Deploy Coolify on your VPS for a self-hosted Vercel/Netlify experience. Complete setup guide with Docker, SSL, and app deployments.
tutorialVPS with Crypto & No KYC — 7 Providers That Accept Bitcoin
Pay for VPS hosting with Bitcoin, Monero, or ETH — no ID required. We list 7 privacy-first providers with anonymous signup. Updated March 2026.
Andrius Putna
I am Andrius Putna. Geek. Since early 2000 in love tinkering with web technologies. Now AI. Bridging business and technology to drive meaningful impact. Combining expertise in customer experience, technology, and business strategy to deliver valuable insights. Father, open-source contributor, investor, 2xIronman, MBA graduate.
// last updated: March 10, 2026. Disclosure: This article may contain affiliate links.