NGINXリバースプロキシでホストごとにアウトバウンドPROXYプロトコルを実装する

NGINXリバースプロキシでホストごとにアウトバウンドPROXYプロトコルを実装する

TLSパススルーリバースプロキシとして機能するNGINXインスタンス(nginx / 1.17.7)があります(TLSを終了せず、SNIヘッダーに基づいて元のTCP接続を渡します)。

この構成の主な欠点は、アップストリームサーバーが実際のクライアントIPアドレスを取得できないことですが、リバースプロキシIPのみを接続元として見ることができることです。

実装しようとしています。機関契約この問題を理解するアップストリームサーバー(他のNGINXサーバーなど)を持つことで、この問題を克服してください。

すべてのアップストリームサーバーが同時にインバウンドプロキシプロトコルを受け入れ始めるように構成されていると仮定すると、実装は非常に簡単です。

この構成は、次の場合にうまく機能します。

stream {
    map $ssl_preread_server_name $name {
         www.site1.com site1_https;
         www.site2.com site2_https;
         # ...
    }

    upstream site1_https {
        server <site1 internal ip1>:443;
        # ...
    }
    upstream site2_https {
        server <site2 internal ip1>:443;
        # ...
    }
    # ...

    server {
        listen <public ip address>:443
        ssl_preread on;
        proxy_pass $name;

        # This line enable outbound PROXY Protocol to EVERY upstream server!
        proxy_protocol on;
    }
}

ただし、時間の経過とともにインバウンドプロキシプロトコルを実装したい場合、またはPROXYプロトコルヘッダーをデコードできないいくつかのアップストリームサーバーがある場合は、アップストリームサーバーのサブセットにのみアウトバウンドプロキシヘッダーを追加することをお勧めします。 。

これを達成するためにこれまで試したことは、他のマッピング変数を追加してProxy_protocolを設定する必要があるかどうかを判断することです。

stream {
    map $ssl_preread_server_name $name {
        www.site1.com site1_https;
        # ...
    }
    map $name $proxy_protocol_onoff {
        site1_https on;
    }
    # ...
    server {
        # ...
        proxy_pass $name;
        proxy_protocol $proxy_protocol_onoff;
# ...

ただし、次のエラーが発生します。

invalid value "$proxy_protocol_onoff" in "proxy_protocol" directive, it must be "on" or "off" in /etc/nginx/nginx.conf:147

ディレクティブの使用はディレクティブの内部ではif許可されていないため、オプションではありませんserverproxy_protocol on;内部アップストリームディレクティブを定義することもできません。

NGINXでこの動作は可能ですか?それとも唯一の方法はHAProxyまたはそれに似たものに切り替えることですか?

ベストアンサー1

おすすめ記事