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

Простой менеджер обратного прокси HTTPS с виртуальными хостами, IP-фильтрацией и автоматической перезагрузкой сертификатов

Текущий релиз
1.0.0
Разработчик
lubepi
Лицензия
MIT

Простой менеджер обратного прокси HTTPS/HTTP для ioBroker.

Функции

  • HTTPS + HTTP параллельно – оба сервера работают постоянно.
  • Протокол для каждого хоста : бэкэнд с сертификатом = HTTPS, без сертификата = HTTP.
  • Сертификат для каждого виртуального хоста – ACME (Let's Encrypt), самоподписанный или созданный вручную.
  • Настраиваемые бэкэнды через административный интерфейс.
  • Фильтрация IP-адресов для внутренних служб (на основе CIDR, IPv4 + IPv6, несколько сетей)
  • Перенаправление HTTP → HTTPS с использованием переадресации запросов ACME.
  • Автоматическая перезагрузка SSL-сертификата при продлении сертификата ACME.
  • Предупреждение об истечении срока действия сертификата в журнале.
  • HSTS (Строгая транспортная безопасность)
  • Поддержка WebSocket (например, для административной панели ioBroker)
  • Двойной стек IPv4 + IPv6
  • Изменить параметр «Источник»

Предварительные требования

  • Node.js >= 22
  • ioBroker с js-controller >= 6.0.11
  • Адаптер ACME для автоматического получения SSL-сертификатов (опционально – также может использоваться без сертификатов).
  • Настроенные порты должны быть доступны (по умолчанию: 80 для HTTP, 443 для HTTPS).

Конфигурация

Вкладка «Общие»

ПараметрПо умолчаниюОписание
Порт HTTPS443Порт для HTTPS
HTTP-порт80Порт для HTTP — здесь обслуживаются бэкэнды без сертификата; с сертификатом → перенаправление на HTTPS.
Порт адаптера ACME0Внутренний порт адаптера ACME (0 = отключен)
Включить HSTSЗаголовок Strict-Transport-Security (только для HTTPS)
HSTS максимальный возраст31536000Срок действия HSTS в секундах (1 год)
Контрольный интервал1Как часто проверяются сертификаты (в часах)
Предупреждение об истечении срока действия0Предупреждение за X дней до истечения срока действия (0 = отключено)
Регистрируйте события безопасности.В логах регистрируются предупреждения о запрете доступа (фильтрация IP-адресов, WebSocket).
Запросы журналовЗаписывайте каждый входящий запрос (IP-адрес, хост, URL) в качестве отладочных записей.

Вкладка "Бэкенды"

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

ПолеОписание
АктивныйВключение/отключение бэкэнда
Имя хостаДомен, указывающий на этот сервер через DNS
Целевой URLАдрес бэкэнда (http://IP:Port )
СертификатСертификат отsystem.certificates С сертификатом = HTTPS + автоматическое перенаправление HTTP→HTTPS. Без сертификата = только HTTP (без HTTPS для этого хоста).
Разрешенные сетиСети/IP-адреса CIDR, разделенные запятыми (например)192.168.0.0/24, fd00::/8 Пусто = доступ из любого разрешенного места.
Изменение происхожденияПерепишите заголовок Host на целевой IP-адрес.

Пример конфигурации

Имя хостаЦелевой URLСертификатРазрешенные сетиИзменение происхождения
website.example.comhttp://127.0.0.1:3000acme
iobroker.example.comhttp://127.0.0.1:8081default (Самоподписано ioBroker)192.168.0.0/24
host.example.comhttp://192.168.0.1(без сертификата)192.168.0.0/24, 10.0.0.0/8

В этом примере:

  • website.example.comHTTPS с сертификатом Let's Encrypt, HTTP перенаправляет на HTTPS
  • iobroker.example.comHTTPS с использованием сертификата ioBroker по умолчанию (default ), только локальная сеть
  • host.example.comHTTP (без сертификата), только локальная сеть

Штаты

СостояниеТипОписание
info.connectionлогическийПрокси-сервер запущен
certificates.<name>.expiresнитьСрок действия сертификата (на каждую выдачу)
certificates.<name>.daysLeftчислоКоличество дней до истечения срока действия (за один сбор)

Состояния сертификатов создаются динамически для каждой используемой коллекции сертификатов (например,certificates.acme.daysLeft ,certificates.default.expires ).

Конфигурация адаптера ACME

Если прокси-сервер работает на порту 80 по умолчанию, адаптер ACME должен работать на порту, отличном от 80. Запросы ACME автоматически перенаправляются прокси-сервером на настроенный порт ACME.

  1. Установите порт адаптера ACME на 8080 (или любой другой желаемый порт).
  2. Установите то же значение, что и для порта адаптера ACME в менеджере прокси.
  3. Введите все необходимые домены в адаптер ACME.

Сертификаты

Адаптер считывает сертификаты изsystem.certificates и предлагает три типа:

1. Индивидуальные сертификаты, выдаваемые по системе именования.

Это сертификаты, которые пользователь может добавить вручную через системные настройки ioBroker. Все пары ключ/сертификат хранятся вsystem.certificates → native.certificates их можно использовать при условии соблюдения следующего соглашения об именовании:

КлючСодержание
{name}PrivateЗакрытый ключ (PEM)
{name}PublicСертификат (PEM)
{name}ChainedПредпочтительнее использовать полную цепочку сертификатов (PEM).Public )

Базовое имя{name} Это то, что отображается в выпадающем списке и хранится в конфигурации.

Пример: Если ioBroker сохранил ключиmyCertPrivate иmyCertChained ,myCert появится в выпадающем списке.

Сертификат по умолчанию ioBroker

Самоподписанный сертификат, поставляемый с ioBroker, хранится под именамиdefaultPrivate иdefaultPublic вsystem.certificates Он соответствует тем же правилам, что и любой другой сертификат:

  • Базовое имя:default
  • Отображается в выпадающем списке какdefault
  • Идеально подходит для внутренних служб, которым не требуется сертификат, подписанный публичным лицом.

2. Коллекции ACME

Сертификаты Let's Encrypt автоматически генерируются адаптером ACME. Они хранятся вsystem.certificates → native.collections под именем, присвоенным коллекции в конфигурации адаптера ACME. Запросы ACME на порту 80 автоматически перенаправляются прокси-сервером на настроенный порт ACME.

Протокол для каждого хоста

Адаптер определяет для каждого бэкэнда , будет ли использоваться HTTPS или HTTP:

Сертификат бэкэндаHTTP-запросHTTPS-запрос
НаборПеренаправление 301 → HTTPSОбслуживался с сертификатом SNI.
ПустойПодается напрямую (HTTP)302 перенаправление → HTTP

Оба сервера работают параллельно . Каждый бэкэнд может иметь свой собственный источник сертификатов. SNI (Server Name Indication) автоматически выбирает правильный сертификат для запрошенного имени хоста во время рукопожатия TLS.

Сообщения от хостов с неизвестным именем хоста отклоняются на уровне TLS — резервный сертификат не используется.

Подробная информация о загрузке сертификата доступна в журнале отладки.

Changelog

1.0.0 (2026-07-07)

  • (copilot) Adapter requires node.js >= 22 now

0.1.10 (2026-04-29)

  • Harden error handling: certificate loading, renewal, cleanup and adapter teardown are now individually guarded so a single failure no longer aborts the entire operation
  • Fix: register server error/close handlers before calling listen() (correct Node.js pattern)
  • Code quality: remove inconsistent typeof this.terminate guards, rename misleading certHashes to certPemCache, fix template literal formatting

0.1.9 (2026-04-06)

  • Optimize logging behavior: request logs now use debug level, transient backend restart errors are logged as debug with details, and startup logs are less noisy ...
  • Harden certificate handling: hosts with configured but unavailable certificates now fail closed for HTTPS/WSS instead of falling back silently
  • Improve info.connection state handling: state is now true only when both HTTP and HTTPS listeners are active

0.1.8 (2026-03-26)

  • Update GitHub Actions test matrix (Node.js 20, 22, 24)
  • Address reviewer suggestions (use node: prefix, specific state roles, interval limiting)
  • Fix linting errors

0.1.7 (2026-03-20)

  • Docs: remove generic installation section per S6014

License

MIT License

Copyright (c) 2026 lubepi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.