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

Установка Nginx Proxy Manager в lxc контейнер

Nginx Proxy Manager (NPM)  — это удобный инструмент с веб-интерфейсом для управления обратным прокси на базе Nginx, который упрощает маршрутизацию трафика к сервисам в Docker, LXC или VM без редактирования конфигов вручную.

Основные функции
Поддерживает проксирование по доменам/поддоменам, автоматическое получение SSL-сертификатов Let's Encrypt, HTTP-аутентификацию, списки доступа (ACL) и блокировку IP. Позволяет настраивать перенаправления, кастомные страницы ошибок и потоки TCP/UDP через Streams.
​

После покупки домена и регистрации его у dns провайдеров у нас появляется возможность реализовать обратный прокси трафика по доменному имени, это позволит нам убрать отображение ip адресов из нашей homelab и реализовать доступ из интернета к веб панелям необходимых нам сервисов.

Установка Nginx Proxy Manager

Для установки NPM в lxc контейнер, нам понадобиться скрипт с сайта https://community-scripts.github.io/ProxmoxVE/scripts?id=nginxproxymanager

А так же VPN подключение на роутере, для того что бы весь трафик в сети шел через VPN, некоторые пакеты в скрипте не доступны из России

В консоли ноды необходимо ввести

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/nginxproxymanager.sh)"

Сообщения о ошибках можно игнорировать, на все вопросы отвечаем Y

Если все в порядке, после установки у вас появится доступ к панели по адресу http://<ip lxc контейнера с portain>:81

Настройка Nginx Proxy Manager

После установки нам необходимо выполнить несколько обязательных вещей

Проброс портов к npm

В OPNsense нам необходимо перейти в раздел раздел Firewall, далее далее NAT NAT и перейти в в Port Forward, в открывшемся окне нажать справа сверху на на +(add)  

В открывшемся окне нужно заполнить поля

Interface: WAN

TCP/IP Version: IPv4

Protocol: TCP

Destination: WAN adress

Destination port range: from: HTTP; to: HTTP

Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера

Redirect target port:  HTTP

Description: NPM HTTP for Let's Encrypt

Нажать кнопку кнопку Save

image.png

После этого нажимаем кнопку кнопку Apply changes changes и создаем следующее правило кнопкой кнопкой +(add)

Interface: WAN

TCP/IP Version: IPv4

Protocol: TCP

Destination: WAN adress

Destination port range: from: HTTPS; to: HTTPS

Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера

Redirect target port: HTTPS

Description: NPM HTTPS for Let's Encrypt

Нажать кнопку кнопку Save

image.png

После этого нажимаем кнопку кнопку Apply changes

Покупка домена reg.ru

Для настройки доменных имен в npm доменное имя необходимо купить по этому поводу уже написана написана подробная статья

После покупки доменного имени и указания его у ДНС провайдера потребуется время что бы запись появилась у ДНС резолверов, проверить это проще всего командой на любом клиенте сети с установленным линукс, я для этих целей создал отдельный тестовый тестовый lxc контейнер

В выводе команды должен отобразится внешний ip адрес, запись проводится в течении 1-24 часов.

Настройка сертификата

Так как мы планируем использовать большое количество поддоменов нам не подходит вариант с обычным запросом сертификата через через certbot, reg.ru ru позволяет запрашивать запрашивать wildcard wildcard сертификат на домен и все поддомены, поэтому мы будем настраивать сразу его.  

На сайте сайте reg.ru  заходишь в личный кабинет, далее Настройки API, запрашиваешь ключ API, его необходимо записать.

В В NPM  нужно создать создать wildcard-сертификат, во вкладке вкладке Certificates Certificates нужно нажать на кнопку кнопку Let's Encrypt via DNS

image.png

В открывшемся окне необходимо заполнить поля
Domain Names: тут указываешь <твоедоменноеимя.ru> и <*.твоедоменноеимя.ru>

DNS Provider: reg.ru

Credentials File Content:
dns_username=<твоя почта на reg.ru>
dns_password=<api колюч>

