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
Contents
¿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.