Ankündigung

Einklappen
Keine Ankündigung bisher.

Reverse Proxy - Kein Zugriff auf Websocket

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Ne, ist es nicht. Wüsste akut auch nicht wozu. Aber ins Image kann ich das mal mit einbauen.

    Kommentar


      #17
      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


        #18
        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


          #19
          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 dazu
          Zuletzt geändert von psilo; 29.07.2018, 07:40.

          Kommentar


            #20
            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


              #21
              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
              bzw
              Code:
              wss://IP-SmartVisu/ WebSocket opening handshake timed out
              Und noch was:
              Für die Installation von luacrypto habe ich noch libssl-dev installieren müssen.

              Danke schon mal, VG
              ...good byte...

              Kommentar


                #22
                Kleines, nicht unwichtiges Detail
                In der SmartVISU wird als Quelle SmarthomeNG angegeben, allerdings IP und Port LEER gelassen.

                Kommentar


                  #23
                  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


                    #24
                    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


                      #25
                      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


                        #26
                        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;
                            }
                        }
                        Plugin.yaml
                        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


                          #27
                          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);
                          Bei io.adress == 'xxx' musst du die IP deines shng Geräts eintragen. Wichtig ist auf jeden Fall, dass in der Visu KEIN Eintrag unter IP angegeben ist.

                          Falls du einen Raspi hast, empfehle ich dir, das Image von mir zu nutzen, da ist alles schon vorkonfiguriert...

                          Kommentar


                            #28
                            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


                              #29
                              Auf der Configseite der Visu lässt du unter Datenquelle die Felder IP und Port leer.

                              Der Hack oben ist übrigens von psilo.

                              Kommentar


                                #30
                                Die IP im "Hack" muss er übrigens auch anpassen ;-)

                                Kommentar

                                Lädt...
                                X