Перейти к основному содержимому

Настройка Nginx + Let's Encrypt обратный прокси перед Yucca

Введение​

В этой инструкции я опишу как настроить Nginx и выпустить Let's Encrypt SSL сертификат, который будет автоматически продлеваться. Nginx будет выступать как простой Web сервер перед Yucca для терминации SSL сессии и редиректа с 80 на 443 порт.
Зачем вообще устанавливать Nginx, ведь Yucca и сама может терминировать SSL и даже флаги есть? Это верно, но когда вы займёте 443 порт он будет недоступен для другого ПО, придется использовать какой-то другой, а так же не будет редиректа с HTTP на HTTPS – если вас это устраивает, то можете смело пропускать секцию с установкой и настройкой Nginx Шаг 1 и сразу перейти на Шаг 2.
Все действия я буду проделывать на Ubuntu Server 22.04, но всё тоже самое будет работать и на SUSE, CentOS, Fedora, Debian и так далее. Разве что пакетный менеджер у всех будет свой, но я надеюсь вы отличите apt от zypper 🙂

Шаг 0. Подготовка​

И так нам понадобится:

  1. Хост с белым IP адресом
  2. Домен или поддомен который смотрит на этот адрес
  3. Установленная Yucca

В инструкции я буду использовать домен foobar.yuccastream.com, ваш домен будет отличаться.

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

Итак у меня есть Yucca, которая доступна по адресу http://foobar.yuccastream.com:9910

Шаг 1. Установка и настройка Nginx​

Устанавливаем nginx:

sudo apt install nginx

Проверяем http://foobar.yuccastream.com

nginx2

Далее создаём конфигурационный файл для Yucca:

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

Домен foobar.yuccastream.com вам нужно заменить на свой

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;
}
}

Сохраните файл и проверьте корректность конфигурации:

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

Если всё корректно вы увидите syntax is ok Обновляем конфигурацию nginx:

nginx -s reload

Обновляем страничку и видим уже веб интерфейс Yucca http://foobar.yuccastream.com

nginx3

Шаг 2. Установка Certbot и выпуск letsencrypt сертификата​

Устанавливаем пакеты:

sudo apt install certbot python3-certbot-nginx

Выпускаем сертификат для нашего домена:

warning

Домен foobar.yuccastream.com вам нужно заменить на свой

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

nginx4

Сertbot попросит ввести E-mail (1), рекомендую ввести ваш реальный ящик, в случае если сертификат будет истекать и не продлиться автоматически Let's Encrypt пришлёт вам об этом уведомление. Также нужно будет согласится с условиями и правилами (2), (3). Далее certbot сам найдёт нужный конфигурационный файл с нужным доменом, настроит секцию с SSL и редирект, на выходе покажет вам ссылку. Можете посмотреть что в итоге получилось в файле /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
}

Рекомендую проверить, что certbot создал таймер для продления сертификата, он должен быть активен:

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.

Обновляем страницу http://foobar.yuccastream.com и видим что всё работает уже через HTTPS, редирект тоже работает.

nginx5

Шаг 3. Настройка безопасности​

Мы настроили досту по HTTPS через nginx, но Yucca до сих пор доступна по HTTP на адресе http://foobar.yuccastream.com:9910. Это связанно вот с этой настройкой по умолчанию:

listen_address = ":9910"

Идём в конфигурационный файл Yucca и правим этот параметр:

sudo nano /opt/yucca/yucca.toml

Делаем так, чтобы Yucca слушала только localhost:

listen_address = "127.0.0.1:9910"

И перезагружаем сервер Yucca:

sudo systemctl restart yucca

Проверяем, теперь по адресу http://foobar.yuccastream.com:9910 ничего нет, а тут https://foobar.yuccastream.com всё работает.