Propagation Seconds:  Лучше указать 600 так как сервера reg.ru могут работать не стабильно

После этого необходимо нажать кнопку кнопку Save Save и подождать 1-5 минут.

image.png

Настройка split dns

Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить настроить split dns dns на нашем нашем opnsense.  
Технически можно реализовать эту технологию на любом локальном локальном dns dns сервере, но в opnsense уже установлен установлен unbound dns, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку вкладку Services, далее далее Unbound DNS, далее далее Overrides, в открывшемся окне в разделе разделе Hosts Hosts нажать на на +

image.png

В открывшемся окне необходимо заполнить поля

Enabled: Галочка

Host: *

Domain: <твой домен>

Type: A (IPv4 address)

IP address: <ip адрес lxc контейнера>

Description: NPM

Далее нажать кнопку кнопку Save Save и  Apply

image.png

Следующим шагом нужно указать Query forwarding для нашего сертификата, что бы избежать проблем с сертификатами в локальной сети при переходе по нашим доменам.

Для этого необходимо перейти во вкладку вкладку Query forwarding forwarding нажать на  +  и в открывшемся окне заполнить поля

Enabled: Галочка

Domain: ocsp.int-x3.letsencrypt.org

Server IP: 1.1.1.1

Далее нажать нажать Save Save и и Apply

image.png

Теперь необходимо перейти в панель панель npm npm и настроить там группу доступа которую мы будем указывать при создании доменов.

Для этого необходимо перейти во вкладку вкладку Acces list  нажать на кнопку кнопку Add Acces list  и в открывшемся окне заполнить форму

Во вкладке вкладке Details Details необходимо указать имя нашей группы
Во вкладке вкладке Rules Rules необходимо добавить подсети из которых у нас будет доступ к нашим доменам

image.png

Создание и настройка поддомена

Для создания поддомена нам необходимо перейти во вкладку Proxy Hosts и нажать на кнопку Add Proxy Host, в открывшемся окне необходимо заполнить поля

Domain Names: Вводим необходимы домен или поддомен

Scheme: В зависимости от панели к которой хотим открыть доступ выбираем http или https

Forward Hostname / IP: ip нашего сервиса,

Forward Port: Порт нашего сервиса

Access List: в зависимости от того хотим ли что бы сервис работал только локально или был публичным выбираем созданную нами группу доступа или Publicly Accessible

Cache Assets: (Опционально) Включает кэширование статических ресурсов (CSS, JS, изображения) на прокси-сервере для ускорения загрузки страниц, снижая нагрузку на backend-сервер.  
​

Block Common Exploits: (Опционально) Активирует встроенные правила Nginx для защиты от распространённых веб-атак (XSS, SQL-инъекции, кликджекинг) через заголовки безопасности вроде X-Frame-Options и Content-Security-Policy.
​

Websockets Support: (Опционально) Включает поддержку WebSocket-протокола (ws://, wss://), необходимую для real-time приложений вроде чатов, дашбордов или игр (например, Grafana, Homarr в homelab).

image.png

Переходим во вкладку вкладку SSL SSL в открывшемся окне необходимо заполнить поля

SSL Certificate: Указываем созданный нами раннее сертификат

Force SSL: (Опционально) Принудительно перенаправляет весь HTTP-трафик (порт 80) на HTTPS (порт 443) с помощью 301-редиректа, обеспечивая обязательное шифрование.
​

HSTS Enabled: (Опционально) Включает HTTP Strict Transport Security — браузеры запоминают домен как HTTPS-only на заданный период (max-age), предотвращая MITM-атаки и downgrade до HTTP.
​

HTTP/2 Support: (Опционально) Активирует протокол HTTP/2 для мультиплексирования запросов, сжатия заголовков и ускорения загрузки (требует SSL).
​

HSTS Sub-domains: (Опционально) Расширяет HSTS-политику на все поддомены (includeSubDomains), заставляя браузеры применять HTTPS ко всем *.domain.com.
​

image.png

После нажатия кнопки кнопки Save Save домен появится в списке и ресурс станет доступен по заданному домену