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リクエストを行うことさえ可能ですか?

更新

プロキシサーバーが私のWeb開発ワークフロー/ツールキットの一部であることを追加する必要があります。実稼働環境でクライアント側のJavaScriptをテスト/デバッグするのに最適な方法です(プロキシの前に書き換えを使用)。

また、nginxの設定言語は、おそらくそれ自体がプログラミング言語です。変数があります!

https  nginx  proxy 

回答:


17

nginxはSSLを使用したフォワードプロキシモードをサポートしていないようです。代わりにSquidなどを使用する必要があります。nginxの作者からの詳細な説明があるリンクを次に示します。HTTPSとnginxとしてのフォワードプロキシ。


1
ありがとう!あなたがリンクしたスレッドは4歳ですが、私にはまだ不可能だと思われます。

デバッグにプロキシが必要な場合は、mitmproxyを試してください。
ゾライア

7

明確にするために:ブログのコメントフィードで書いたように、nginxは、HTTPプロキシを介してリモートホストへの生のTCP接続を確立するために使用されるCONNECTメソッド呼び出しを処理しません。フォワードプロキシとして機能しますが、通常のHTTPに関係なく非常にうまく機能します。

Nginxは、文字通りこれらのメソッド呼び出しで何をすべきかをまったく知らないため、ログのエラーメッセージはかなり役に立たないのです。私はいつも、HTTPSにprivoxyを使用していることに気付きました:http ://www.privoxy.org/- 設定もめちゃくちゃ簡単です。ただし、HTTPS接続はCONNECTメソッドを介したraw接続で処理され、サーバーはそれが何を中継しているかを把握していないため、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で本番Webサーバーも実行していて、それをいじるリスクを避けたい場合は、Debianのストックパッケージと共存できます(ただし、起動時に/usr/localバージョンを個別に起動するようにしてください)。または、より多くの構成を使用して、コンパイルしたnginxから両方のサービスを実行できます。ただし、ファイアウォールがトラフィックを許可するポートでコンパイルされたnginxを実行するように設定した場合、Debianパッケージシステムでは自動的に行われないため、nginxのセキュリティ更新を手動で確認する必要があることに注意してください。


私はいくつかのコマンドを微調整する必要がありましたが、全体的にあなたの答えは私のために働いた。どうもありがとう!
ロバートレイズ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.