Nginx jako forward proxy dla HTTPS

23

Chociaż udało mi się skonfigurować nginx do proxy ruchu HTTP (korzystając z tego przewodnika ), wszystkie próby proxy żądań HTTPS zakończyły się kodem 400 ( Błędne żądanie ).

Dzienniki debugowania Nginx wcale nie były pomocne:

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"

Jakie są te CONNECTprośby? Czy możliwe jest nawet proxy_passżądanie HTTPS w Nginx?

Aktualizacja

Muszę dodać, że serwer proxy jest częścią mojego przepływu pracy / zestawu narzędzi do tworzenia stron WWW. To świetny sposób na przetestowanie / debugowanie kodu JavaScript po stronie klienta w środowisku produkcyjnym (przy użyciu przepisywania przed serwerem proxy).

Również język konfiguracji nginx jest prawdopodobnie własnym językiem programowania. Ma zmienne!


źródło

Odpowiedzi:

17

Wygląda na to, że nginx nie obsługuje trybu przekazywania proxy z SSL. Zamiast tego będziesz musiał użyć czegoś takiego jak Squid . Oto link z dokładniejszym wyjaśnieniem od autora nginx: HTTPS i nginx jako Forward Proxy.

Zorayr
źródło
1
Dzięki! Wątek, który połączyłeś, ma 4 lata, ale wydaje mi się, że nadal jest to niemożliwe.
Jeśli potrzebujesz serwera proxy do debugowania, spróbuj mitmproxy.
Zorayr,
7

Tylko dla wyjaśnienia: jak napisałem na kanale komentarzy na moim blogu, nginx nie obsługuje wywołań metody CONNECT, które są używane do ustanowienia surowego połączenia TCP ze zdalnym hostem za pośrednictwem proxy HTTP - co ma sens, biorąc pod uwagę, że nginx nie powinien działa jako forward proxy, po prostu zdarza się, że działa całkiem dobrze dla zwykłego HTTP, niezależnie.

Nginx dosłownie nie ma pojęcia, co zrobić z tymi wywołaniami metod, dlatego komunikaty o błędach w dziennikach są raczej bezużyteczne. Zawsze używałem privoxy dla HTTPS: http://www.privoxy.org/ - jest również niesamowicie łatwy do skonfigurowania. Ale nadal nie można filtrować ani zmieniać zawartości przekaźników HTTPS, ponieważ połączenia HTTPS są przetwarzane przy użyciu połączenia raw metodą CONNECT, a serwer nie ma pojęcia, co przekazuje.

Magnus
źródło
2

Jeśli nie masz nic przeciwko kompilowaniu nginx ze źródła, możesz zainstalować ngx_http_proxy_connect_module . Poniższe działało dla mnie w Debian 9 „Stretch” na Raspberry Pi (po tym, jak dodałem adresy URL deb-src do /etc/apt/sources.list i zrobiłem apt-get update):

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

Następnie edytuj /usr/local/nginx/conf/nginx.confi spraw, aby wyglądał tak (podałem przykład domen, które chcesz zablokować, który działa zarówno z proxy SSL, jak i bez SSL):

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;
        }
    }
}

Potem biegnij /usr/local/nginx/sbin/nginx. Z przyjemnością będzie współistniał z nginxpakietem podstawowym Debiana, jeśli również uruchomisz produkcyjny serwer WWW na porcie 80 i nie chcesz ryzykować z tym bałaganem (ale pamiętaj, aby uruchomić /usr/localwersję osobno podczas uruchamiania); alternatywnie, przy większej konfiguracji możesz uruchomić obie usługi z skompilowanego nginx. Ale jeśli ustawisz skompilowane nginx do pracy na porcie, na który zapora zezwala na ruch, uważaj, abyś musiał ręcznie sprawdzać aktualizacje zabezpieczeń nginx, ponieważ system pakietów Debiana nie zrobi tego za ciebie.

Silas S. Brown
źródło
Musiałem dostosować niektóre polecenia, ale ogólnie twoja odpowiedź zadziałała dla mnie. Wielkie dzięki!
Robert Reiz,
0

Postępowałem zgodnie z instrukcjami Silasa S. Browna i udało mi się skompilować plik binarny Nginx, który może obsługiwać przekazywanie i SSL. Wszystko połączyłem w obraz Dockera. Plik Docker i konfiguracja są dostępne na GitHub: https://github.com/reiz/nginx_proxy .

Obraz Nginx Docker w tym repozytorium Docker Hub może obsługiwać połączenie SSL i przekazywanie: https://hub.docker.com/r/reiz/nginx_proxy/ .

Robert Reiz
źródło