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
  • cloudflared instalado 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.