Ankündigung

Einklappen
Keine Ankündigung bisher.

Teaser: Websocket-Proxy mit nginx

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

    [Webserver] Teaser: Websocket-Proxy mit nginx

    Hallo,

    nur ein kleiner Teaser. nginx bietet einen Websocket Proxy.
    Dadurch wird der ganze Websocket-Traffic über den Webserver geschoben => nur ein Port notwendig. Das funktioniert soweit.

    Evtl. kann man auch über den Webserver die Websocket-Verbindung absichern (TLS & BasicAuth). Dann könnten 'Mutige' die Visu mit Port-Forwarding ins Internet stellen. Das habe ich aber noch nicht getestet.

    Die nginx-Config & Anleitung könnte auch ein 'normaler' Benutzer erstellen.

    Bis bald

    Marcus

    #2
    Hallo Marcus,

    das Thema finde ich extrem spannend. Ich habe mich heute kurz mit dem Thema beschäftigt, die Verbindungen nur über einen Port aufzubauen klappt schon. Darf ich fragen, wie du den nginx dazu konfiguriert hast?

    Ich mache derzeit eine Abfrage mit if ($http_upgrade = websocket) um zu entscheiden ob der Traffic durch den Proxy muss oder nicht. Hast du das anders gelöst?

    Das Thema Verschlüsselung schaue ich mir auch noch an, aber ich habe noch nicht wirklich Erfahrung damit, daher will ich nichts versprechen.

    Gruß Felix

    Kommentar


      #3
      Hi,

      bis jetzt sieht die conf so aus:


      Code:
      # /etc/nginx/conf.d/smartvisu.conf 
      upstream smarthome.py {
                  server 127.0.0.1:2424;
      }
      
      server {
          listen       4444;
          server_name  localhost;
      
          #charset koi8-r;
          #access_log  /var/log/nginx/log/host.access.log  main;
      
          location / {
              root   /var/www/smartvisu;
              index  index.html;
          }
      
          location /websocket {
                      proxy_pass http://smarthome.py;
                      proxy_http_version 1.1;
                      proxy_set_header Upgrade $http_upgrade;
                      proxy_set_header Connection "upgrade";
                      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_redirect off;
              }
          #error_page  404              /404.html;
      
          # redirect server error pages to the static page /50x.html
          #
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   /usr/share/nginx/html;
          }
      
          location ~ \.php$ {
              root           /var/www/smartvisu;
              fastcgi_pass   127.0.0.1:9000;
      #       fastcgi_index  index.php;
              fastcgi_param  SCRIPT_FILENAME  /var/www/smartvisu/$fastcgi_script_name;
              include        fastcgi_params;
          }
      
          # deny access to .htaccess files, if Apache's document root
          # concurs with nginx's one
          #
          #location ~ /\.ht {
          #    deny  all;
          #}
      }
      Bis bald

      Marcus

      Kommentar


        #4
        Gibts dafür ein HowTo? Ich würde das auch gerne testen!

        Gesendet von meinem GT-I9505 mit Tapatalk 4

        Kommentar


          #5
          Zitat von fuxl66 Beitrag anzeigen
          Gibts dafür ein HowTo? Ich würde das auch gerne testen!
          Momentan nicht.

          Bis bald

          Marcus

          Kommentar


            #6
            Hi,

            Also was bei mir funktioniert ist der Aufruf per https und wss über den selben Port.
            Der nginx terminiert dabei die Verschlüsselung und reicht den Websocket unverschlüsselt intern weiter.

            Getestet bisher nur mit Firefox. Ich möchte dieses We noch die Clientauthentifizierung per Zertifikat testen.

            Meine Konfiguration kann ich morgen posten.

            Gruß Felix

            Kommentar


              #7
              Würdet ihr mich dabei unterstützen es einzurichten?
              Meine visu ist erstmal soweit fertig und ich würde gerne den Zugang als alternative zu VPN testen.

              Was ist nun zu tun?

              Kommentar


                #8
                Hi,

                Sorry. Ich poste meine Konfiguration heute Abend. Sicher wir das ganze aber erst durch die Clientauthentifizierung und das klappt leider nicht nicht.

                Gruß Felix

                Kommentar


                  #9
                  Hi,

                  hier die Konfig um den Aufruf der Smartvisu und die Websocket Verbindung per ssl zu verschlüsseln. Ich muss ausdrücklich darauf hinweisen, dass diese Konfiguration nicht reicht um den Zugriff über das Internet sicher zu machen.

                  Nginx Site Konfig:
                  Code:
                  server {
                          listen 443 ssl;
                          root /var/www/;
                          index index.html index.htm index.php;
                  
                          # Make site accessible from http://localhost/
                          server_name localhost;
                  
                          # Self-signed certificate.
                          ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
                          ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
                  
                          # Redirect all non-SSL traffic to SSL.
                          if ($ssl_protocol = "") {
                                  rewrite ^ https://$host$request_uri? permanent;
                          }
                  
                          location / {
                                  if ($http_upgrade = websocket) {
                                          proxy_pass http://192.168.178.32:2424;
                                  }
                          }
                  
                          location ~ \.php$ {
                                  fastcgi_split_path_info ^(.+\.php)(/.+)$;
                                  fastcgi_pass unix:/var/run/php5-fpm.sock;
                                  fastcgi_index index.php;
                                  include fastcgi_params;
                          }
                  }
                  Zusätzlich musste ich noch eine Anpassung in dem smarthome driver der Smartvisu vornehmen, damit der Websocket auch verschlüsselt aufgebaut wird. In der Smartvisu wird dabei als dabei als Adresse und Port des Drivers der Proxy eingetragen. Bitte hierfür eine Smartvisu Installation nehmen, ich vermute, dass mit diesen Änderungen der direkte Zugriff nicht mehr funktionert.
                  Zeile 92 in der Datei /var/www/smartvisu/driver/io_smarthome.py.js:
                  Code:
                          io.socket = new WebSocket('wss://' + io.address + ':' + io.port + '/');

                  Kommentar


                    #10
                    Hallo Felix,

                    hast Du mal Basic Auth probiert? Kann man damit den WSS Port absichern?

                    Bis bald

                    Marcus

                    Kommentar


                      #11
                      Wo genau müssen diese conf Dateien nun gespeichert werden?
                      Ist nginx bereits im image vorhanden oder muss das nachinstalliert werden?
                      Danach kann ich mit einer normalen portweiterleitung auf die IP des Raspi von aussen zugegriffen werden?

                      Kommentar


                        #12
                        Hi,

                        Ich gehe davon aus, dass der nginx nicht im Image enthalten ist.
                        Die Konfiguration eignet sich in diesem Stadium noch nicht für einen Zugriff aus dem Internet.
                        Mein Hausbau ist gerade im vollem Gange, daher kann ich dich nicht unterstützen. Diese Konfiguration ist eher advanced und setzt daher ein gewisses Grundwissen vor raus. Du musst erstmal alleine klarkommen.

                        Gruß Felix

                        Kommentar


                          #13
                          Da ich mit openvpn und meinem T-D1 Tarif keine guten Erfahrungen machen konnte, habe ich mir das jetzt genauer angesehen.
                          Derzeit habe ich basic auth im reverse proxy probiert. Das tat erstmal. Ich nutze allerdings das Image nicht, sondern habe den nginx auf einer extra Kiste zu Hause laufen. Der verteilt das dann an den websocket und den http (apache) auf dem Pi.
                          Ich mache da mal weiter und schaue mal, das eine sinnvolle Doku herauskommt.
                          Derzeit zwischen Kistenauspacken und Garten anlegen.
                          Baublog im Profil.

                          Kommentar


                            #14
                            Also mit http gehts ganz gut und problemlos, so lange man einen vernünftigen Internetanschluss nutzt. Sprich, weder bei D1, noch bei Vodafone gehts vernünftig, da die wie wild versuchen, das http Zeugs zu optimieren, komprimieren, etc.
                            ich werde jetzt mal https versuchen, wobei ich nicht noch wss machen wollte, sondern dachte, das das ws dann durch das https getunnelt wird. Mal sehen.

                            Gruß
                            Derzeit zwischen Kistenauspacken und Garten anlegen.
                            Baublog im Profil.

                            Kommentar


                              #15
                              Zitat von greentux Beitrag anzeigen
                              ws dann durch das https getunnelt wird.
                              Nein, wird es leider nicht.

                              Bis bald

                              Marcus

                              Kommentar

                              Lädt...
                              X