Cloudflare Tunnel: expón tu servidor en casa sin abrir puertos
Tengo un Mac mini M4 en casa que sirve esta web, el blog, Moodle y varias herramientas. Durante mucho tiempo asumí que para exponer algo a internet tenía que abrir puertos en el router, lidiar con IPs dinámicas y rezar para que el ISP no me bloqueara el tráfico entrante. Cloudflare Tunnel resolvió todo eso de golpe.
Qué es Cloudflare Tunnel
Cloudflare Tunnel es un servicio gratuito que crea una conexión saliente cifrada entre tu servidor y la red de Cloudflare. En lugar de que internet llegue a tu servidor, es tu servidor el que sale a buscar a Cloudflare. Resultado: ningún puerto abierto, ninguna IP expuesta, ningún problema con el router.
El tráfico llega así:
Usuario → Cloudflare (CDN + SSL) → Tunnel → Tu servidor en casa
Todo cifrado, con el certificado SSL gestionado automáticamente por Cloudflare.
Por qué es mejor que las alternativas
- Sin IP dinámica: da igual si tu ISP te cambia la IP cada día
- Sin puertos abiertos: el router ni se entera de que tienes un servidor
- SSL automático: Cloudflare gestiona los certificados, sin Let’s Encrypt ni renovaciones manuales
- Protección DDoS incluida: el plan gratuito ya absorbe ataques básicos
- Zero Trust: puedes restringir el acceso a subdominios enteros a usuarios concretos
Requisitos
- Una cuenta en Cloudflare (gratuita)
- Un dominio gestionado por Cloudflare
cloudflaredinstalado en el servidor
En macOS con Homebrew:
1brew install cloudflared
Configuración paso a paso
1. Autenticarse
1cloudflared tunnel login
Abre el navegador, seleccionas el dominio y listo.
2. Crear el túnel
1cloudflared tunnel create mi-servidor
Guarda el UUID que devuelve — lo necesitarás.
3. Crear el archivo de configuración
1# ~/.cloudflared/config.yml
2tunnel: <UUID-del-tunnel>
3credentials-file: /Users/tuusuario/.cloudflared/<UUID>.json
4
5ingress:
6 - hostname: web.tudominio.com
7 service: http://localhost:80
8 - hostname: moodle.tudominio.com
9 service: http://localhost:80
10 - service: http_status:404
4. Crear los registros DNS
1cloudflared tunnel route dns mi-servidor web.tudominio.com
2cloudflared tunnel route dns mi-servidor moodle.tudominio.com
Esto crea automáticamente los registros CNAME en Cloudflare apuntando al túnel.
5. Arrancar el túnel
1cloudflared tunnel run mi-servidor
Para que arranque automáticamente al iniciar el sistema:
1sudo cloudflared service install
2sudo launchctl start com.cloudflare.cloudflared
Cómo lo uso yo
En mi caso tengo varios subdominios pasando por el túnel: la web principal, Moodle en aula.sergiocomeron.com y el entorno de desarrollo. Apache recibe todas las peticiones en localhost:80 y las enruta por VirtualHost según el ServerName.
Una cosa importante: Cloudflare actúa como proxy inverso, así que la IP que llega a Apache es la de Cloudflare, no la del visitante. Para recuperar la IP real hay que indicarle a Apache que use la cabecera CF-Connecting-IP:
1RemoteIPHeader CF-Connecting-IP
2RemoteIPTrustedProxy 127.0.0.1 ::1
Sin esto, todos los accesos aparecen en los logs con la IP de Cloudflare y el rate limiting por IP no funciona correctamente.
Zero Trust: acceso restringido por usuario
Si tienes un subdominio que solo quieres que uses tú — un panel de administración, un servicio interno — Cloudflare Zero Trust permite protegerlo con login de Google, GitHub o email sin tocar el código de la aplicación. Lo configuras en el dashboard de Cloudflare y el túnel hace el resto.
Conclusión
Llevo más de un año con esta configuración en producción sin un solo problema. El plan gratuito de Cloudflare cubre todo lo que necesita un servidor personal o de pequeña empresa. Si tienes un servidor en casa y todavía estás abriendo puertos en el router, Cloudflare Tunnel es el cambio más fácil y seguro que puedes hacer.