ioBroker Jarvis von Extern via Reverse-Proxy erreichbar machen

Lesedauer: 3 Minuten

Natürlich gibt es – wie immer – mehrere Herangehensweisen, um Jarvis von Extern zu erreichen. Ich selbst benutze sowohl die Variante per VPN (Wireguard) als auch die Variante mit einem Reverse-Proxy, der bei mir allerhand Aufgaben übernimmt.

Eins vorab: Eine Jarvis-Installation “einfach so” freizugeben ist fahrlässig und kann im schlimmsten Falle bedeuten, das jemand von außerhalb die Kontrolle über Dein Smart-Home übernimmt!

Installation des Apache2 Reverse-Proxy

Zuvor bringen wir das System auf den aktuellen Stand:

apt update && apt upgrade -y

Danach installieren wir Apache2

sudo apt install -y apache2

Sobald Apache installiert wurde, bitte einige Anpassungen vornehmen:

Module aktivieren

sudo -s
a2enmod rewrite headers env dir mime

Modul anpassen

nano /etc/apache2/mods-available/http2.conf

und diesen Text vor dem Inhalt einfügen

# mod_http2 doesn't work with mpm_prefork
<IfModule !mpm_prefork>
Protocols h2 h2c http/1.1
H2Direct on
H2StreamMaxMemSize 5120000000
[...]

Neustart von Apache2

systemctl restart apache2.service

Standardseite von Apache kopieren und deaktivieren

cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-jarvis.conf
a2dissite 000-default.conf

vHost anpassen

nano /etc/apache2/sites-available/001-jarvis.conf

Datei öffnen, folgenden Inhalt anlegen und die hervorgehobenen Zeilen anpassen

<VirtualHost *:80>
    ServerName jarvis.domain.de
    ServerAlias jarvis.domain.de
    ServerAdmin jarvis@domain.de

    ErrorLog /var/log/apache2/jarvis_error.log
    CustomLog /var/log/apache2/jarvis_access.log combined
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =jarvis.domain.de
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

vHost aktivieren

a2ensite 001-jarvis.conf && systemctl restart apache2.service

Certbot installieren und Let’s Encrypt Zertifikate beantragen

Bevor Du den nächsten Schritt ausführst, solltest Du sicherstellen, das der Port 80 und 443 von deinem Router auf den Server durchgereicht werden, da der Certbot von Let’s Encrypt eine live Prüfung vornimmt und den Apache-Server erreichen muss.

apt install -y certbot python3-certbot-apache
certbot --apache

Nachdem das Zertifikat erstellt wurde, kannst du die Datei anpassen, damit sie für Jarvis funktioniert.

Zuerst legen wir eine Sicherheitskopie für den Fall der Fälle an.

mv /etc/apache2/sites-available/001-jarvis-le-ssl.conf /etc/apache2/sites-available/001-jarvis-le-ssl.conf.bak

Jarvis vHost mit SSL und Passwort Schutz

Datei öffnen, folgenden Inhalt anlegen und die hervorgehobenen Zeilen anpassen.

nano /etc/apache2/sites-available/001-jarvis-le-ssl.conf
<IfModule mod_ssl.c>
   SSLUseStapling on
   SSLStaplingCache shmcb:/var/run/ocsp(128000)
   <VirtualHost *:443>
      SSLCACertificateFile /etc/letsencrypt/live/jarvis.domain.de/fullchain.pem
      SSLCertificateFile /etc/letsencrypt/live/jarvis.domain.de/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/jarvis.domain.de/privkey.pem

      #######################################################################
      # For self-signed-certificates only!
      # SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
      # SSLCACertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
      # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
      #######################################################################

      Protocols h2 h2c http/1.1
      Header add Strict-Transport-Security: "max-age=15552000;includeSubdomains"
      ServerAdmin jarvis@domain.de
      ServerName jarvis.domain.de
      ServerAlias jarvis.domain.de

      SSLEngine on
      SSLCompression off
      SSLOptions +StrictRequire
      SSLProtocol -all +TLSv1.3 +TLSv1.2
      SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
      SSLHonorCipherOrder off
      SSLSessionTickets off
      ServerSignature off
      SSLStaplingResponderTimeout 5
      SSLStaplingReturnResponderErrors off
      SSLOpenSSLConfCmd Curves X448:secp521r1:secp384r1:prime256v1
      SSLOpenSSLConfCmd ECDHParameters secp384r1
      LogLevel warn

      ErrorLog /var/log/apache2/jarvis_error.log
      CustomLog /var/log/apache2/jarvis_access.log combined

      ProxyPassMatch (.*)(\/jarvis-socket)$ "ws://10.0.0.1:8400/$1$2"
      ProxyPass / http://10.0.0.1:8400/
      ProxyPassReverse / http://10.0.0.1:8400/

      <Proxy *>
         Order deny,allow
         Allow from all
         AuthType Basic
         AuthName "Password Required"
         AuthUserFile /etc/apache2/.htpasswd
         Require valid-user
      </Proxy>
   </VirtualHost>
</IfModule>

In den Zeilen 39, 40 und 41 gibst Du die IP Deines Jarvis an, inklusive des Ports von 8400 – dies ist der direkte Port von Jarvis und umgeht den Verkehr über den Webserver des ioBroker.

In Zeile 39 wird der sogenannte WebSocket von Jarvis angesprochen. Dies ist eine “Standleitung”, die nicht abbricht – so werden alle Informationen (Status-Änderungen usw) bi-direktional ausgetauscht. Hier kannst Du auch gerne wss (WebSocketSecure) verwenden, welches aber nicht nötig ist, da der Reverse-Proxy innerhalb deines Netzwerk auch prima ohne SSL oder WSS auskommt. Der Browser wirft zwar einen Fehler, das er nicht zu wss:// verbinden kann – dies kann aber getrost ignoriert werden.

Benutzer für Jarvis im Apache anlegen

sudo htpasswd -c /etc/apache2/.htpasswd <Benutzer>

Hier wirst Du nach einem Passwort und der Wiederholung des Passworts gefragt.

Für jeden weiteren Benutzer, bitte nicht das Argument -c angeben, um die Datei nicht zu überschreiben:

sudo htpasswd /etc/apache2/.htpasswd <AndererBenutzer>

Sicherheit erhöhen und aktivieren

Hiermit erstellen wird einen 4096 Bit langen Schlüssel. Es kann bei einem Raspberry Pi in etwa 6 – 10 Minuten in Anspruch nehmen. Bei schnelleren System geht dies natürlich binnen Minuten. Auch hier bitte wieder die hervorgehobenen Zeilen anpassen.

openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
cat /etc/ssl/certs/dhparam.pem >> /etc/letsencrypt/live/jarvis.domain.de/fullchain.pem

Nun kann der Apache neu gestartet werden.

systemctl restart apache2.service

Jarvis über https aufrufen

Nachdem Du nun alle Einstellungen getätigt hast, kannst natürlich auch Jarvis von extern erreichen. Dies geschieht mit:

https://jarvis.domain.de

Nach dem Eingeben von Benutzername und Passwort wird – wenn alles richtig eingestellt und konfiguriert wurde – Jarvis geladen und Du kannst es genauso bedienen, wie in deinem Heimnetz.

Wie hat Dir der Beitrag gefallen?
Bewertung: 4.7/5 - abgegebene Bewertungen: 3

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert