HTTPS용 정방향 프록시로서의 Nginx

HTTPS용 정방향 프록시로서의 Nginx

HTTP 트래픽을 프록시하도록 nginx를 성공적으로 구성할 수 있었지만(다음을 사용하여)이 가이드), HTTPS 요청을 프록시하려는 모든 시도는 코드 400(잘못된 요청).

Nginx 디버그 로그는 전혀 도움이 되지 않았습니다.

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"

이러한 요청은 무엇입니까 CONNECT? proxy_passnginx에서 HTTPS 요청 이 가능합니까 ?

업데이트

프록시 서버가 내 웹 개발 작업흐름/툴킷의 일부라는 점을 추가해야 합니다. 클라이언트 측 JavaScript를 테스트/디버깅하는 좋은 방법입니다.생산환경(프록시 이전에 다시 쓰기 사용)

또한 nginx의 구성 언어는 틀림없이 그 자체로 프로그래밍 언어입니다. 변수가 있어요!

답변1

nginx는 SSL을 사용하는 정방향 프록시 모드를 지원하지 않는 것 같습니다. 다음과 같은 것을 사용해야합니다오징어대신에. 다음은 nginx 작성자의 자세한 설명이 포함된 링크입니다.HTTPS 및 nginx를 정방향 프록시로 사용합니다.

답변2

명확히 하자면, 내 블로그의 댓글 피드에 썼듯이 nginx는 HTTP 프록시를 통해 원격 호스트에 대한 원시 TCP 연결을 설정하는 데 사용되는 CONNECT 메서드 호출을 처리하지 않습니다. 정방향 프록시로 작동하더라도 상관없이 일반 HTTP에서는 꽤 잘 작동합니다.

Nginx는 문자 그대로 해당 메소드 호출로 무엇을 해야할지 전혀 모릅니다. 이것이 바로 로그의 오류 메시지가 쓸모가 없는 이유입니다. 저는 항상 HTTPS에 privoxy를 사용하고 있습니다.http://www.privoxy.org/- 설정도 엄청나게 쉽습니다. 그러나 HTTPS 연결은 CONNECT 메소드를 통해 원시 연결로 처리되고 서버는 그것이 무엇을 중계하는지 전혀 모르기 때문에 HTTPS 중계의 내용을 필터링하거나 조작하는 것은 여전히 ​​불가능합니다.

답변3

소스에서 nginx를 컴파일해도 괜찮다면 다음을 설치할 수 있습니다.ngx_http_proxy_connect_module. 다음은 Raspberry Pi의 Debian 9 "Stretch"에서 저에게 효과적이었습니다(deb-src URL을 /etc/apt/sources.list에 추가하고 apt-get 업데이트를 수행한 후).

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

그런 다음 편집하여 /usr/local/nginx/conf/nginx.conf다음과 같이 만듭니다(SSL 및 비 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;
        }
    }
}

그런 다음 /usr/local/nginx/sbin/nginx. nginx포트 80에서 프로덕션 웹서버를 실행하고 있고 이를 망칠 위험을 감수하고 싶지 않다면 데비안의 기본 패키지와 매우 행복하게 공존할 것입니다 (그러나 /usr/local부팅 시 버전을 별도로 시작해야 합니다). 또는 더 많은 구성을 사용하면 컴파일한 nginx에서 두 서비스를 모두 실행할 수 있습니다. 하지만 방화벽이 트래픽을 허용하는 포트에서 실행되도록 컴파일된 nginx를 설정했다면 데비안 패키지 시스템이 더 이상 이를 수행하지 않으므로 nginx 보안 업데이트를 수동으로 확인해야 한다는 점에 유의하세요.

답변4

우리 팀이 이 작업을 수행하는 방법을 알아내는 데 시간이 좀 걸렸습니다. 마지막으로 우리는 아래 코드 조각을 nginx.conf에 삽입하여 이를 달성했습니다.

stream {
  map_hash_bucket_size 128;
  map $ssl_preread_server_name $sphere {
    site-01.example.com site-01;
    site-02.example.com site-02;
  }

  upstream site-01 {
    server 192.168.0.1:443;
  }

  upstream site-02 {
    server 192.168.0.2:443;
  }

  server {
    listen 443;
    proxy_pass $sphere;
    ssl_preread on;
  }
}

관련 정보