Einfacher Proxy Manager

Einfacher HTTPS-Reverse-Proxy-Manager mit virtuellen Hosts, IP-Filterung und automatischem Zertifikat-Reload

Aktueller Release
1.0.0
Entwickler
lubepi
Lizenz
MIT

Einfacher HTTPS/HTTP-Reverse-Proxy-Manager für ioBroker.

Merkmale

  • HTTPS und HTTP parallel – beide Server laufen immer.
  • Protokoll pro Host – Backend mit Zertifikat = HTTPS, ohne Zertifikat = HTTP
  • Zertifikat pro virtuellem Host – ACME (Let's Encrypt), selbstsignierte oder manuell erstellte Zertifikate
  • Konfigurierbare Backends über die Admin-Oberfläche
  • IP-Filterung für interne Dienste (CIDR-basiert, IPv4 + IPv6, mehrere Netzwerke)
  • HTTP → HTTPS-Weiterleitung mit ACME-Challenge-Weiterleitung
  • Automatisches Neuladen des SSL-Zertifikats bei ACME-Erneuerung
  • Warnung über abgelaufenes Zertifikat im Protokoll
  • HSTS (Strenge Transportsicherheit)
  • WebSocket-Unterstützung (z. B. für ioBroker Admin)
  • Dual-Stack IPv4 + IPv6
  • Option „Ursprung ändern“

Voraussetzungen

  • Node.js >= 22
  • ioBroker mit js-controller >= 6.0.11
  • ACME-Adapter für automatische SSL-Zertifikate (optional – auch ohne Zertifikate verwendbar)
  • Die konfigurierten Ports müssen verfügbar sein (Standardwerte: 80 für HTTP, 443 für HTTPS).

Konfiguration

Registerkarte „Allgemein“

EinstellungStandardBeschreibung
HTTPS-Port443Port für HTTPS
HTTP-Port80Port für HTTP – Backends ohne Zertifikat werden hier bedient; mit Zertifikat → Weiterleitung zu HTTPS
ACME-Adapteranschluss0Interner Anschluss des ACME-Adapters (0 = deaktiviert)
HSTS aktivierenStrict-Transport-Security-Header (nur HTTPS)
HSTS-Maximalalter31536000Gültigkeitsdauer des HSTS in Sekunden (1 Jahr)
Prüfintervall1Wie oft werden die Zertifikate überprüft (Stunden)
Ablaufwarnung0Warnung X Tage vor Ablauf (0 = deaktiviert)
Sicherheitsereignisse protokollierenZugriffsverweigerungen (IP-Filterung, WebSocket) als Warneinträge protokollieren
ProtokollanfragenJede eingehende Anfrage (IP, Host, URL) als Debug-Einträge protokollieren

Registerkarte „Backends“

Jedes Backend definiert einen virtuellen Host:

FeldBeschreibung
AktivBackend aktivieren/deaktivieren
HostnameDomain, die über DNS auf diesen Server verweist
Ziel-URLBackend-Adresse (http://IP:Port )
ZertifikatZertifikat vonsystem.certificates Mit Zertifikat = HTTPS + automatische HTTP→HTTPS-Weiterleitung. Ohne Zertifikat = nur HTTP (kein HTTPS für diesen Host).
Zulässige NetzwerkeKommagetrennte CIDR-Netzwerke/IPs (z. B.192.168.0.0/24, fd00::/8 Leer = Zugriff von überall erlaubt.
Ursprung ändernSchreiben Sie den Host-Header auf die Ziel-IP-Adresse um.

Beispielkonfiguration

HostnameZiel-URLZertifikatZulässige NetzwerkeUrsprung ändern
website.example.comhttp://127.0.0.1:3000acme
iobroker.example.comhttp://127.0.0.1:8081default (von ioBroker selbst signiert)192.168.0.0/24
host.example.comhttp://192.168.0.1(kein Zertifikat)192.168.0.0/24, 10.0.0.0/8

In diesem Beispiel:

  • website.example.comHTTPS mit Let's Encrypt-Zertifikat, HTTP-Weiterleitungen zu HTTPS
  • iobroker.example.comHTTPS mit ioBroker-Standardzertifikat (default ), nur lokales Netzwerk
  • host.example.comHTTP (ohne Zertifikat), nur lokales Netzwerk

Staaten

ZustandTypBeschreibung
info.connectionboolescher WertDer Proxy läuft.
certificates.<name>.expiresZeichenketteAblaufdatum des Zertifikats (pro Sammlung)
certificates.<name>.daysLeftNummerTage bis zum Ablaufdatum (pro Kollektion)

Zertifikatsstatus werden dynamisch für jede verwendete Zertifikatssammlung erstellt (z. B.certificates.acme.daysLeft ,certificates.default.expires ).

ACME-Adapterkonfiguration

Der ACME-Adapter muss auf einem anderen Port als 80 laufen, wenn der Proxy auf dem Standardport 80 läuft. ACME-Anfragen werden vom Proxy automatisch an den konfigurierten ACME-Port weitergeleitet.

  1. Stellen Sie den ACME-Adapteranschluss auf 8080 (oder einen beliebigen gewünschten Anschluss) ein.
  2. Stellen Sie im Proxy-Manager denselben Wert wie für den ACME-Adapterport ein.
  3. Geben Sie alle gewünschten Domänen im ACME-Adapter ein.

Zertifikate

Der Adapter liest Zertifikate vonsystem.certificates und bietet drei Arten an:

1. Einzelzertifikate nach Namenskonvention

Dies sind Zertifikate, die der Benutzer manuell über die ioBroker-Systemeinstellungen hinzufügen kann. Alle Schlüssel-/Zertifikatspaare werden insystem.certificates → native.certificates können verwendet werden, sofern sie dieser Namenskonvention folgen:

SchlüsselInhalt
{name}PrivatePrivater Schlüssel (PEM)
{name}PublicZertifikat (PEM)
{name}ChainedVollständige Zertifikatskette (PEM, bevorzugt gegenüberPublic )

Der Basisname{name} Das ist das, was im Dropdown-Menü erscheint und in der Konfiguration gespeichert ist.

Beispiel: Wenn ioBroker die Schlüssel gespeichert hatmyCertPrivate UndmyCertChained ,myCert wird im Dropdown-Menü erscheinen.

Das ioBroker-Standardzertifikat

Das mit ioBroker ausgelieferte selbstsignierte Zertifikat wird unter den Namen gespeichertdefaultPrivate UnddefaultPublic Insystem.certificates Es folgt der gleichen Konvention wie jedes andere Zertifikat:

  • Basisname:default
  • Wird im Dropdown-Menü angezeigt alsdefault
  • Ideal für interne Dienste, die kein öffentlich signiertes Zertifikat benötigen.

2. ACME-Sammlungen

Let's Encrypt-Zertifikate werden automatisch vom ACME-Adapter generiert. Sie werden gespeichert insystem.certificates → native.collections unter dem Namen, der der Sammlung in der ACME-Adapterkonfiguration zugewiesen wurde. ACME-Herausforderungen auf Port 80 werden vom Proxy automatisch an den konfigurierten ACME-Port weitergeleitet.

Pro-Host-Protokoll

Der Adapter entscheidet pro Backend , ob HTTPS oder HTTP verwendet wird:

Backend-ZertifikatHTTP-AnfrageHTTPS-Anfrage
Satz301 Weiterleitung → HTTPSMit SNI-Zertifikat
LeerDirekt bereitgestellt (HTTP)302 Weiterleitung → HTTP

Beide Server laufen parallel . Jeder Backend-Server kann seine eigene Zertifikatsquelle verwenden. SNI (Server Name Indication) wählt während des TLS-Handshakes automatisch das korrekte Zertifikat für den angeforderten Hostnamen aus.

Hosts mit unbekanntem Hostnamen werden auf TLS-Ebene abgewiesen – es wird kein Fallback-Zertifikat verwendet.

Details zum Laden des Zertifikats sind im Debug-Protokoll verfügbar.

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.