2

私は次の構成を持っています:

HAProxy -> NGinx -> バックエンド

(負荷分散にはHAProxy、SSL終端にはNGinxを使用) 設定変更不可

プロキシ プロトコルを使用してソース IP をバックエンドに渡そうとしています。SSLなしで作業すると、すべて正常に動作します。式に SSL を追加すると、SSL ハンドシェークで失敗するか、NGinx にプロキシ プロトコルをバックエンドに渡す方法がわかりません。

構成例 1:

非 ssl 接続ではプロキシ プロトコルが適切に渡されますが、ssl 接続では ssl ハンドシェイクが壊れます。

HAProxy:

listen HTTP-TCP_8090
    bind :8090

    server nginx nginx:8090 send-proxy

listen HTTPS-TCP_8092
    bind :8092

    server nginx nginx:8092 send-proxy

NGinx:

stream {
    upstream some_backend {
         server some_host:8090;
    }

    server {
        listen                8090;
        listen                8092 ssl;
        proxy_pass            some_backend;
        proxy_protocol        on;

        ssl_certificate       /etc/ssl/server.crt;
        ssl_certificate_key   /etc/ssl/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSLTCP:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
    }
}

サンプル構成 2:

SSL と SSL 以外の両方の接続が正常に機能しますが、どちらの場合もプロキシ プロトコル ヘッダーがバックエンドに渡されません。

HAProxy:

listen HTTP-TCP_8090
    bind :8090

    server nginx nginx:8090 send-proxy

listen HTTPS-TCP_8092
    bind :8092

    server nginx nginx:8092 send-proxy

NGinx:

stream {
    upstream some_backend {
         server some_host:8090;
    }

    server {
        listen                8090 proxy_protocol;
        listen                8092 proxy_protocol ssl;
        proxy_pass            some_backend;

        ssl_certificate       /etc/ssl/server.crt;
        ssl_certificate_key   /etc/ssl/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSLTCP:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
    }
}

SSL接続のプロキシプロトコルを認識し、ヘッダーをバックエンドに渡す構成を作成するにはどうすればよいですか?

4

1 に答える 1

4

そうですね、NGinx のドキュメントはあまり良くないようです...

https://www.nginx.com/resources/admin-guide/proxy-protocol/

nginx にプロキシ プロトコルを受け入れさせたい場合は、リッスン ディレクティブに proxy_protocol パラメータを追加する必要があります

listen 8090 proxy_protocol;

nginx にプロキシ プロトコルを送信させたい場合は、server セクション内に proxy_protocol ディレクティブを追加する必要があります

proxy_protocol on;

nginx がプロキシ プロトコルを受け入れ、受け入れられたヘッダーを反対側に渡すようにする場合は、両方を追加する必要があります。論理的に聞こえますよね?右。しかし、それは十分に文書化されていません。http 以外のトラフィックを処理する場合、サーバー セクション内で proxy_protocol ディレクティブを設定するだけで、接続の両端で有効になることが容易に理解できます。最後に、これは機能する構成です。

stream {
    upstream some_backend {
         server some_host:8090;
    }

    server {
        listen                8090 proxy_protocol;
        listen                8092 proxy_protocol ssl;
        proxy_pass            some_backend;
        proxy_protocol        on;

        ssl_certificate       /etc/ssl/server.crt;
        ssl_certificate_key   /etc/ssl/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSLTCP:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
    }
}
于 2018-01-12T00:19:37.553 に答える