Guia de Cloudflare Tunnel para VPS 2026: Exponer Servicios Sin Abrir Puertos
TUTORIAL 12 min read fordnox

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?

EnfoquePuertos AbiertosIP ExpuestaProteccion DDoSSSL
Cloudflare TunnelNingunoOcultaIntegradaAutomatico
Proxy inverso (Nginx)80, 443SiNingunaManual (Let’s Encrypt)
Redireccion de puertosCualquieraSiNingunaManual
VPN + accesoPuerto VPNOcultaNingunaVia 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

  1. cloudflared se ejecuta en tu VPS y crea una conexion saliente hacia el borde de Cloudflare
  2. El trafico llega a tu dominio → Cloudflare lo enruta a traves del tunel → alcanza tu servicio
  3. Tu VPS nunca acepta conexiones entrantes — solo realiza conexiones salientes
  4. Cloudflare gestiona SSL, proteccion DDoS y cache automaticamente

Sin puertos abiertos. Sin IP expuesta. Sin superficie de ataque.

Requisitos Previos

Mejor VPS para Cloudflare Tunnel

ProveedorPlanPrecioPor que
HostingerKVM1$4.99/mesMejor relacion calidad-precio, rendimiento solido
HetznerCX22€3.79/mesEl mas economico para la UE
VultrVC2$6/mesUbicaciones globales
DigitalOceanBasic$6/mesPanel 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.pem de 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:

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:

  1. Ve a Panel de Zero Trust → Networks → Tunnels
  2. Crea un tunel → obtiene el token
  3. Configura las rutas en el panel
  4. 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

  1. Panel de Zero Trust → Access → Applications → Add
  2. Establece el dominio de la aplicacion (ej., grafana.yourdomain.com)
  3. 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

  1. Agrega politica: Allow → Emails → direcciones de email especificas
  2. Autenticacion: One-time PIN
  3. 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

CaracteristicaCloudflare TunnelNginx + Let’s EncryptTailscale Funnel
Puertos abiertosNinguno80, 443Ninguno
Proteccion DDoSSiNoNo
SSLAutomaticoRenovacion manualAutomatico
Dominio personalizadoSiSiLimitado
Control de accesoZero TrustHazlo tu mismoTailscale ACLs
PrecioGratisGratisGratis (limitado)
VelocidadRapida (cache en el borde)DirectaBuena

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

  1. Usa politicas de Zero Trust — No expongas paneles de administracion a todo internet
  2. Rota los tokens de tunel — Elimina y recrea tuneles periodicamente
  3. 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
  1. Monitorea los logs de acceso — El panel de Zero Trust muestra todas las solicitudes
  2. 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

CaracteristicaGratisPro ($20/mes)Business ($200/mes)
TunelesIlimitadosIlimitadosIlimitados
Usuarios Zero Trust505050
Proteccion DDoSBasicaMejoradaAvanzada
Reglas WAFLimitadas20100+

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 UsoConfiguracionNotas
Aplicacion web unicaTunel rapidocloudflared tunnel --url
Multiples serviciosTunel con nombre + configuracionUn tunel, multiples reglas de ingress
Acceso en equipoTunel + Zero TrustAutenticacion por email o SSO
ProduccionDocker + token del panelGestion 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.

~/cloudflare-tunnel-vps-guide/get-started

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

cloudflare tunnel vps configuracion cloudflare tunnel cloudflared vps exponer vps sin puertos cloudflare zero trust tunnel

// related guides

Andrius Putna

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.