Saltar al contenido principal

Configuración de un proxy inverso Nginx + Let's Encrypt delante de Yucca

Introducción

En esta guía voy a describir cómo configurar Nginx y emitir un certificado SSL de Let's Encrypt que se renovará automáticamente. Nginx actuará como un servidor web simple delante de Yucca para terminar la sesión SSL y redirigir del puerto 80 al 443. ¿Por qué instalar Nginx si Yucca puede terminar SSL por sí misma e incluso tiene flags para eso? Es cierto, pero al ocupar el puerto 443, quedará no disponible para otro software y tendrá que usar uno diferente, y tampoco habrá redirección de HTTP a HTTPS; si esto le resulta aceptable, puede omitir sin problema la sección de instalación y configuración de Nginx, el Paso 1, e ir directamente al Paso 2. Realizaré todos los pasos en Ubuntu Server 22.04, pero todo funcionará igual en SUSE, CentOS, Fedora, Debian, etc. La única diferencia es que cada uno tiene su propio gestor de paquetes, pero espero que sepa distinguir apt de zypper 🙂

Paso 0. Preparación

Entonces, esto es lo que necesitaremos:

  1. Un host con una dirección IP pública
  2. Un dominio o subdominio que apunte a esa dirección
  3. Yucca instalada

En esta guía usaré el dominio foobar.yuccastream.com, su dominio será diferente.

nslookup foobar.yuccastream.com
Server: 127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name: foobar.yuccastream.com
Address: 128.140.2.103

nginx1

Entonces, tengo Yucca, que está disponible en http://foobar.yuccastream.com:9910

Paso 1. Instalación y configuración de Nginx

Instalamos nginx:

sudo apt install nginx

Comprobamos http://foobar.yuccastream.com

nginx2

A continuación, creamos un archivo de configuración para Yucca:

sudo nano /etc/nginx/conf.d/yucca.conf
aviso

Debe reemplazar el dominio foobar.yuccastream.com por el suyo

upstream yucca_upstream {
server 127.0.0.1:9910 fail_timeout=0;
}

server {
listen 80;
server_name foobar.yuccastream.com;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://yucca_upstream;
}
}

Guarde el archivo y verifique que la configuración sea correcta:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si todo es correcto, verá syntax is ok Recargamos la configuración de nginx:

nginx -s reload

Actualizamos la página y ya vemos la interfaz web de Yucca en http://foobar.yuccastream.com

nginx3

Paso 2. Instalación de Certbot y emisión de un certificado Let's Encrypt

Instalamos los paquetes:

sudo apt install certbot python3-certbot-nginx

Emitimos un certificado para nuestro dominio:

aviso

Debe reemplazar el dominio foobar.yuccastream.com por el suyo

sudo certbot --nginx -d foobar.yuccastream.com

nginx4

Certbot pedirá un E-mail (1); le recomendamos ingresar su casilla real, ya que si el certificado está por vencer y no logra renovarse automáticamente, Let's Encrypt le enviará una notificación al respecto. También deberá aceptar los términos y condiciones (2), (3). A continuación, certbot encontrará por sí mismo el archivo de configuración correcto con el dominio necesario, configurará la sección SSL y la redirección, y al final le mostrará un enlace. Puede ver cómo quedó el resultado en el archivo /etc/nginx/conf.d/yucca.conf


upstream yucca_upstream {
server 127.0.0.1:9910 fail_timeout=0;
}

server {
server_name foobar.yuccastream.com;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://yucca_upstream;
}

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/foobar.yuccastream.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/foobar.yuccastream.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
if ($host = foobar.yuccastream.com) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80;
server_name foobar.yuccastream.com;
return 404; # managed by Certbot
}

Recomendamos verificar que certbot haya creado un temporizador para la renovación del certificado; debe estar activo:

sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2023-09-22 11:54:02 UTC; 7min ago
Trigger: Fri 2023-09-22 14:13:25 UTC; 2h 11min left
Triggers: ● certbot.service

Sep 22 11:54:02 foobar systemd[1]: Started Run certbot twice daily.

Actualizamos la página http://foobar.yuccastream.com y vemos que todo ya funciona por HTTPS, y la redirección también funciona.

nginx5

Paso 3. Configuración de seguridad

Configuramos el acceso por HTTPS a través de nginx, pero Yucca sigue estando disponible por HTTP en http://foobar.yuccastream.com:9910. Esto se debe a la siguiente configuración predeterminada:

listen_address = ":9910"

Vaya al archivo de configuración de Yucca y edite este parámetro:

sudo nano /opt/yucca/yucca.toml

Haga que Yucca escuche solo en localhost:

listen_address = "127.0.0.1:9910"

Y reinicie el servidor Yucca:

sudo systemctl restart yucca

Comprobamos que ahora en http://foobar.yuccastream.com:9910 no hay nada, mientras que https://foobar.yuccastream.com funciona correctamente.