HTTPS のフォワードプロキシとしての Nginx

HTTPS のフォワードプロキシとしての Nginx

私はnginxをHTTPトラフィックをプロキシするように設定することに成功しましたが(このガイド)、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"

これらのリクエストとは何ですか? nginx で HTTPS リクエストCONNECTを行うことは可能ですか?proxy_pass

アップデート

プロキシサーバーは私のウェブ開発ワークフロー/ツールキットの一部であることを付け加えておきます。これはクライアントサイドJavaScriptをテスト/デバッグするのに最適な方法です。生産環境 (プロキシの前に書き換えを使用)。

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

答え1

nginxはSSLによるフォワードプロキシモードをサポートしていないようです。次のようなものを使用する必要があります。イカ代わりに、nginx の作者による詳細な説明が記載されたリンクを以下に示します。フォワードプロキシとしての HTTPS と nginx。

答え2

明確にするために、ブログのコメント フィードに書いたように、nginx は、HTTP プロキシを介してリモート ホストへの生の TCP 接続を確立するために使用される CONNECT メソッド呼び出しを処理しません。これは、nginx がフォワード プロキシとして機能することを想定していないことを考えると当然ですが、通常の 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 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/nginxnginxポート 80 で実稼働 Web サーバーも実行していて、それをいじりたくない場合は、Debian の標準パッケージと問題なく共存できます (ただし、/usr/local起動時にバージョンを個別に起動するようにしてください)。または、さらに設定すれば、コンパイルした nginx から両方のサービスを実行することもできます。ただし、コンパイルした nginx をファイアウォールがトラフィックを許可するポートで実行するように設定した場合、Debian パッケージ システムでは自動的に 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;
  }
}

関連情報