Когда в домашней лаборатории появляется собственный сайт, один публичный HTTPS-порт приходится делить между несколькими приложениями. До переноса этот вход принимал почтовый сервер. Для работы блога вход перенесён на веб-сервер: он обслуживает сайт непосредственно, а запросы к веб-почте передаёт почтовому серверу.

Почтовые протоколы остаются на прежнем сервере. Изменилось только направление публичного TCP443. Такая граница позволяет развивать сайты, не возлагая обслуживание их публичного входа на почтовую машину.

HTTPS заканчивается дважды

Браузер устанавливает защищённое соединение с веб-сервером. Затем веб-сервер создаёт отдельное HTTPS-соединение с почтовым приложением. Для второго соединения включены SNI и проверка сертификата по доверенным центрам сертификации. Сертификаты двух машин независимы; приватные ключи между ними не копировались.

Первая проверка proxy выявила ошибку 502: стандартной глубины проверки Nginx не хватало для действующей цепочки Let’s Encrypt. Проверка самой цепочки через OpenSSL прошла успешно. После увеличения допустимой глубины до пяти веб-почта начала отвечать 200. Отключать проверку TLS не потребовалось.

Proxy заново задаёт заголовки адреса клиента. Почтовый сервер доверяет этому адресу только от веб-сервера. Это предотвращает использование произвольного входящего заголовка как доверенного адреса.

Публичный вход не делает публичными все сайты

На веб-сервере уже была тестовая копия другого проекта. Перед открытием общего HTTPS-входа для неё добавлено ограничение по источнику запросов. Отдельная ранняя проверка в Nginx закрывает также диагностический URL, который возвращает ответ до обычной проверки доступа. Неизвестные HTTPS-домены отклоняются.

Административные разделы почты через публичный proxy возвращают 403. Вход в административную часть блога ограничен. Доступ владельца через домашний VPN сохранён: проверены вход в блог, тестовый сайт и прямой вход в почтовую админку.

Как проверялся результат

Перед изменениями сохранены правила firewall и конфигурация веб-сервера, подготовлен порядок отката. Nginx прошёл проверку синтаксиса перед перезагрузкой. Сначала проверена работа нового входа напрямую из VPN, затем изменено перенаправление HTTPS на маршрутизаторе.

После переключения независимые внешние узлы получили HTTPS 200 от блога и веб-почты. Внешние проверки входа в систему управления сайтом и панель управления почтой получили 403. Счётчики маршрутизатора подтвердили прохождение соединений через новое правило. Для остальных закрытых почтовых разделов и тестовых сайтов проверен ответ 403 с недоверенного локального адреса; это отдельная проверка правил приложения, а не внешнего NAT.

В системе мониторинга существующие проверки блога, почтовых служб и веб-сервера оставались доступными. Для нового proxy добавлена отдельная HTTPS-проверка веб-почты с проверкой TLS и уведомлениями: она проходит через веб-сервер до почтового приложения. Первый heartbeat подтвердил ответ 200. Существующий локальный монитор почтового приложения сохранён.

В результате веб-сервер принимает общий публичный HTTPS, а почтовый сервер продолжает выполнять почтовую роль. Добавление сайтов больше не требует размещать их вход на почтовой машине.