Homeassistant via reverse proxy zugänglich machen
Einleitung
Aufgrund einiger Erweiterungen, welche ich gezwungenermaßen Nutzen
muss, muss ich meine Smart Homeinstallation aus dem Internet zugänglich
machen.
Da ich weder einen Port auf meinem Router öffnen möchte, noch
die HASS installation in eine DMZ packen will, habe ich mich dazu
entschienden, mein Homeassistant via VPN Tunnel und Reverse Proxy
zugänglich zu machen.
Im folgenden zeige ich, wie ich meinen Debian
Server konfiguriert habe um dies zu ermöglichen und welche Fallstricke
bei mir zu beachten waren.
In dieser Anleitung gehe ich davon aus,
dass bereits eine Homeassistant Installation und ein funktionierender
Apache2 Webserver vorhanden sind.
Homeassistant
Zuerst müssen wir Homeassistant zur Nutzung eines Reverse Proxys konfigurieren, da HASS diese Verbindung ansonsten von Haus aus blockiert. Dafür tragen wir in der confiiguration.yaml folgendes ein:
http:
# server_host: 127.0.0.1 - Nur möglich, wenn Proxy auf der selben Maschine wie HASS läuft...
#Erlaubt diue Nutzuing des forward headers, dafür muss proxy auf whitelist
use_x_forwarded_for: true
#ich habe nur 1 proxy, daher nur eine IP (auch Netz (z.B. /24) ist möglich)
trusted_proxies: 192.168.100.1
cors_allowed_origins:
- https://hass.jr.local
- https://open.domain.com
Die Proxy Server IP (intern) muss an das vorliegende Netz angepasst werden!
Sobald das geschehen ist, könnt ihr unter Developer Tools > YAML – Die Konfigurationsdatei prüfen und dann neustarten.
Debain Server
Hier sind mir einige Fallstricke begegnet, gerade nach der Anmeldung hatte ich zu Anfang immer die Fehlermeldung (Unable to Connect to Homeassistant) ich hoffe, dass dieser Fehler euch erspart bleibt. In meinem Fall hatte ich Routen vergessen einzutragen, die der Proxy weitergeben soll und dass die Header angepasst werden sollen… Im folgenden meine Konfiguration
Unter /etc/apache2/sites-availiable legen wir eine neue Config datei an, bei mir heißt diese
hass.rev.proxy.conf
<VirtualHost *:80> #euer Port, den ihr im Netz ansprechen wollt
ServerName <<euer Servername>> bei mir ###.justinritter.de
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/hassError.log
CustomLog ${APACHE_LOG_DIR}/hassAccess.log combined
RemoteIPInternalProxy 192.168.100.1 #eure proxy IP
RemoteIPHeader X-Forwarded-For
<Location "/">
Satisfy any
</Location>
<Location "/api">
Satisfy any
</Location>
ProxyPreserveHost On
ProxyRequests off
#Da ich nur SSL nnutze, muss ich die SSL Engine verwenden und die Zertifikatsprüfung für intern deaktivieren
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire off
SSLProxyCheckPeerName off
#Im folgenden die unterschiedlichen "Routen", die weitergegeben werden sollen
# die urls müssen an die eigene Adresse angepasst werden
# Wenn ihr zwischen Proxy und HASS SSL nutzt, dann nutzt ebenfalls https://* und wss:// - alternativ http:// und ws://
ProxyPass / https://hass.jr.local/
ProxyPassReverse / https://hass.jr.local/
ProxyPass /api/websocket wss://hass.jr.local/api/websocket
ProxyPassReverse /api/websocket wss://hass.jr.local/api/websocket
ProxyPass /auth/external/callback https://hass.jr.local/auth/external/callback
ProxyPassReverse /auth/external/callback https://hass.jr.local/auth/external/callback
# AUch hier die eigene Adresse eintragen
RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) wss://hass.jr.local/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) https://hass.jr.local/$1 [P,L]
# Wenn ihr nach aussen hin (WAN) SSL nutzt, dann hier die eigenen Zertifikate eintragen
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/cert/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cert/privkey.pem
</VirtualHost>
Als nächstes müsst ihr die Seite aktivieren mit a2ensite <<Seitenname>>
und zusätzlich müsst ihr noch die folgenden Apachemodule aktivieren
- mod_proxy (a2enmod mod_proxy)
- proxy (a2enmod proxy)
- proxy_http (a2enmod proxy_http)
- proxy_wstunnel (a2enmod proxy_wstunnel)
- remoteip (a2endmod remoteip)
- rewrite (a2enmod rewrite)
Nachdem das geschafft ist, nur noch apache2 neustarten
sudo service apache2 restart
Zuletzt müssen ggf. noch eure Firewall o.Ä. angepasst werden und dann kann es losgehen…
In meinem Fall muss ich den Traffic durch den Tunnel bei meiner Firewal (ufw) freigeben.
Back…