SmartHomeNG hinter einen Reverse Proxy betreiben

Dieser Artikel beschreibt, wie SmartHomeNG hinter einem Reverse Proxy betrieben werden kann. Ein Reverse Proxy ist eine Möglichkeit, Anfragen an einen anderen Server weiterzuleiten. In diesem Beitrag wird der Reverse Proxy dazu verwendet, um auf Informationen und Dienste aus einem anderen Netz zuzugreifen. Es ist sinnvoll, ein internes Netz, oder IoT oder sensibles Netz zu haben, z.B. für die Wärmepumpe, PV Wechselrichter etc. sowie ein normales LAN für die normalen Consumer-Geräte wie Smartphone, Smart TV oder Tablet. Folgende Gründe kann solch eine Trennung haben:

  • Verhindern, das IoT Geräte (vor allem billige IP Cams aus Fernost) nach Hause telefonieren
  • Direkten Zugriff von Extern auf interne Geräte verhindern

Schema

Folgende schematische Darstellung wird angenommen:

Vorausetzungen

Folgende Voraussetzungen müssen gegeben sein:

  • Zwei physisch getrennte Netze (Subnetz od. VLAN)
  • Ein Gateway mit 2 Netzwerkports und installiertem Debian mit Apache2
  • eine laufende SmartHomeNG Instanz
  • eine laufende SmartVISU Instanz

Konfiguration

Die Konfiguration umfasst zwei Bereiche:

  1. Das Admininterface von SmarthomeNG
  2. Das Websocket Modul von SmarthomeNG

SmartHomeNG

Die Module von SmartHomeNG benötigen eine feste IP, da der interne Python Webserver nicht auf mehreren IPs hören kann, im Gegensatz zum Apache. Deshalb im Admininterface unter System, Konfiguration jeweils unter

  • Http Modul
  • Websocket Modul
  • Admin Modul

im Paramter „ip“ eine feste IP eintragen. Es muss die IP des SHNG Hosts sein, empfehlenswert ist die im internen Netz. Diese IP wird dann auch in den nächsten Konfigurationsschritten benötigt und ist gleichzeitig der Platzhalter <ip shng internes Netz>.

Apache2

Grundkonfiguration für das Admin Interface als auch für das Websocket Modul. Zunächst müssen folgende Module aktiviert werden:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

Port konfigurieren

/etc/apache2/ports.conf bearbeiten und folgenden Eintrag hinzufügen:

Listen 80
# Port 8080 für shng Admin 8383
Listen 8080
# Port 2426 für shng Admin 2424
Listen 2426

Site anlegen

Neue Datei unter /etc/apache2/sites-available/ anlegen. Entweder, wie von den Entwicklern empfohlen, die 000-default.conf kopieren oder eine neue Datei mit dem bevorzugten Editor anlegen. Beispiel wie eine neue .conf Datei angelegt werden kann:

cp 000-default.conf 001-shng.conf

Danach die Datei anpassen. Ports der VirtualHosts können frei gesetzt werden. Die Ports von SmarthomeNG müssen korrekt sein. Hier werden die Standard-Ports verwendet.

001-shng.conf
<VirtualHost *:8080>
        # Kommentar wg. der Übersichtlichkeit entfernt, siehe 000-default.conf für Details
        ServerAdmin webmaster@localhost
        #DocumentRoot /var/www/html
        ProxyPass /  http://<ip shng internes Netz>:8383/
        ProxyPassReverse / http://<ip shng internes Netz>:8383/
        ErrorLog ${APACHE_LOG_DIR}/error-8080.log
        CustomLog ${APACHE_LOG_DIR}/access-8080.log combined
</VirtualHost>
 
<VirtualHost *:2426>
        ServerAdmin webmaster@localhost
        #DocumentRoot /var/www/html
        ProxyPass /  ws://<ip shng internes Netz>:2424/
        ProxyPassReverse / ws://<ip shng internes Netz>:2424/
        ErrorLog ${APACHE_LOG_DIR}/error-2426.log
        CustomLog ${APACHE_LOG_DIR}/access-2426.log combined
</VirtualHost>

Site aktivieren und Apache2 neustarten

Die Site wurde soweit vorbereitet und kann nun aktiviert werden:

/etc/apache2/sites-available# a2ensite 001-shng.conf

Nachdem dies getan wurde, erscheint der Hinweis, dass der Apache2 Dienst neu gestartet werden muss:

systemctl restart apache2

Sollte es nicht funktionieren, kann die Seite mit folgendem Befehl wieder deaktiviert werden:

/etc/apache2/sites-available# a2dissite 001-shng.conf

Das SmartHomeNG Admininterface ist nun über beide Netzwerkports über Port 8080 erreichbar z.B. http://192.168.1.1:8080, sofern 192.168.1.1 der Apache Webserver ist.

SmartVISU

Nun kommt die „Magic behind the scences“. Damit das ganze Konstrukt auch funktioniert, muss das Gateway in beiden Netzten den gleichen Hostnamen haben. In der Konfiguration muss nun der Hostname des Gateway eingetragen werden. Achtung: Ohne Angabe der Domain!

Quelle: https://www.serverlab.ca/tutorials/linux/web-servers-linux/how-to-reverse-proxy-websockets-with-apache-2-4/