Cloudflare Tunnel en Raspberry Pi

Exposición segura de servicios Docker

Cloudflare Logo

Introducción

Exponer los sitios web alojados en mi servidor local de manera segura usando un túnel de Cloudflare, evitando exponer toda mi red. Los servicios corren en contenedores Docker sobre una Raspberry Pi Zero 2 W. Este proyecto sirve como laboratorio de prácticas de administración de servidores y seguridad.

Requisitos previos

  • Raspberry Pi configurada (Raspbian sin entorno gráfico).
  • Docker instalado.
  • Dominio registrado.
  • Cuenta de Cloudflare con dominio añadido.
  • Acceso a terminal (SSH o monitor/teclado).
  • Servicios corriendo en Docker.

Contenedores activos

Nombre del contenedor Imagen Puerto interno Puerto host Propósito
nginx_server nginx 80 80 Reverse proxy
josmacpac-site nginx 80 8080 Sitio estático
flask_app app-flask 8000 Aplicación Flask

Unir contenedores a la misma red


sudo docker network connect NOMBRE_RED NOMBRE_CONTENEDOR
docker network ls
docker network inspect NOMBRE_RED
        

Verificamos si todos los contenedores están en la misma red:

docker network inspect NOMBRE_RED

Configurar NGINX como reverse proxy

Editamos el archivo de configuración de NGINX montado en la Raspberry y reiniciamos el contenedor.

La idea es que el túnel acceda a un único puerto, y NGINX actúe como reverse proxy hacia cada servicio.


server {
    listen 80;
    server_name app.dominio.com;
    location / {
        proxy_pass http://flask_app:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name web.dominio.com;
    location / {
        proxy_pass http://josmacpac-site:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
        

Instalar cloudflared en Raspberry Pi

Cloudflared permite crear un túnel seguro entre la Raspberry Pi y Cloudflare, sin abrir puertos en el firewall.


sudo apt update
sudo apt upgrade
curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg >/dev/null

echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list

sudo apt update
sudo apt install cloudflared
        

Autenticación y creación del túnel


cloudflared tunnel login
cloudflared tunnel create NOMBRE_TUNEL
cloudflared tunnel route dns NOMBRE_TUNEL subdominio.dominio.com
        

Después de configurar el subdominio, se puede acceder desde el navegador: http://subdominio.dominio.com

Conclusión

Este método permite exponer solo los servicios necesarios desde la red local sin abrir puertos directamente. Es ideal para prácticas de administración de servidores y despliegue seguro con Raspberry Pi.