26 abril, 2025

NGINX como Reverse Proxy + Certbot (HTTPS) + Cloudflare Tunnel (sin abrir puertos)

¿Quieres exponer servicios desde casa, como Home Assistant, tu blog, o un panel web personalizado?
¿Quieres que funcionen con HTTPS y sin abrir puertos en tu router?
Este tutorial te enseña cómo lograrlo paso a paso

¿Qué es cada cosa?

  • NGINX: Un servidor web muy rápido. Lo usaremos como proxy inverso, es decir, recibe peticiones y las redirige a otros servicios.
  • Certbot: Un bot que obtiene certificados HTTPS gratuitos desde Let’s Encrypt.
  • Cloudflare Tunnel: Un túnel cifrado que conecta tu servidor con internet sin necesidad de abrir puertos.

Requisitos

  • Ubuntu Server (o similar)
  • Tener Docker (opcional, pero recomendado)
  • Dominio administrado por Cloudflare (ej: tudominio.com)
  • Cuenta en Cloudflare

Instalar NGINX

sudo apt update && sudo apt install nginx -y

Para asegurarnos que inicie siempre:

sudo systemctl start nginx
sudo systemctl enable nginx

Verifica que funcione:

sudo systemctl status nginx

Y abre en tu navegador:
http://localhost o la IP de tu servidor → Deberías ver la página de bienvenida de NGINX.

Usar NGINX como reverse proxy

Supongamos que tienes un servicio corriendo en localhost:8123 (como Home Assistant).

Creamos una configuración para el dominio ha.tudominio.com:

sudo nano /etc/nginx/sites-available/homeassistant

Contenido del archivo:

server {
    listen 80;
    server_name ha.tudominio.com;

    location / {
        proxy_pass http://localhost:8123;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Habilitamos la config:

sudo ln -s /etc/nginx/sites-available/homeassistant /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Instalar Certbot + SSL de Let’s Encrypt

Instalamos Certbot:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx

Sigue el asistente y selecciona tu dominio (ej: ha.tudominio.com).
Certbot modificará la config de NGINX para usar HTTPS automáticamente.

Configurar Cloudflare Tunnel (Cloudflared)

Ahora vamos a evitar abrir puertos. Cloudflare Tunnel se encargará de exponer el dominio al mundo.

Instala Cloudflared

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

Inicia sesión

cloudflared tunnel login

Sigue el enlace que se abre en el navegador e inicia sesión en Cloudflare.

Crea el túnel

cloudflared tunnel create proxy-tunnel

Configura el túnel

Edita (o crea) el archivo config.yml en ~/.cloudflared/:

tunnel: proxy-tunnel
credentials-file: /home/TU_USUARIO/.cloudflared/UUID.json

ingress:
  - hostname: ha.tudominio.com
    service: http://localhost:80
  - service: http_status:404

Crear el CNAME en Cloudflare

Ve al panel de Cloudflare, entra a tu dominio y en la sección DNS:

  • Crea un nuevo CNAME
  • Nombre: ha
  • Valor: UUID.tunnel.cloudflare.com (UUID = ID del túnel)

Ejecutar el túnel

cloudflared tunnel run proxy-tunnel

Ahora puedes entrar desde cualquier parte del mundo a: https://ha.tudominio.com

Notaras que tiene certificado HTTPS válido, sin necesidad de abrir ningún puerto.

Correr el túnel en background (como servicio)

sudo cloudflared service install

¡Y listo! El túnel se ejecutará automáticamente al reiniciar.