HTTPS 용 정방향 프록시로 Nginx


23

HTTP 트래픽을 프록시하도록 nginx를 성공적으로 구성 할 수 있었지만 ( 이 안내서 사용 ) HTTPS 요청을 프록시하려고 시도하면 코드 400 ( Bad Request )이 발생했습니다.

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의 구성 언어는 그 자체로 프로그래밍 언어입니다. 변수가 있습니다!

https  nginx  proxy 

답변:


17

nginx가 SSL을 사용하는 정방향 프록시 모드를 지원하지 않는 것 같습니다. 대신 오징어 와 같은 것을 사용해야 합니다. 다음은 nginx의 저자 ( Forward Proxy로서의 HTTPS 및 nginx)에 대한 자세한 설명이있는 링크입니다 .


1
감사! 연결 된 스레드는 4 세이지 만 여전히 불가능합니다.

디버깅을 위해 프록시가 필요한 경우 mitmproxy를 사용해보십시오.
Zorayr

7

명확히하기 위해 : 블로그의 의견 피드에 썼 듯이 nginx는 HTTP 프록시를 통해 원격 호스트에 대한 원시 TCP 연결을 설정하는 데 사용되는 CONNECT 메소드 호출을 처리하지 않습니다. 순방향 프록시로 작동하면 일반 HTTP에 관계없이 아주 잘 작동합니다.

Nginx는 문자 그대로 그 메소드 호출로 무엇을 해야할지 전혀 모릅니다. 그래서 로그의 오류 메시지가 다소 쓸모가 없습니다. : 난 항상 자신이 HTTPS를위한 것이냐 사용하여 발견 한 http://www.privoxy.org/ 은 굉장히 쉽게, 너무 설정 -. 그러나 HTTPS 연결은 CONNECT 메소드를 통해 원시 연결로 처리되고 서버는 릴레이중인 내용을 알지 못하므로 HTTPS 릴레이의 컨텐츠를 필터링하거나 조작하는 것은 여전히 ​​불가능합니다.


2

소스에서 nginx를 컴파일하지 않아도 ngx_http_proxy_connect_module을 설치할 수 있습니다. 다음은 Raspberry Pi의 Debian 9 "Stretch"에서 나를 위해 일했습니다 (/ deb / src URL을 /etc/apt/sources.list에 추가하고 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

그런 다음 편집 /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 보안 업데이트를 수동으로 확인해야합니다.


나는 몇 가지 명령을 조정해야했지만 전반적으로 귀하의 답변이 효과가있었습니다. 많은 감사합니다!
Robert Reiz

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.