it-swarm.com.de

Nginx als Forward-Proxy für HTTPS

Während ich nginx erfolgreich für den Proxy-HTTP-Verkehr konfigurieren konnte (mithilfe von dieses Handbuchs ), führten alle Versuche, HTTPS-Anforderungen als Proxy zu verwenden, zu Code 400 ( Bad Request ).

Nginx-Debug-Protokolle waren überhaupt nicht hilfreich:

2013/06/05 14:38:33 [info] 74946#0: *589
    client sent invalid request while reading client request line, client: 127.0.0.1,
    server: google.com, request: "CONNECT google.com:443 HTTP/1.1"

Was sind diese CONNECT Anfragen? Ist es überhaupt möglich, HTTPS-Anfragen in nginx zu proxy_pass?

Aktualisieren

Muss hinzugefügt werden, dass ein Proxy-Server Teil meines Webentwicklungs-Workflows/Toolkits ist. Es ist eine großartige Möglichkeit, clientseitiges JavaScript in Produktionsumgebungen zu testen/zu debuggen (mit Umschreibungen vor dem Proxy).

Auch die Konfigurationssprache von nginx ist wohl eine eigene Programmiersprache. Es hat Variablen!

23
katspaugh

Scheint, als ob Nginx den Forward-Proxy-Modus mit SSL nicht unterstützt. Sie müssen stattdessen etwas wie Squid verwenden. Hier ist ein Link mit weiteren Erklärungen vom Autor von nginx: HTTPS und nginx als Forward Proxy.

16
Zorayr

Zur Verdeutlichung: Wie ich im Kommentar-Feed meines Blogs geschrieben habe, verarbeitet nginx keine CONNECT-Methodenaufrufe, die zum Herstellen einer rohen TCP -Verbindung zu einem Remote-Host über einen HTTP-Proxy verwendet werden dass nginx nicht als forward-proxy funktionieren soll, funktioniert für normales http einfach ganz gut, egal.

Nginx hat buchstäblich keine Ahnung, was mit diesen Methodenaufrufen zu tun ist. Deshalb sind die Fehlermeldungen in den Protokollen ziemlich nutzlos. Ich habe immer festgestellt, dass ich Privoxy für HTTPS verwende: http://www.privoxy.org/ - es ist auch unglaublich einfach einzurichten. Es ist jedoch immer noch unmöglich, den Inhalt von HTTPS-Relays zu filtern oder zu entstellen, da HTTPS-Verbindungen mit einer Rohverbindung über die CONNECT-Methode verarbeitet werden und der Server keine Ahnung hat, was sie weiterleiten.

7
Magnus

Wenn es Ihnen nichts ausmacht, Nginx aus dem Quellcode zu kompilieren, können Sie ngx_http_proxy_connect_module installieren. Das Folgende funktionierte für mich in Debian 9 "Stretch" auf einem Raspberry Pi (nachdem ich deb-src-URLs zu /etc/apt/sources.list hinzugefügt und apt-get update ausgeführt habe):

cd /tmp &&
apt-get source nginx &&
git clone https://github.com/chobits/ngx_http_proxy_connect_module &&
cd nginx-* &&
patch -p1 < ../ngx_http_proxy_connect_module/proxy_connect.patch &&
Sudo apt-get install libpcre3-dev &&
./configure --add-module=/tmp/ngx_http_proxy_connect_module &&
make && Sudo make install

Bearbeiten Sie dann /usr/local/nginx/conf/nginx.conf und lassen Sie es so aussehen (ich habe ein Beispiel für zu blockierende Domains beigefügt, das sowohl mit SSL- als auch mit Nicht-SSL-Proxys funktioniert):

user www-data;
worker_processes auto;
events { }
http {
    server_names_hash_bucket_size 128;
    server {
        listen       8888;
        server_name  spam.example.com *.spam.example.com;
        server_name  spam2.example.com *.spam2.example.com;
        access_log off;
        return 404;
    }
    server {
        listen       8888;
        server_name ~.+;
        proxy_connect;
        proxy_max_temp_file_size 0;
        resolver 8.8.8.8;
        location / {
           proxy_pass http://$http_Host;
           proxy_set_header Host $http_Host;
        }
    }
}

Führen Sie dann /usr/local/nginx/sbin/nginx aus. Es wird sehr gerne mit Debians nginx-Paket koexistieren, wenn Sie auch einen Produktions-Webserver auf Port 80 betreiben und nicht riskieren möchten, sich damit herumzuschlagen (aber stellen Sie sicher, dass Sie die /usr/local-Version separat beim Booten starten). Alternativ können Sie mit einer höheren Konfiguration beide Dienste von dem kompilierten Nginx ausführen. Wenn Sie Ihr kompiliertes Nginx jedoch so einstellen, dass es auf einem Port ausgeführt wird, für den Ihre Firewall Datenverkehr zulässt, müssen Sie manuell nach Nginx-Sicherheitsupdates suchen, da das Debian-Paketsystem dies nicht mehr für Sie erledigt.

2
Silas S. Brown

Ich habe gerade die Anweisungen von Silas S. Brown befolgt und konnte eine Nginx-Binärdatei kompilieren, die sich mit Weiterleitung und SSL befasst. Ich habe alles zu einem Docker-Image gebündelt. Das Dockerfile und die Konfiguration gibt es hier auf GitHub: https://github.com/reiz/nginx_proxy .

Das Nginx Docker-Image in diesem Docker Hub-Repository kann SSL-Verbindungen und Weiterleitungen verarbeiten: https://hub.docker.com/r/reiz/nginx_proxy/ .

0
Robert Reiz