Ankündigung

Einklappen
Keine Ankündigung bisher.

Reverse Proxy - Websocket Zugriff

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

    Reverse Proxy - Websocket Zugriff

    Hallo zusammen,

    nach dem Umstieg auf 2.9 möchte ich mich dem Thema Reverse Proxy nochmals annehmen.

    Situation:
    Ich habe eine aktuelle Installation SmartVisu 2.9 (git branch develop) und smarthome.py (git branch master).
    Apache läuft auf Port 80 - für das lokale Netzwerk - tut prima.
    Nginx soll auf Port 443 als Reverse Proxy. Port-Freischaltung auf dem Router dafür ist erfolgt.

    Beim Zugriff über den Reverse Proxy bekomme ich die SmartVisu angezeigt, aber keine Informationen über die Websockets.

    Frage: Müssen auch im aktuellen Code noch Anpassungen am Treiber io_smarthome.py.js vorgenommen werden?

    Habe ich irgendwas anderes übersehen? Nginx config wie folgt:

    Code:
    server {
            listen 443 ssl default_server;
    
            server_name smarthome.meinedomain.de;
            server_tokens off;
            access_log /var/log/nginx/smarthome.log combined;
            #error_log /var/log/nginx/error.smarthome.log debug;
            include /etc/nginx/conf.d/letsencrypt;
    
            location /smarthome {
                    auth_basic "smarthome";
                    auth_basic_user_file /etc/nginx/htpasswd;
                    proxy_pass http://192.168.0.245/smarthome/;
                    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;
            }
    
            location = / {
                    auth_basic "smarthome";
                    auth_basic_user_file /etc/nginx/htpasswd;
                    proxy_pass http://192.168.0.245:2424;
            }
    }

    SmartVisu:

    Code:
    driver = "smarthome.py"
    driver_address = "192.168.0.245"
    driver_autoreconnect = true
    driver_port = "2424"
    smarthome.py:

    Code:
    websocket:
         plugin_name: visu_websocket
         #ip: 0.0.0.0
         #port: 2424
         #tls: yes
         wsproto: 4
         acl: rw
    Danke fürs drauf schauen.
    Grüße Thomas

    #2
    Nein es müssen keine Änderungen mehr anderjs gemacht werden. Aber eigentlich wenn du schon apache hast, brauchst du nicht extra nginx als reverse proxy.

    Ich habe dazu schon eine Anleitung auf der smarthomeNG Seite angelegt.

    https://www.smarthomeng.de/reverse-p...isu-mit-apache

    Grüße ebenfalls zurück,
    Thomas

    Kommentar


      #3
      Hallo Thomas,

      danke. Habe ich eben mal ausprobiert. Leider genau das gleiche Problem.
      -> Es funktioniert bei mir wenn ich Edge als Browser nehme. Chrome auf Windows und auf iOS und auch Safari gehen nicht.
      Ich vermute also ich habe noch irgendwo ein Config Fehler, bin für jeden Tipp dankbar.

      Grüße Thomas

      Kommentar


        #4
        Ok, das Problem ist das Basic Auth, wenn ich das deaktiviere funktioniert es.
        Warum das so ist, schau ich mir morgen an.

        Kommentar


          #5
          Wenn du nochmal deine Apache-Konfig beschreibst, kann ich gerne noch mal drüber sehen. Nginx kann ich nur leider nicht aushelfen... damit hab ich mich nie beschäftigt.
          Denn normal funktioniert das mit dem Basic Auth überall.
          Bist du sicher auch den Nginx beended zu haben, wenn du das auf Apache umgebaut hast?

          Du kannst ja mal für dich prüfen, was hier als Ausgabe raus kommt
          Code:
          netstat -napt|grep apache
          Gruß

          Kommentar


            #6
            Hallo Thomas,
            danke für deine Unterstützung. Eventuell übersehe ich etwas ganz einfaches :-)

            Im Debug log kann ich nichts finden. Dort habe ich immer ein
            Code:
            AH01626: authorization result of Require valid-user : granted,
            Aber das wird für das "normale" http ohne upgrade sein nehme ich an.

            Laut forensic log ist der Request der selbe egal ob mit oder ohne Auth für den Proxy.

            Chrome Dev Debug sagt der connect finden jeweils zu der richtigen Adresse wss://meine.domain.de statt. Bei eingeschaltetem Auth kommt es aber gar nicht erst zu einem Handshake. Ich bekomme irgendwann einen Timeout.

            vHost Config:
            Code:
            <VirtualHost 192.168.0.245:443>
                    ServerName smarthome.meinedomain.de
            
                    DocumentRoot /var/www/html
                    
                    ErrorLog /var/log/apache2/smarthome.error.log
                    ForensicLog /var/log/apache2/smarthome.forensic.log
                    LogLevel debug
                    CustomLog /var/log/apache2/smarthome.access.log combined
            
                    ServerSignature On
                    SSLEngine on
                    SSLCertificateFile /etc/letsencrypt/live/home.meinedomain.de/fullchain.pem
                    SSLCertificateKeyFile /etc/letsencrypt/live/home.meinedomain.de/privkey.pem
                    SetEnv nokeepalive ssl-unclean-shutdown
            
                    Include /etc/apache2/smartvisu.conf
            </VirtualHost>
            Smartvisu.conf

            Code:
            <IfModule mod_rewrite.c>
               RewriteEngine on
            
               RewriteCond %{REQUEST_URI} ^/smarthome$ [NC,OR]
               RewriteCond %{REQUEST_URI} ^/smarthome/$ [NC]
               RewriteRule .* /smarthome/index.php [R=302,L]
            
               <IfModule mod_proxy.c>
            
                  ProxyPreserveHost On
                  ProxyVia On
            
                  RewriteCond %{QUERY_STRING} transport=polling [NC]
                  RewriteRule /(.*) http://localhost:2424/$1 [P]
            
                  RewriteCond %{HTTP:Upgrade} websocket [NC]
                  RewriteRule /(.*) ws://localhost:2424/$1 [P]
            
               </IfModule>
            
            </IfModule>
            
            <Location />
               AuthName "Private"
               AuthType Basic
               AuthUserFile /etc/apache2/htpasswd.smarthome
               Require valid-user
            </Location>

            Wenn ich das Basic Auth nur für die
            Code:
            <Location /smarthome>
            mache. Dann funktioniert es besten.

            Wenn ich den Proxy Bereich manuell schütze geht es auch nicht
            Code:
            <Proxy *>
                  AuthType Basic
                  AuthName "Passwortgeschützter Bereich"
                  AuthUserFile /etc/apache2/htpasswd.smarthome
                  require valid-user
                  </Proxy>

            Es schaut mir so aus als würde Chrome user&password für den upgrade stream nicht übermitteln. Mit MS Edge da geht es auch bei eingeschaltenem Auth.

            Grüße
            Thomas

            Kommentar


              #7
              Während ich so getippt habe..habe ich mal noch ein paar Sachen ausprobiert
              - Mein installierter Chrome Version 77.0.3865.75 - geht nicht
              - Neuer Chrome Portable Version 77.0.3865.90 - geht
              - Chrome auf iOS - geht nicht
              - Chrome auf Android - geht

              Scheint also ein Browser Bug zu sein. Mit Welchen Browser nutzt du es?

              Kommentar


                #8
                Also ich benutze Firefox auf Android/Linux/Windows genau so wie Chrome auf den drei Plattformen ohne Probleme.

                In der Visu hast du auch das ganze wie folgt eingestellt?

                Screenshot_20191001_233055.png

                Siehst du ob was in sh.ng rein kommt? Wenn du das Admin bzw. backend Plugin drauf hast, findest du dort unter Plugins einen Link zu dem visu_websocket plugin. Dort unter den Clients sollte localhost gelistet sein.

                Du kannst glaube nicht das ws allein schützen. Ein Auth muss vorher auf der Visu stattgefunden haben, damit er das dann dem ws mit übergibt.

                Ausserdem hab ich dir mal meine Daten von der ws Anfrage mitgeliefert, evtl. kannst du das damit besser vergleichen. Wie du dort sehen kannst, wird das Authorisation: Basic mit übergeben. Ist die Anfrage Adresse auch über https für den websocket Aufruf?

                Screenshot_20191001_233903.jpg

                Ansonnsten...:
                https://stackoverflow.com/questions/...for-websockets
                https://stackoverflow.com/questions/...me-without-ssl

                Hoffe mit den Tipps kommst du weiter
                Zuletzt geändert von TCr82; 01.10.2019, 23:15.

                Kommentar


                  #9
                  Hallo Thomas,

                  danke, passt soweit. Danke für deine Unterstützung.
                  Ich hatte nicht mehr so auf dem Schirm, dass Chrome auf iOS ja auch WebKit und nicht Chromium verwendet. Deshalb funktioniert das Basic Auth auch mit Chrome auf iOS nicht.

                  Grüße Thomas

                  Kommentar

                  Lädt...
                  X