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

Установка и настройка Nginx proxy manager в docker portainer, настройка split dns, настройка wildcard-сертификата

После установки docker portainer

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

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

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

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

Для установки Nginx Proxy Manager (npm) в docker через portainer, нам необходимо перейти в веб-интерфейс portainer

http://<ip lxc контейнера>:9000

В веб интерфейсе необходимо перейти в docker

image.png

Слева или в центре экрана выбрать Stacks

image.png

Слева сверху выбрать +Add stack

image.png

В name указать название нашего контейнера npm

image.png

Ниже в поле для ввода кода Web editor, вводим код нашего docker-compose файла

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'    # HTTP
      - '443:443'  # HTTPS
      - '81:81'    # Админка NPM
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    environment:
      DISABLE_IPV6: 'true'

После ввода необходимо нажать кнопку Deploy the stack

image.png

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

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

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

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

В OPNsense нам необходимо перейти в раздел Firewall, далее 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 и создаем следующее правило кнопкой +(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 контейнер

dig <ваш домен>

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

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

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

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

В NPM нужно создать wildcard-сертификат, во вкладке 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 колюч>

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

image.png

Настройка split dns

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

image.png

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

Enabled: Галочка

Host: *

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

Type: A (IPv4 address)

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

Description: NPM

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

image.png

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

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

Enabled: Галочка

Domain: ocsp.int-x3.letsencrypt.org

Server IP: 1.1.1.1

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

image.png

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

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

Во вкладке Details необходимо указать имя нашей группы
Во вкладке 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 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 домен появится в списке и ресурс станет доступен по заданному домену