[{"data":1,"prerenderedAt":183},["ShallowReactive",2],{"seo-verification":3,"blog-cloudflare-tunnel-exponer-app-vps-sin-abrir-puertos-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-cloudflare-tunnel-exponer-app-vps-sin-abrir-puertos-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":125,"ctaBody":126,"ctaButton":127,"ctaUrl":128,"relatedPosts":129},248,"cloudflare-tunnel-exponer-app-vps-sin-abrir-puertos",{"fr":12,"en":13,"ar":14,"es":10},"cloudflare-tunnel-exposer-application-vps","cloudflare-tunnel-expose-a-vps-app-without-opening-ports","نفق-كلاود-فلير-عرض-تطبيق-vps-بدون-فتح-منافذ","Cloudflare Tunnel: exponer una app VPS sin abrir puertos","Exponga una aplicación en su VPS mediante un Cloudflare Tunnel sin abrir ningún puerto entrante. Guía completa con cloudflared, Docker Compose y servicio systemd.",10,1,false,"2026-08-12T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Despliegue","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fcloudflare-tunnel-exposer-application-vps-poster.svg","Acaba de desplegar una aplicación en su VPS y se encuentra bloqueado: IP dinámica, firewall corporativo que filtra el puerto 443 entrante o negativa a exponer directamente su servidor a Internet. Un Cloudflare Tunnel resuelve el problema invirtiendo la conexión: es `cloudflared` quien llama a Cloudflare, no al revés. Resultado: su aplicación queda accesible por HTTPS en su dominio, sin abrir ni un solo puerto entrante y sin tocar su configuración DNS.",[34,38,49,52,77,80,84,87,119,122],{"type":35,"title":36,"body":37},"h2","Por qué un Cloudflare Tunnel en lugar de abrir un puerto","La configuración clásica — abrir los puertos 80 y 443 en el firewall, apuntar un registro DNS a la IP del servidor, instalar un reverse proxy — funciona bien cuando usted controla la red. Pero hay tres situaciones que la hacen fracasar: un proveedor de acceso o una red corporativa que bloquea las conexiones entrantes en el 443, una IP dinámica que invalida sus registros DNS cada 24 horas, o un VPS situado detrás de un NAT estricto que no permite ningún port forwarding.\n\nCloudflare Tunnel sortea estos tres casos con un mismo mecanismo: el demonio `cloudflared` establece una conexión saliente persistente hacia los puntos de presencia de Cloudflare. Su servidor no acepta nada, Cloudflare recibe las peticiones HTTPS y las transmite por ese túnel cifrado. El tráfico entrante nunca llega directamente a su servidor.",{"type":39,"title":40,"items":41},"ul","Lo que aporta Cloudflare Tunnel en la práctica",[42,43,44,45,46,47,48],"**Cero puertos abiertos** — el firewall del VPS puede bloquear todo el tráfico entrante (80 y 443 incluidos) sin afectar a la accesibilidad de la aplicación.","**HTTPS automático** — Cloudflare gestiona el certificado TLS del lado del cliente: nada de Let's Encrypt que configurar, ninguna renovación que vigilar.","**NAT e IP dinámica transparentes** — la conexión saliente de `cloudflared` atraviesa cualquier NAT; la IP del servidor puede cambiar sin reconfigurar el DNS.","**Red corporativa o proveedor restrictivo** — si el puerto 443 entrante está bloqueado en su ubicación, el túnel sigue funcionando porque se apoya en conexiones salientes HTTP\u002F2 o QUIC.","**Integración Zero Trust opcional** — los túneles se combinan con Cloudflare Access para restringir el acceso a usuarios autenticados, sin VPN.","**Protección de Cloudflare incluida** — el tráfico pasa por la red de Cloudflare: mitigación de DDoS, WAF y rate limiting se aplican sin configuración adicional.","**Plan gratuito disponible** — un túnel sencillo, sin load balancing, se puede usar sin ninguna suscripción de pago de Cloudflare.",{"type":35,"title":50,"body":51},"Requisitos previos","Para seguir esta guía necesita:\n\n**Un VPS con acceso root.** La instalación de `cloudflared` como servicio systemd — la única manera de garantizar el reinicio automático — exige permisos de root. Un alojamiento compartido o una instancia sin acceso root no permite esta configuración.\n\n**Recursos mínimos.** `cloudflared` consume menos de 50 MB de RAM y un CPU despreciable. Cuente 1 vCPU y 512 MB de RAM como mínimo estricto solo para el demonio; la restricción real viene de la aplicación que va a exponer.\n\n**Un dominio gestionado por Cloudflare.** El dominio debe estar registrado o transferido a Cloudflare (o con delegación NS hacia Cloudflare). Sin una zona Cloudflare activa, un túnel named no puede crear el registro DNS automático.\n\n**Docker Engine** (si utiliza la variante Docker Compose de esta guía). Disponible en Ubuntu 22.04\u002F24.04, Debian 12 y las distribuciones compatibles con RHEL.\n\n**Una cuenta gratuita de Cloudflare.** No se requiere ninguna suscripción de pago para un túnel único sin load balancing.",{"type":53,"title":54,"steps":55},"steps","Instalar y configurar cloudflared en el VPS",[56,59,62,65,68,71,74],{"title":57,"body":58},"Instalar cloudflared desde el repositorio de Cloudflare","Cloudflare publica `cloudflared` como paquete `.deb` \u002F `.rpm` y como binario estático. Para una instalación con APT en Debian\u002FUbuntu:\n\n```bash\ncurl -fsSL https:\u002F\u002Fpkg.cloudflare.com\u002Fcloudflare-main.gpg | sudo tee \u002Fusr\u002Fshare\u002Fkeyrings\u002Fcloudflare-main.gpg > \u002Fdev\u002Fnull\necho \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fcloudflare-main.gpg] https:\u002F\u002Fpkg.cloudflare.com\u002Fcloudflared $(lsb_release -cs) main\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fcloudflared.list\nsudo apt update && sudo apt install cloudflared\n```\n\nCompruebe que la instalación se ha realizado correctamente:\n\n```bash\ncloudflared --version\n```\n\nEl comando debe devolver una línea del tipo `cloudflared version 2025.x.x (built ...)`. La versión exacta depende del momento de la instalación; consulte el \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fcloudflared\u002Freleases\">repositorio oficial cloudflare\u002Fcloudflared\u003C\u002Fa> para conocer el número actual.",{"title":60,"body":61},"Autenticar cloudflared ante Cloudflare","En el VPS (o de forma local si dispone de acceso gráfico), ejecute:\n\n```bash\ncloudflared tunnel login\n```\n\nEn la terminal aparece un enlace. Ábralo en un navegador, seleccione la zona de Cloudflare que desea autorizar y confirme. Se crea un certificado `~\u002F.cloudflared\u002Fcert.pem` en la máquina.",{"title":63,"body":64},"Crear un túnel con nombre","Cree un túnel con un nombre descriptivo:\n\n```bash\ncloudflared tunnel create mon-tunnel\n```\n\nCloudflare genera un identificador UUID y un archivo de credenciales `~\u002F.cloudflared\u002F\u003CUUID>.json`. Anote el UUID; lo necesitará en los pasos siguientes.",{"title":66,"body":67},"Escribir el archivo de configuración config.yml","Cree `\u002Fetc\u002Fcloudflared\u002Fconfig.yml`:\n\n```bash\nsudo mkdir -p \u002Fetc\u002Fcloudflared\n```\n\nContenido del archivo (adapte `\u003CUUID>`, `votre-domaine.com` y el puerto de su aplicación):\n\n```yaml\ntunnel: \u003CUUID>\ncredentials-file: \u002Fhome\u002F\u003Cuser>\u002F.cloudflared\u002F\u003CUUID>.json\n\ningress:\n  - hostname: app.votre-domaine.com\n    service: http:\u002F\u002Flocalhost:3000\n  - service: http_status:404\n```\n\nLa última regla — `service: http_status:404` sin `hostname` — es **obligatoria**: sirve de regla catch-all. Sin ella, `cloudflared` se niega a arrancar y devuelve el error `\"You must specify an ingress rule that matches all incoming requests\"`. Si su aplicación se ejecuta en otro puerto o con otro protocolo, sustituya `http:\u002F\u002Flocalhost:3000` en consecuencia (por ejemplo `http:\u002F\u002Flocalhost:8080` o `tcp:\u002F\u002Flocalhost:22` para SSH).",{"title":69,"body":70},"Crear el registro DNS y arrancar el túnel","Registre automáticamente el subdominio en su zona de Cloudflare:\n\n```bash\ncloudflared tunnel route dns mon-tunnel app.votre-domaine.com\n```\n\nLuego pruebe el túnel en modo foreground para validar la configuración:\n\n```bash\ncloudflared tunnel run mon-tunnel\n```\n\nAbra `https:\u002F\u002Fapp.votre-domaine.com` en un navegador. Si la aplicación responde, detenga el proceso (`Ctrl+C`) y pase al paso siguiente.",{"title":72,"body":73},"Instalar cloudflared como servicio systemd","Para que el túnel se reinicie automáticamente al arrancar el servidor, instálelo como demonio del sistema:\n\n```bash\nsudo cloudflared service install\nsudo systemctl enable cloudflared\nsudo systemctl start cloudflared\nsudo systemctl status cloudflared\n```\n\nEl archivo unit de systemd creado por Cloudflare se encuentra en `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcloudflared.service`. Su contenido se parece a esto:\n\n```ini\n[Unit]\nDescription=cloudflared\nAfter=network.target\n\n[Service]\nTimeoutStartSec=0\nType=notify\nExecStart=\u002Fusr\u002Fbin\u002Fcloudflared --no-autoupdate tunnel run\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n```\n\nCon este servicio activo, el túnel queda operativo desde el arranque del VPS, sin intervención manual.",{"title":75,"body":76},"Integrar cloudflared en un Docker Compose existente","Si su aplicación ya se ejecuta en un stack de Docker Compose, añada un servicio `cloudflared` en el mismo archivo. El enfoque por token (sin archivo de credenciales) es el más sencillo para un contenedor:\n\n```yaml\nservices:\n  app:\n    image: mon-image\n    networks:\n      - internal\n\n  cloudflared:\n    image: cloudflare\u002Fcloudflared:latest\n    command: tunnel --no-autoupdate run\n    environment:\n      - TUNNEL_TOKEN=${TUNNEL_TOKEN}\n    networks:\n      - internal\n    restart: unless-stopped\n\nnetworks:\n  internal:\n```\n\nDefina `TUNNEL_TOKEN` en un archivo `.env` al mismo nivel. El token se obtiene desde el panel de Cloudflare → Zero Trust → Networks → Tunnels → su túnel → Configure → Conectores Docker. El servicio `cloudflared` y su aplicación comparten la red `internal`; en `config.yml` o mediante el token, apunte a la aplicación por su nombre de servicio Docker (`http:\u002F\u002Fapp:3000` en lugar de `http:\u002F\u002Flocalhost:3000`).",{"type":35,"title":78,"body":79},"Configuración posterior a la instalación","Una vez operativo el túnel, algunos ajustes complementarios mejoran la robustez de la configuración.\n\n**Recuperar la IP real del cliente.** Por defecto, su aplicación recibe las peticiones desde `127.0.0.1` o desde la IP interna del túnel. Para obtener la IP real del visitante, lea la cabecera `CF-Connecting-IP` que Cloudflare inyecta automáticamente. Configure su aplicación o su reverse proxy local para confiar en esa cabecera.\n\n**Cifrado de extremo a extremo.** El túnel cifra la conexión entre `cloudflared` y Cloudflare. La conexión entre `cloudflared` y su aplicación local va en HTTP por defecto (loopback o red interna de Docker). Si su aplicación expone HTTPS en local, añada `originServerName: app.votre-domaine.com` en la regla de ingress correspondiente para que `cloudflared` valide el certificado.\n\n**Varios servicios, un solo túnel.** Un túnel puede exponer varios servicios en subdominios distintos: basta con añadir entradas adicionales en el bloque `ingress` de `config.yml`, antes de la regla catch-all.",{"type":81,"title":82,"body":83},"tip","Hardening: cierre los puertos 80 y 443 entrantes","La principal ventaja de esta arquitectura es poder cerrar todos los puertos entrantes del VPS. Una vez validado el túnel, aplique estas reglas de UFW:\n\n```bash\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\nsudo ufw allow ssh\nsudo ufw enable\n```\n\nSu aplicación sigue siendo accesible a través del túnel de Cloudflare (que se apoya en conexiones salientes), y el puerto SSH permanece abierto para la administración. Ninguna conexión directa al 80 o al 443 llega ya al servidor. Consulte la guía \u003Ca href=\"\u002Fblog\u002Fpare-feu-ufw-vps\">Configurar UFW en un VPS\u003C\u002Fa> para la configuración completa.",{"type":35,"title":85,"body":86},"Cloudflare Tunnel frente a Nginx \u002F Traefik: enfoques complementarios","Una objeción frecuente: «Ya tengo Nginx y Traefik haciendo ese trabajo, ¿por qué añadir una capa de Cloudflare?» La respuesta es que ambos enfoques no resuelven el mismo problema.\n\nUn reverse proxy local (Nginx, Traefik, Caddy) gestiona el enrutamiento entre servicios de la misma red y la renovación del SSL, pero da por supuesto que el tráfico entrante llega al servidor. Si el puerto 443 está bloqueado por la red situada aguas arriba, el reverse proxy no sirve de nada.\n\nCloudflare Tunnel resuelve precisamente lo que el reverse proxy local no puede: el tráfico llega a Cloudflare sea cual sea la conectividad de red del servidor. Los dos son complementarios: puede perfectamente colocar Traefik detrás del túnel para gestionar el enrutamiento interno y dejar que Cloudflare se encargue del TLS público.",{"type":88,"title":89,"headers":90,"rows":94},"comparison","Cloudflare Tunnel frente a un reverse proxy local",[91,92,93],"Criterio","Cloudflare Tunnel","Reverse proxy local (Nginx\u002FTraefik)",[95,99,103,107,111,115],[96,97,98],"Puerto entrante necesario","No — solo conexión saliente","Sí — 80\u002F443 deben estar accesibles",[100,101,102],"TLS público","Gestionado por Cloudflare, automático","Let's Encrypt vía ACME (certbot, Traefik…)",[104,105,106],"IP dinámica \u002F NAT estricto","Transparente — no hay DNS que actualizar","Problemático — requiere un DynDNS o una IP fija",[108,109,110],"Load balancing","Plan de pago (Cloudflare Load Balancing)","Disponible de forma nativa (Traefik, Nginx upstream)",[112,113,114],"Latencia","Ligeramente superior (enrutamiento vía POP de Cloudflare)","Mínima — tráfico directo hacia el servidor",[116,117,118],"Dependencia externa","Sí — Cloudflare debe estar accesible","No — funciona sin terceros",{"type":35,"title":120,"body":121},"Resolución de problemas: mensajes de error frecuentes","**`You must specify an ingress rule that matches all incoming requests`**\nFalta la regla catch-all o está mal ubicada en `config.yml`. Debe ser la última entrada del bloque `ingress`, sin `hostname`, con `service: http_status:404`.\n\n**`Unable to locate config file in default locations`**\n`cloudflared` busca su configuración en `~\u002F.cloudflared\u002Fconfig.yml` o en `\u002Fetc\u002Fcloudflared\u002Fconfig.yml`. Indique la ruta de forma explícita con `cloudflared tunnel --config \u002Fetc\u002Fcloudflared\u002Fconfig.yml run mon-tunnel`.\n\n**`ERR connection to origin timed out` en los logs**\nLa aplicación de destino no es accesible desde `cloudflared`. Compruebe que el servicio local se está ejecutando (`curl http:\u002F\u002Flocalhost:3000`) y que el puerto de `config.yml` coincide. En un contexto de Docker Compose, utilice el nombre del servicio (`http:\u002F\u002Fapp:3000`) en lugar de `localhost`.\n\n**Token caducado: `tunnel credentials file not found` o `token is expired`**\nLos tokens generados desde la interfaz de Cloudflare tienen una vida útil limitada si el conector nunca se ha registrado. Regenere el token desde Zero Trust → Networks → Tunnels → Configure → Conectores y actualice después la variable `TUNNEL_TOKEN` de su `.env`.\n\n**Límites del plan Free: load balancing y SSH por túnel**\nEl plan gratuito no admite load balancing entre varios orígenes. El acceso SSH por túnel (`cloudflared access ssh`) en el plan gratuito requiere una configuración específica de Cloudflare Access y no está activado por defecto. El número de conectores por túnel está limitado a unas pocas instancias en el plan gratuito.",{"type":35,"title":123,"body":124},"Cloudflare Tunnel como arquitectura de referencia en un VPS","Cloudflare Tunnel ilustra bien lo que hace posible el acceso root en un VPS: instalar `cloudflared` como demonio del sistema, modificar las reglas del firewall, controlar servicios systemd. En un alojamiento compartido sin acceso root, ninguno de estos pasos es viable: el demonio no se puede instalar, el firewall no está bajo su control y el servicio no se puede configurar para arrancar con el sistema.\n\nEsta arquitectura encaja especialmente en situaciones donde la conectividad de red es limitada o incierta: laboratorios de desarrollo, oficinas con un firewall corporativo estricto, servidores edge o, simplemente, cuando no se quiere exponer una IP pública. Se combina de forma natural con reverse proxies locales como Traefik o Nginx Proxy Manager para el enrutamiento interno, y con el hardening del sistema para cerrar las superficies de ataque directas.","Un VPS con acceso root para instalar cloudflared","El demonio `cloudflared` y su servicio systemd requieren acceso root, algo que un alojamiento compartido no permite. Un VPS ServOrbit le da el control total: elección de sistema operativo, acceso root, IPv4 dedicada y las plantillas del Marketplace para empezar rápido.","Ver los planes VPS Cloud","\u002Fsolutions\u002Fdeveloppeurs",[130,146,166],{"id":131,"slug":132,"slugs":133,"title":137,"excerpt":138,"readTime":139,"views":140,"isPinned":19,"publishedAt":141,"updatedAt":21,"category":142,"categories":143,"featuredImage":29,"bgImage":30,"posterImage":145,"relatedSolution":29},37,"desplegar-con-nginx-proxy-manager",{"fr":134,"en":135,"ar":136,"es":132},"deployer-avec-nginx-proxy-manager","deploy-your-applications-with-nginx-proxy-manager-on-a-vps","انشر-تطبيقاتك-باستخدام-nginx-proxy-manager-على-خادم-vps","Desplegar sus aplicaciones con Nginx Proxy Manager en un VPS","Gestione dominios, SSL y reverse proxy de varios servicios en un VPS con Nginx Proxy Manager: instalación, redes Docker, errores 502 y ajustes avanzados.",9,2,"2026-05-14T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[144],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-nginx-proxy-manager-poster.svg",{"id":147,"slug":148,"slugs":149,"title":153,"excerpt":154,"readTime":155,"views":156,"isPinned":19,"publishedAt":157,"updatedAt":21,"category":158,"categories":163,"featuredImage":29,"bgImage":30,"posterImage":165,"relatedSolution":29},228,"hardening-inicial-servidor-linux",{"fr":150,"en":151,"ar":152,"es":148},"durcissement-serveur-linux-initial","initial-linux-server-hardening","تصليب-الخادم-linux-الأولي","Endurecimiento (hardening) inicial de un servidor Linux","Cree un usuario sudo, configure SSH con claves y active UFW y fail2ban en Ubuntu o Debian en menos de una hora.",8,0,"2026-08-06T00:00:00+00:00",{"id":155,"name":159,"slug":160,"color":161,"icon":162},"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[164],{"id":155,"name":159,"slug":160,"color":161,"icon":162},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",{"id":167,"slug":168,"slugs":169,"title":173,"excerpt":174,"readTime":139,"views":18,"isPinned":19,"publishedAt":175,"updatedAt":21,"category":176,"categories":177,"featuredImage":29,"bgImage":30,"posterImage":179,"relatedSolution":180},41,"desplegar-aplicaciones-con-coolify-en-un-vps",{"fr":170,"en":171,"ar":172,"es":168},"deployer-avec-coolify","deploy-your-applications-with-coolify-on-a-vps","نشر-تطبيقاتك-باستخدام-coolify-على-vps","Desplegar sus aplicaciones con Coolify en un VPS","Despliegue Coolify en un VPS: instalación, configuración HTTPS, conexión Git, primera aplicación, bases de datos, copias de seguridad y diagnóstico.","2026-05-10T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[178],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":181,"appSlug":182},"despliegue-de-aplicaciones-devops","coolify",1789665009565]