Ne, ist es nicht. Wüsste akut auch nicht wozu. Aber ins Image kann ich das mal mit einbauen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Reverse Proxy - Kein Zugriff auf Websocket
Einklappen
X
-
Kaum bin ich der Meinung, ich blicke nginx ein bisschen, schon das nächste Problem
Ich möchte noch gerne eine location für das Netzwerkplugin anlegen. Lokal, also auf Port 80 funktioniert das problemlos. Allerdings wird bei mir immer eine Datei heruntergeladen anstatt der Befehl ausgeführt wird, sobald ich über den Reverse Proxy zugreife. Hab schon mehrere Varianten getestet, aber nix Richtiges..
Im nginx Log steht leider gar nix
Kommentar
-
Onkelandy Ich möchte noch ein paar kleine Verbesserungen vorschlagen:
1. In /etc/nginx/conf.d/<mydomain> könnte die Zeile
location / {
geändert werden zu
location = / {
Dadurch werden nur Request behandelt, welche exakt auf / (ohne Datei oder Ordner) zugreifen.
Es ändert zwar nichts am sichtbaren Verhalten, weil alle nicht-Websocket requests eh nicht weitergeleitet werden, aber es vermeidet die Prüfung auf $http_upgrade jedes beliebigen Requests.
2. Anstatt folgende Prüfungen in jeder location anzugeben, können diese einmalig auf eben server definiert werden und gelten dann für alle locations. Das vermeidet die Redundanz.
satisfy any;
allow 127.0.0.1;
allow 192.168.0.0/16;
allow 10.0.0.0/16;
deny all;
access_by_lua_file /etc/nginx/scripts/hass_access.lua;
if ($allowed_country = no) {
return 403;
}
Das $allowed_country hast du ja sogar bereits dort und damit doppelt.
Evtl. willst du auch das $ssl_client_verify gleich dort für alle locations definieren - oder hast du dieses bewusst beim Websocket weggelassen, wo es ja eigentlich am kritischsten ist? (Funktioniert dies bei Websockets überhaupt?)
3. Zusätzlich würde ich noch ein allow ::1; einfügen, damit auch IPv6 von localhost funktioniert.
Kommentar
-
smai danke für 1, das update ich im blog artikel auch (done)
ich bin ziemlich sicher, dass ich das ssl_client_verify mit android und unter windows erfolgreich mit websockets getestet hatte.
ssl_client_verify habe ich bei mir bewusst nur bei den SHNG/smartvisu Teilen, da ich bspw. auch eine Weiterleitung auf die Synology PhotoStation habe, die die Verwandtschaft mit BasicAuth zugreift.. Definierst Du das oben ausserhalb, reglementierst Du bewusst alle Zugreifenden auf Zertifikate.. Das finde ich pers. zu unflexibel.
Onkelandy die erweiterung für ios schaue ich noch an, derzeit komme ich leider nicht dazuZuletzt geändert von psilo; 29.07.2018, 07:40.
Kommentar
-
Danke für die Hinweise, Smai. Punkt 1 und 3 habe ich im Image eingefügt.
Punkt 2 nach oben zu nehmen funktioniert eigentlich wegen der verschiedenen Passwörter nicht. Das redundante country-if schmeiß ich aber aus den Locations raus. Außerdem kommentiere ich das ssl_client_verify noch aus und geb's nur beispielhaft ein Mal rein. Es ist unnötig mit dem Script und das Script ist für Apple-Geräte nötig. Und funzt auch 100%.
Noch ne Idee wegen des Netzwerkplugins?Zuletzt geändert von Onkelandy; 29.07.2018, 08:17.
Kommentar
-
Hallo und Danke für die wahnsinns-Arbeit!
Ich bin die Anleitung von Onkelandy unter Post #11 durchgegangen, allerdings auf Client-Zertifikate verzichtet - das kommt evtl. noch später.
Schalten kann ich aber leider über den ReverseProxy noch nicht
Dazu habe ich auch noch eine Verständnisfrage:
Was musllo uns ich in der SmartVisu denn in der Config unter Datenverbindung eintragen? Die IP des SmartHomeNG oder den Name des ReverseProxy?
Bei mir ist SmartHomeNG + SmartVisu auf einem System im internen LAN, der ReverseProxy auf einem eigenen System in der DMZ.
Je nachdem was ich eintrage erscheint die Fehlermeldung (beim Zugriff über den ReverseProxy):
Code:wss://ReverseProxy:2424// net::ERR_CONNECTION_CLOSED
Code:wss://IP-SmartVisu/ WebSocket opening handshake timed out
Für die Installation von luacrypto habe ich noch libssl-dev installieren müssen.
Danke schon mal, VG...good byte...
Kommentar
-
Hallo Ihr Lieben.
Vielen Dank für diese Anleitung.
Ich komme mit den ganzen Ports aber leider nicht weiter.
Bei mir liegt das gleiche Problem vor, wie bei dem Thread Eröfner, nur leider hat das nichts mit iOS oder Safari zu tun. Ich kann die smartVISU über den reverse Proxy öffnen, nur sehe ich keine Werte.
Habe mich an die Anleitung
https://www.smarthomeng.de/nginx-als-reverseproxy
gehalten.
Über das lokale LAN klappt alles, nur nicht von außerhalb.
Anbei der Auszug von mir:
# Weiterleitung zu SmartHomeNG (Websocket Schnittstelle) mit Basic Auth
# Nur Verbindungen gegen "/" durchlassen! Also weder auf Dateien noch Verzeichnisse (= nur Websocket Connects)
location = / {
auth_basic "Restricted Area: smartVISU";
auth_basic_user_file /etc/nginx/.smartvisu;
proxy_pass http://192.168.0.120:2424;
}
# Zugriff auf die smartVISU mit Basic Auth
location /smartVISU {
auth_basic "Restricted Area: smartVISU";
auth_basic_user_file /etc/nginx/.smartvisu;
proxy_pass http://192.168.0.120/smartVISU;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Alexa Plugin Weiterleitung
location /alexa {
auth_basic "Restricted Area: Alexa";
auth_basic_user_file /etc/nginx/.alexa;
proxy_pass http://192.168.0.120:9000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Network Plugin Weiterleitung
location /shng {
auth_basic "Restricted Area: SmartHomeNG";
auth_basic_user_file /etc/nginx/.shng;
proxy_pass http://192.168.0.120:8383/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Was genau mache ich falsch?
Ich wäre echt dankbar für Hilfe.
Wenn ihr noch Infos benötigt, dann fragt mich gerne.
Danke
Tim
Kommentar
-
Hier noch meine Plugin Datei
# plugin.yaml
# Der BackendServer stellt eine Übersicht zur Laufzeit dar und liefert Informationen ähnlich wie das CLI Plugin
# Der Zugriff erfolgt über http://<IP oder Name des SmartHomeNG Servers bzw. ip>:<port>
# port wird als Attribut weiter unten definiert
# das Passwort ist zunächst im Klartext anzugeben. In neueren Versionen wird es eine Funktion im Backend geben,
# die aus einem gegebenen Passwort einen Hash erzeugt. Wenn user oder password fehlen gibt es keine Abfrage
BackendServer:
class_name: BackendServer
class_path: plugins.backend
# ip: xxx.xxx.xxx.xxx
port: 8383
updates_allowed: 'True'
threads: 8
user: admin
password: xxxx
language: de
# KNX Verbindung via knxd
knx:
class_name: KNX
class_path: plugins.knx
host: 127.0.0.1
port: 6720
send_time: 21600 # update date/time every 600 seconds, default none
time_ga: 0/0/2 # default none
date_ga: 0/0/1 # default none
# Bereitstellung eines Websockets zur Kommunikation zwischen SmartVISU und SmartHomeNG
visu:
class_name: WebSocket
class_path: plugins.visu_websocket
# ip: 192.168.0.120
port: 2424
# tls: no
wsproto: 4
acl: rw
# Autogenerierung von Webseiten für SmartVISU
smartvisu:
class_name: SmartVisu
class_path: plugins.visu_smartvisu
# '"neue" Linux Versionen (z.B. Debian > 8.x, Ubuntu > 14.x)'
smartvisu_dir: /var/www/html/smartVISU
# nur "alte" Linux-Variationen
# smartvisu_dir: /var/www/smartVISU
# generate_pages: True
# handle_widgets: True
# overwrite_templates: Yes
# visu_style: blk
# Command Line Interface
# wichtig für Funktionsprüfungen solange keine Visu zur Verfügung steht
cli:
class_name: CLI
class_path: plugins.cli
ip: 192.168.0.120
update: 'True'
# alter SQL-Treiber
# [sql]
# class_name: SQL
# class_path: plugins.sqlite
# SQL-Treiber, unterstützt auch die SmartVISU 2.8/2.9
# dazu muß im websocket plugin zwingend die Protokollversion 4 eingetragen sein
sql:
class_name: SQL
class_path: plugins.sqlite_visu2_8
# Onewire Plugin
# [ow]
# class_name: OneWire
# class_path: plugins.onewire
nw:
class_name: Network
class_path: plugins.network
# ip: 0.0.0.0
# port: 2727
tcp: 'yes'
#tcp_acl:
# - 127.0.0.1
# - 192.168.0.120
# udp: 'no'
# udp_acl: '*'
# smarttv:
# geht leider nicht mit der H-Serie
# class_name: SmartTV
# class_path: plugins.smarttv
# host: 192.168.0.151
# port = 55000
# tv_version = classic
# delay: 1
# instance = smarttv1
uzsu:
class_name: UZSU
class_path: plugins.uzsu
autoblind:
class_name: AutoBlind
class_path: plugins.autoblind
# startup_delay_default: 10
# suspend_time_default: 3600
log_level: 1
log_directory: var/log/AutoBlind/
log_maxage: 7
alexa:
class_name: Alexa
class_path: plugins.alexa
service_host: 192.168.0.120
service_port: 9000
Kommentar
-
db55 bitte nutze beim posten von Konfigurationsdaten die Code-Tags des Forums. So geht jede Formatierung verloren und das macht es hilfswilligen unnötig schwer zu verstehen was Du konfiguriert hast und wo Fehler liegen könnten.Viele Grüße
Martin
There is no cloud. It's only someone else's computer.
Kommentar
-
Hallo Martin.
Vielen Dank.
Ich mach das nicht so oft :-)
Anbei nochmal die Dateien:
/etc/nginx/conf.d/…..conf
Code:# Weiterleitung zu SmartHomeNG (Websocket Schnittstelle) mit Basic Auth # Nur Verbindungen gegen "/" durchlassen! Also weder auf Dateien noch Verzeichnisse (= nur Websocket Connects) location = / { auth_basic "Restricted Area: smartVISU"; auth_basic_user_file /etc/nginx/.smartvisu; proxy_pass http://192.168.0.120:2424; } # Zugriff auf die smartVISU mit Basic Auth location /smartVISU { auth_basic "Restricted Area: smartVISU"; auth_basic_user_file /etc/nginx/.smartvisu; proxy_pass http://192.168.0.120/smartVISU; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Alexa Plugin Weiterleitung location /alexa { auth_basic "Restricted Area: Alexa"; auth_basic_user_file /etc/nginx/.alexa; proxy_pass http://192.168.0.120:9000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Network Plugin Weiterleitung location /shng { auth_basic "Restricted Area: SmartHomeNG"; auth_basic_user_file /etc/nginx/.shng; proxy_pass http://192.168.0.120:8383/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Code:# plugin.yaml # Der BackendServer stellt eine Übersicht zur Laufzeit dar und liefert Informationen ähnlich wie das CLI Plugin # Der Zugriff erfolgt über http://<IP oder Name des SmartHomeNG Servers bzw. ip>:<port> # port wird als Attribut weiter unten definiert # das Passwort ist zunächst im Klartext anzugeben. In neueren Versionen wird es eine Funktion im Backend geben, # die aus einem gegebenen Passwort einen Hash erzeugt. Wenn user oder password fehlen gibt es keine Abfrage BackendServer: class_name: BackendServer class_path: plugins.backend # ip: xxx.xxx.xxx.xxx port: 8383 updates_allowed: 'True' threads: 8 user: admin password: xxxx language: de # KNX Verbindung via knxd knx: class_name: KNX class_path: plugins.knx host: 127.0.0.1 port: 6720 send_time: 21600 # update date/time every 600 seconds, default none time_ga: 0/0/2 # default none date_ga: 0/0/1 # default none # Bereitstellung eines Websockets zur Kommunikation zwischen SmartVISU und SmartHomeNG visu: class_name: WebSocket class_path: plugins.visu_websocket # ip: 192.168.0.120 port: 2424 # tls: no wsproto: 4 acl: rw # Autogenerierung von Webseiten für SmartVISU smartvisu: class_name: SmartVisu class_path: plugins.visu_smartvisu # '"neue" Linux Versionen (z.B. Debian > 8.x, Ubuntu > 14.x)' smartvisu_dir: /var/www/html/smartVISU # nur \"alte\" Linux-Variationen # smartvisu_dir: /var/www/smartVISU # generate_pages: True # handle_widgets: True # overwrite_templates: Yes # visu_style: blk # Command Line Interface # wichtig für Funktionsprüfungen solange keine Visu zur Verfügung steht cli: class_name: CLI class_path: plugins.cli ip: 192.168.0.120 update: 'True' # alter SQL-Treiber # [sql] # class_name: SQL # class_path: plugins.sqlite # SQL-Treiber, unterstützt auch die SmartVISU 2.8/2.9 # dazu muß im websocket plugin zwingend die Protokollversion 4 eingetragen sein sql: class_name: SQL class_path: plugins.sqlite_visu2_8 # Onewire Plugin # [ow] # class_name: OneWire # class_path: plugins.onewire nw: class_name: Network class_path: plugins.network # ip: 0.0.0.0 # port: 2727 tcp: 'yes' #tcp_acl: # - 127.0.0.1 # - 192.168.0.120 # udp: 'no' # udp_acl: '*' # smarttv: # geht leider nicht mit der H-Serie # class_name: SmartTV # class_path: plugins.smarttv # host: 192.168.0.151 # port = 55000 # tv_version = classic # delay: 1 # instance = smarttv1 uzsu: class_name: UZSU class_path: plugins.uzsu autoblind: class_name: AutoBlind class_path: plugins.autoblind # startup_delay_default: 10 # suspend_time_default: 3600 log_level: 1 log_directory: var/log/AutoBlind/ log_maxage: 7 alexa: class_name: Alexa class_path: plugins.alexa service_host: 192.168.0.120 service_port: 9000
Kommentar
-
Teilweise ist es notwendig, die iosmarthome Datei zu "hacken" und einen Eintrag hinzuzufügen. Alternativ kannst du die Schritte aus meinem Beitrag in diesem Thread nachstellen, dann ist der Hack nicht nötig...:
Code:open: function () { var protocol = ''; if (!io.address || io.address.indexOf('://') < 0) { // adopt websocket security to current protocol (https -> wss and http -> ws) // if the protocol should be forced, add it to the address protocol = location.protocol === 'https:' ? 'wss://' : 'ws://'; if (!io.address) { // use url of current page if not defined io.address = location.hostname; } if (!io.port) { // use port of current page if not defined and needed if (location.port != '') { io.port = location.port; } else { if (location.protocol == 'http:') io.port = '80'; if (location.protocol == 'https:') io.port = '443'; if (io.address == '192.168.178.100') io.port = '2424' } } } alert(protocol + io.address + ':' + io.port); io.socket = new WebSocket(protocol + io.address + ':' + io.port);
Falls du einen Raspi hast, empfehle ich dir, das Image von mir zu nutzen, da ist alles schon vorkonfiguriert...
Kommentar
-
Onkelandy, ich danke dir!
nicht nur für deine Antwort, sondern für alles, was du in diesem Forum und betreffend Smarthome tust. Danke
wenn du nur noch so nett wärst, mir kurz zu erklären, was du unter "in der Visu KEIN Eintrag unter IP" meinst, du erläutern. Muss auch nur kurz sein, ich stehe da gerade auf dem Schlauch.
vielen Dank für eure Support nochmals
Kommentar
Kommentar