
Пришла пора навести порядок на всех своих сайтах домашней лаборатории. Есть несколько неудобств, которые хочется победить.
- Все сервисы крутятся на разных IP адресах и портах, пользоваться этим неудобно.
- У сервисов нет доменных имён.
- SSL сертификаты отсутствуют.
Проблему с разными IP адресами и портами можно решить с помощью проксирующего сервера. К примеру, можно развернуть Nginx или, чтобы уже было красиво, Nginx Proxy Manager.
Nginx Proxy Manager — это готовый Docker контейнер, который позволяем развернуть простой и доступный обратный прокси-сервер с возможностью терминации SSL.
Проблему с отсутствуем доменных имён можно решить, развернув собственный локальный DNS сервер, собственно, раньше я так и делал. Такой сервер можно развернуть даже на роутере, добавив нужные нам статические DNS записи.
Mikrotik — настройка DNS сервера
Проблему с SSL тоже можно решить, развернув собственный локальный центр сертификации и сгенерировав сертификаты для нужных доменных имён. Правда, придётся добавлять корневые сертификаты на каждое устройство в локальной сети. Не всегда это можно сделать.
Если всё обобщить, то придётся развернуть центр сертификации, DNS сервер, прокси сервер, всё это настроить, выпустить сертификаты, загрузить на все домашние устройства корневые сертификаты. Как-то избыточно для домашней лаборатории. Будем действовать по-другому, но нам понадобится домен, он у меня есть.
Прокси сервер
Используем Nginx Proxy Manager. Я разворачиваю его на TrueNAS.
TrueNAS — разворачиваем Nginx Proxy Manager
Устанавливаю его как приложение.
Nginx Proxy Manager заработал. Пользователь по умолчанию:
- Email: admin@example.com
- Пароль: changeme
На маршрутизаторе настраиваем переадресацию портов 80 и 443 на Nginx Proxy Manager.
Пока оставляем прокси и переходим к DNS.
DNS
В качестве DNS сервера будем использовать внешний DNS сервер CloudFlare. Он доступен на бесплатном тарифе, это нам не будет ничего стоить. Тариф FREE включает в себя "Быстрый и простой в использовании DNS".

Регистрируем там аккаунт. Добавляем в сервисе DNS наш внешний домен.
В личном кабинете регистратора доменных имен в настройках домена прописываем NS серверы Cloudflare, при добавлении домена подскажут какие прописывать. После этого ждём когда изменения разлетятся по миру, на это может уйти до 48 часов.
По сути мы развернули DNS для нашего домена в Cloudflare.

И добавляем в DNS A запись вида *.наш.домен
с локальным IP адресом нашего сервиса Nginx Proxy Manager в нашей локальной сети. А почему бы и нет? Понятно что в Интернете он работать не будет, но в нашей домашней сети — вполне.

Любой поддомен третьего уровня теперь будет резолвиться в IP адрес нашего прокси сервера. А нам это и нужно.
SSL
Займёмся сертификатами. Nginx Proxy Manager умеет автоматически запрашивать SSL сертификат Let's Encrypt. Для выпуска сертификата требуется подтвердить владение домена, для этого существует два способа:
- Подтвердить владение по HTTP на 80 порту.
- Подтвердить владение с помощью TXT записи в DNS сервере домена.
Для Let's Encrypt существует автоматическая среда управления сертификатами ACME, с её помощью всякие утилиты типа certbot автоматически могут выпускать и обновлять SSL сертификаты по HTTPS. Однако, классический способ работы с сертификатами по HTTP протоколу нам не подойдёт. Из-за того, что в DNS записях для сервисов домашней лаборатории прописывается локальный IP адрес, из Интернета некуда пойти проверить владение доменом. Остаётся второй способ.
Второй способ требует записать TXT запись на сервера DNS нашего домена. Вручную это делать неудобно, поэтому можно воспользоваться сервисами DNS, которые имеют API для управления DNS записями. Собственно, поэтому мы и перенесли наш DNS на Cloudflare. И Nginx Proxy Manager как раз умеет работать с этим API.
В Nginx Proxy Manager переходим в раздел сертификатов и запрашиваем новый Let's Encrypt сертификат.

Будем выпускать wildcard сертификат, указываем домен *.наш.домен
. Соглашаемся с лицензионным соглашением. Ставим таймайт 120 секунд, указываем email. Включаем Use a DNS Challenge, в качестве провайдера выбираем Cloudflare. Понадобится токен "Cloudflare API token".
Токен генерируем в личном кабинете Cloudflare. Выбираем наш домен. Справа в разделе API находим ссылку Get your API token. Жмём.

Генерируем новый токен, Create Token.

Выбираем шаблон Edit zone DNS.

В качестве зоны выбираем наш домен. Continue to summary.
Сгенерированный токен вставляем в форму Nginx Proxy Manager, нажимаем Save. Начинает запрашиваться сертификат.

Через пару минут wildcard SSL сертификат выпущен! Мы близки к цели.

Создаём Access List, указываем в нём нашу домашнюю подсеть. Я это делаю потому, что у меня Nginx Proxy Manager будет обслуживать не только внутренние домены, но и внешние. Нужно запретить вход снаружи из Интернет на локальные ресурсы, а то хакеров полно.

Создаём новый хост прокси (если ранее его не создали), указываем любой поддомен третьего уровня нашего домена. Указываем IP адрес и порт нашего сервиса. У меня подопытный — это WebUI самого Nginx Proxy Manager. Не забываем включить Access List.

Включаем SSL и выбираем созданный ранее wildcard сертификат. Save.

Пробуем зайти на придуманный нами поддомен, попытка успешна. Домен открылся. SSL присутствует. Добавлю ещё пачку поддоменов для остальных своих сервисов. Этот процесс значительно проще, новые поддомены добавляются несколькими кликами.

Работает. Естественно, где-то пришлось подкручивать гайки. К примеру, TrueNAS захотел включённые вебсокеты. Jellyfin не стал без установленной галки передавать данные за прокси. ESXi работает на HTTPS, нужно внимательно прописывать протоколы. Zabbix без проблем заработал.
Теперь домашние сайты работают по SSL.
У если нет домена?
Если собственного домена нет, не беда. Некоторые DNS серверы для этих целей предлагают свои поддомены третьего уровня. Вот подробное видео: