Nginx als Forward-Proxy für HTTPS

23

Während ich nginx erfolgreich für den Proxy-HTTP-Verkehr konfigurieren konnte (mithilfe 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 CONNECTAnfragen? Ist es überhaupt möglich, proxy_passHTTPS-Anfragen in Nginx zu stellen?

Aktualisieren

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

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


quelle

Antworten:

17

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.

Zorayr
quelle
1
Vielen Dank! Der Thread, den du verlinkt hast, ist 4 Jahre alt, aber es scheint mir auch, dass es immer noch unmöglich ist.
Wenn Sie zum Debuggen einen Proxy benötigen, versuchen Sie es mitmproxy.
Zorayr,
7

Zur Verdeutlichung: Wie ich im Kommentar-Feed meines Blogs schrieb, verarbeitet nginx keine CONNECT-Methodenaufrufe, die zum Herstellen einer rohen TCP-Verbindung zu einem Remote-Host über einen HTTP-Proxy verwendet werden Wenn Sie als Forward-Proxy arbeiten, funktioniert dies für normales HTTP nur recht gut, unabhängig davon.

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.

Magnus
quelle
2

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 Himbeer-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 sie /usr/local/nginx/conf/nginx.confund lassen Sie sie 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;
        }
    }
}

Dann lauf /usr/local/nginx/sbin/nginx. Es wird sehr glücklich mit Debians Lagerpaket koexistieren nginx, wenn Sie auch einen Produktions-Webserver auf Port 80 betreiben und nicht riskieren wollen, sich damit herumzuschlagen (aber stellen Sie sicher, dass Sie die /usr/localVersion 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.

Silas S. Brown
quelle
Ich musste einige der Befehle optimieren, aber insgesamt hat Ihre Antwort für mich funktioniert. Danke vielmals!
Robert Reiz
0

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 finden Sie 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/ .

Robert Reiz
quelle