Ankündigung

Einklappen
Keine Ankündigung bisher.

Reverse Proxy

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

    #31
    Ich hab's jetzt mal so versucht.
    Code:
    upstream php {    
      server localhost:9090;
    }    
    
    server {    
      listen 80 default_server;    
      server_name xyz.spdns.eu;    
      satisfy any;    
      allow 192.168.1.0/24;    
      deny all;    
      auth_basic "SmartVisu Anmeldung";    
      auth_basic_user_file /etc/nginx/htpasswd.smartvisu;    
      root /var/www/html;    
      index index.php index.html index.htm;    
    
      location / {       
        if ($http_upgrade = websocket) {
                proxy_pass http://192.168.1.13:2424;
            }
    
      }    
    
      location ~ \.php$ {      
        include /etc/nginx/fastcgi_params;          
        fastcgi_pass 127.0.0.1:9090;          
        fastcgi_read_timeout 300;        
        fastcgi_index index.php;      
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
      }    
    
     location /.well-known {              
        allow all;    
      }
    
    }  
     # Alexa  
    
    server {    
      listen 443 ssl default_server;    
      server_name xyz.spdns.eu;    
      access_log /var/log/nginx/alexa.log combined;    
    
      include /etc/nginx/include.d/common;      
    
      location / {        
    
        if ($http_upgrade = websocket) {
                proxy_pass http://192.168.1.13:2424;
            }
    #        if ($http_upgrade != websocket) {
    #             return 403;
    #        }
    
        auth_basic "Alexa";    
        auth_basic_user_file /etc/nginx/htpasswd.alexa;
    
        proxy_pass http://192.168.1.13: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;    
      }  
    }
    Das bringt jedoch keine Änderung.
    Wenn ich
    Code:
    # if ($http_upgrade != websocket) {
    #     return 403;
    # }
    das stehen lasse, geht auch Alexa nicht mehr.

    Wo müsste man den smarthome io.treiber anpassen?

    Kommentar


      #32
      wo stehen denn die ganzen SSL sachen bei Dir? Ich würde zudem erstmal nur HTTP Port 80 ODER HTTPS Port 443 versuchen.. Sonst kann es da komische nebeneffekte geben. Schau Dir bitte mein gesamtes File im anderen Thread an

      ssl on;
      ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.deprivkey.pem;
      ssl_session_cache builtin:1000 shared:SSL:10m;
      ssl_ciphers HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;

      Kommentar


        #33
        achja und was wird denn hier included?
        include /etc/nginx/include.d/common;

        noch ein guter Tipp: in die Logs schauen und Fehleranalyse machen ;-) Anders wirst Du den Thema nicht Herr werden.

        Gegen welche URL geht denn Alexa? Bei mir gegen "/alexa". da habe ich natürlich das HTTP_UPGRADE NICHT drin. Das prüft eben explizit auf eine Websocket-Verbindung und das ist etwas anderes als der Callback, den AWS macht.. die Websocket-Verbindung hast Du nur von SV nach SH. Wenn Dich das VPN nicht stört würde ich aber ernsthaft eher den Use Case "SmartVISU im VPN" und Alexa via NGINX anstreben.. Wenn Du kein VPN willst, musst Du an Clientzertifikaten vorbei.. Und das wird noch heftiger als das hier

        Ich übertrage nochmal - hier sieht man gut unterschiedliche Regeln je Kontextpfad.. :

        Code:
        server {
            server_tokens off;
        
            if ($allowed_country = no) {
                return 403;
            }    
            if ($http_user_agent ~* LWP::Simple|BBBike) {
                return 403;
            }
            if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex) ) {
                 return 403;
            }
        
            listen 443 ssl default_server;
            server_name xxx.dyndns.de;
        
            ##
            # SSL
            ##
        
            ssl on;
            ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.de/privkey.pem;
            ssl_session_cache builtin:1000 shared:SSL:10m;
            ssl_ciphers    HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;
        
            ssl_client_certificate /etc/ssl/ca/certs/ca.crt;
            ssl_crl /etc/ssl/ca/private/ca.crl;
            ssl_verify_client optional;
            # client certifcate creation: https://arcweb.co/securing-websites-nginx-and-client-side-certificate-authentication-linux/
            ssl_session_timeout 5m;
        
        
            ##
            # HSTS
            ##
        
            add_header Strict-Transport-Security "max-age 31536000; includeSubDomains";
        
            ##
            # global
            ##
        
            root /var/www/xxx.dyndns.de;
            index index.php index.htm index.html;
        
        [COLOR=#00FF00]  location / {    
                if ($ssl_client_verify != SUCCESS) {
                        return 403;
                        break;
                }
        
                if ($http_upgrade = websocket) {
                    proxy_pass http://192.168.178.100:2424;
                }
                if ($http_upgrade != websocket) {
                     return 403;
                }
            }[/COLOR]
        
        [COLOR=#EE82EE]  location = /privacy.htm { }    [/COLOR]
        
        [COLOR=#FFA07A]  location /smartVISU {
                if ($ssl_client_verify != SUCCESS) {
                    return 403;
                    break;
                }
                #auth_basic "Restricted Area: smartVISU";
                #auth_basic_user_file /etc/nginx/.htpasswd;
        
                if ($allowed_country = no)  {
                        return 403;
                }
                proxy_pass https://192.168.178.100/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;
            }[/COLOR]
        
            location /video {
                if ($ssl_client_verify != SUCCESS) {
                    return 403;
                    break;
                }
                #auth_basic "Restricted Area: FlurCam";
                #auth_basic_user_file /etc/nginx/.flurcam;
        
                if ($allowed_country = no)  {
                        return 403;
                }
                proxy_pass http://192.168.178.40/video;
                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;
                proxy_set_header Authorization "Basic xxxxxxxxxxxxxxxxxxxxxxx";
            }
        
        [COLOR=#DAA520]  location /alexa {
                auth_basic "Restricted Area: Alexa";
                auth_basic_user_file /etc/nginx/.alexa;
        
                if ($allowed_country = no) {
                    return 403;
                }
                proxy_pass http://192.168.178.100: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;
            }   [/COLOR]
        
            location /shng {
                auth_basic "Restricted Area: SmartHomeNG";
                auth_basic_user_file /etc/nginx/.shng;
        
                if ($allowed_country = no) {
                    return 403;
                }
                proxy_pass http://192.168.178.100:8888/;
                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;
            }
        }
        Konfigurationsfehler oder den Bug in der smarthome_io findest Du über die Javascript Konsole raus.. Da habe ich gesehen, dass die Requests nichts wie konfiguriert gegen 443 gingen.

        Achja: die farblich oben markierten dürften für Dich relevant sein.

        Aber nochmal:

        Erstmal ein Ding umsetzen, dann verifizieren, dass Du verstehst was Du umgesetzt hast. Dann das nächste.. Ich glaube Du kopierst wild Zeug zusammen und verstehst eben nicht so recht, was Du tust
        Zuletzt geändert von psilo; 25.09.2017, 18:32.

        Kommentar


          #34
          Zitat von psilo Beitrag anzeigen
          Ich glaube Du kopierst wild Zeug zusammen und verstehst eben nicht so recht, was Du tust
          Da muss ich dir leider zu 100% Recht geben. Netzwerktechnisch hab ich so gut wie 0 Ahnung...
          Dann bleib ich erstmal bei VPN.

          Vielleicht verstehe ich's ja irgenwann mal...

          Kommentar


            #35
            Max2612 nimm dir mal ein wochenende zeit fuer das Thema und durchdenke mein beispiel. dann geht das schon. alles nicht so schwer

            Kommentar


              #36
              Ja, das hab ich vor. Ist dein Beispiel eigentlich komplett, oder hast du noch irgendetwas, das zum nginx gehört? (Außer die Länderabfrage) php-fpm oder so?

              Was ich überhaupt noch nicht verstehe, ist, warum ich einen Teil listen 80 habe, und du nicht.

              Kannst mir das kurz laienhaft erklären??

              Gruß, Max

              Kommentar


                #37
                Mit listen 80 hast Du halt auf HTTP Port 80 etwas offen. Das brauchst Du meiner Meinung nach temporär, da die LetsEncrypt Zertifikaterstellung einen Callback gegen Port 80 macht.
                Ich würde es am Ende aber auf jeden Fall dicht machen bzw. Anfragen mit 403er Error quittieren. Für alles andere reicht HTTPS und ist auch wesentlich sinnvoller/sicherer.

                Ich poste nochmal heute Abend meine vollständige Konfiguration, es gibt noch eine globale Konfig-Datei, wo bspw. das mit den Ländern drinsteckt. Vielleicht dokumentiere ich auch mal im SNHG Wiki wie das gesamthaft funktioniert. Ich habe ja auch noch zur Sicherheit meine Firewall durchkonfiguriert.

                Ich habe bei mir allerdings einen eigenen Raspberry Pi, der ausschliesslich als ReverseProxy agiert (und damit im Fall eines Angriffs getrennte Hardware). Evtl reagiert das etwas anders, als wenn alles auf der selben Maschine läuft. Die paar Euro in die Trennung würde ich aber auf jdn. Fall investieren, da so kein Datenstrom direkt auf Dein HomeAutomation-System offen ist.
                Zuletzt geändert von psilo; 26.09.2017, 06:42.

                Kommentar


                  #38
                  Hier ist noch meine nginx.conf:

                  Code:
                  user www-data;
                  worker_processes 4;
                  pid /run/nginx.pid;
                  
                  events {
                          worker_connections 768;
                          # multi_accept on;
                  }
                  
                  http {
                  
                          ##
                          # GeoIP Settings
                          ##
                          geoip_country /usr/share/GeoIP/GeoIP.dat;
                          map $geoip_country_code $allowed_country {
                                  default yes;
                                  BY no;
                                  BR no;
                                  KP no;
                                  KR no;
                                  RS no;
                                  RO no;
                                  RU no;
                                  CN no;
                                  CD no;
                                  NE no;
                                  GH no;
                                  IQ no;
                                  IR no;
                                  SY no;
                                  UA no;
                          }
                  
                          ##
                          # Basic Settings
                          ##
                  
                          sendfile on;
                          tcp_nopush on;
                          tcp_nodelay on;
                          types_hash_max_size 2048;
                  
                          server_names_hash_bucket_size 64;
                  
                          include /etc/nginx/mime.types;
                          default_type application/octet-stream;
                  
                          ##
                          # SSL Settings
                          ##
                  
                          ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
                          ssl_prefer_server_ciphers on;
                  
                          ##
                          # Logging Settings
                          ##
                  
                          access_log /var/log/nginx/access.log;
                          error_log /var/log/nginx/error.log;
                  
                          ##
                          # Gzip Settings
                          ##
                  
                          gzip on;
                          gzip_disable "msie6";
                  
                          gzip_min_length   1100;
                          gzip_vary         on;
                          gzip_proxied      any;
                          gzip_buffers      16 8k;
                          gzip_comp_level   6;
                          gzip_http_version 1.1;
                          gzip_types        text/plain text/css application/json application/x-javascript text/xml application/xml
                                            application/rss+xml text/javascript images/svg+xml application/x-font-ttf font/opentype
                                            application/vnd.ms-fontobject;
                  
                          ##
                          # Virtual Host Configs
                          ##
                  
                          include /etc/nginx/conf.d/*.conf;
                          include /etc/nginx/sites-enabled/*;
                  
                          ##
                          ##
                          # Harden nginx against DDOS
                          ##
                  
                          client_header_timeout 10;
                          client_body_timeout   10;
                          keepalive_timeout     10 10;
                          send_timeout          10;
                  }

                  Kommentar


                    #39
                    psilo Danke für dein Beispiel... hab's schon etwas studiert.

                    Jetzt habe ich ein paar Verständnisfragen.

                    1. Diese Zertifikate
                    Code:
                    ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
                    ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.de/privkey.pem;
                    haben nichts mit diesen zu tun?? Richtig??
                    Code:
                    ssl_client_certificate /etc/ssl/ca/certs/ca.crt;
                    ssl_crl /etc/ssl/ca/private/ca.crl;
                    ssl_verify_client optional;
                    2. Sollte es (wenn 1. = richtig) dann möglich sein, mit
                    Code:
                    server {
                        server_tokens off;
                    
                        listen 443 ssl default_server;
                        server_name xxx.dyndns.de;
                    
                        ##
                        # SSL
                        ##
                    
                        ssl on;
                        ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
                        ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.de/privkey.pem;
                        ssl_session_cache builtin:1000 shared:SSL:10m;
                        ssl_ciphers    HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;
                    
                        add_header Strict-Transport-Security "max-age 31536000; includeSubDomains";
                    
                        ##
                        # global
                        ##
                    
                        root /var/www/xxx.dyndns.de;
                        index index.php index.htm index.html;
                    
                    
                      location /smartVISU {
                    
                            auth_basic "Restricted Area: smartVISU";
                            auth_basic_user_file /etc/nginx/.htpasswd;
                    
                    
                            proxy_pass https://192.168.178.100/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;
                        }
                    }
                    über https://xyz.dyndns.de/smartVISU die Visu zu erreichen? Oder sind die Zertifikate unbedingt erforderlich?

                    Vielleicht kannst du mir die 2 Fragen kurz beantworten??

                    Gruß, Max

                    Kommentar


                      #40
                      Max2612 ohje lange ists her die 2 ausdrücke im ersten block sind die ssl serverzertifikate für meine domain (daher letsencrypt)

                      die CRTs usw. im 2ten block sind für die certificate authority: so kann der server clientzertifikate authorisieren (hast du mal https://arcweb.co/securing-websites-...ication-linux/ angeschaut - stand im kommentar verlinkt?)

                      ich hätte in deinem beispiel gesagt, dass wenn letsencrypt (also die serverzertifikate) passt, die smartvisu (aber noch ohne websocketverbindung!) per https gehen sollte..

                      für die websockets ist das wie gesagt nochmal eine andere sache. meiner meinung nach geht eine basic auth nicht mit websockets. deshalb kamen dann die clientzertifikate ins spiel, da ich die websocket connection nicht offen im internet haben wollte...
                      Zuletzt geändert von psilo; 27.09.2017, 17:16.

                      Kommentar


                        #41
                        achja noch ne frage: stimmt das bei dir?
                        Code:
                        proxy_pass https://192.168.178.100/smartVISU;
                        also läuft die SV bei dir auch auf dieser IP?

                        Kommentar


                          #42
                          Zitat von psilo Beitrag anzeigen
                          die CRTs usw. im 2ten block sind für die certificate authority: so kann der server clientzertifikate authorisieren (hast du mal https://arcweb.co/securing-websites-...ication-linux/ angeschaut - stand im kommentar verlinkt?)
                          Ja, hab ich mir angeschaut. Mir war nur nicht ganz klar, für was die CRT's benötigt werden.

                          Zitat von psilo Beitrag anzeigen
                          ich hätte in deinem beispiel gesagt, dass wenn letsencrypt (also die serverzertifikate) passt, die smartvisu (aber noch ohne websocketverbindung!) per https gehen sollte..
                          Und genau das verstehe ich nicht. Ich komme nicht auf die Visu. Die IP der Visu habe ich angepasst. (proxy_pass https://192.168.1.13/smartVISU;)


                          Kommentar


                            #43
                            Max2612 landen im nginx log fehler? erste anlaufstelle bei sowas
                            reloaded nginx erfolgreich mit der config?

                            da sollten die liegen
                            Code:
                            pi@reverseproxy:~ $ ls /var/log/nginx/
                            access.log             access.log.2.gz        error.log.16.gz
                            access.log.1           access.log.30.gz       error.log.17.gz
                            access.log.10.gz       access.log.31.gz       error.log.18.gz
                            access.log.11.gz       access.log.3.gz        error.log.19.gz
                            access.log.12.gz       access.log.4.gz        error.log.20.gz
                            access.log.13.gz       access.log.5.gz        error.log.21.gz
                            access.log.14.gz       access.log.6.gz        error.log.22.gz
                            access.log.15.gz       access.log.7.gz        error.log.23.gz
                            access.log.16.gz       access.log.8.gz        error.log.24.gz
                            access.log.17.gz       access.log.9.gz        error.log.25.gz
                            access.log.18.gz       allowed_country.log    error.log.26.gz
                            access.log.19.gz       allowed_country.log.1  error.log.27.gz
                            access.log.20.gz       country.log            error.log.28.gz
                            access.log.21.gz       country.log.1          error.log.29.gz
                            access.log.22.gz       error.log              error.log.2.gz
                            access.log.23.gz       error.log.1            error.log.3.gz
                            access.log.24.gz       error.log.10.gz        error.log.4.gz
                            access.log.25.gz       error.log.11.gz        error.log.5.gz
                            access.log.26.gz       error.log.12.gz        error.log.6.gz
                            access.log.27.gz       error.log.13.gz        error.log.7.gz
                            access.log.28.gz       error.log.14.gz        error.log.8.gz
                            access.log.29.gz       error.log.15.gz        error.log.9.gz
                            loggt das access log zugriffe?

                            Kommentar


                              #44
                              z.b. dieser art:
                              aaa.bbb.xxx.yyy - - [25/Sep/2017:08:41:43 +0000] "GET /smartVISU/lib/weather/pics/sun_2.png HTTP/1.1" 200 55685 "https://ccc.dyndns.de smartVISU/index.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0"

                              Kommentar


                                #45
                                Der nginx startet ohne Fehler mit dieser config:
                                Code:
                                server {
                                    server_tokens off;
                                
                                    listen 443 ssl default_server;
                                    server_name xxx.eu;
                                
                                    ##
                                    # SSL
                                    ##
                                
                                    ssl on;
                                    ssl_certificate /etc/letsencrypt/live/xxx.eu/fullchain.pem;
                                    ssl_certificate_key /etc/letsencrypt/live/xxx.eu/privkey.pem;
                                    ssl_session_cache builtin:1000 shared:SSL:10m;
                                    ssl_ciphers    HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;
                                
                                    add_header Strict-Transport-Security "max-age 31536000; includeSubDomains";
                                
                                    ##
                                    # global
                                    ##
                                
                                    root /var/www/html/xxx.eu;
                                    index index.php index.htm index.html;
                                
                                
                                  location /smartVISU {
                                
                                        auth_basic "Restricted Area: smartVISU";
                                        auth_basic_user_file /etc/nginx/.htpasswd;
                                
                                
                                        proxy_pass https://192.168.1.13/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;
                                    }
                                }
                                Beim Aufruf kommt die Anmeldung. Dann bekomme ich einen "400 Bad Request"

                                ErrorLog bleibt leer.
                                AccessLog
                                Code:
                                192.168.1.13 - xxx [27/Sep/2017:19:44:50 +0200] "GET /smartVISU HTTP/1.0" 400 242 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
                                192.168.1.31 - xxx [27/Sep/2017:19:44:50 +0200] "GET /smartVISU HTTP/1.1" 400 242 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"

                                Kommentar

                                Lädt...
                                X