nginx を使用して送信接続の IP アドレスをマスクする

nginx を使用して送信接続の IP アドレスをマスクする

複数の処理サーバーからのすべての送信接続を単一の IP アドレス経由でチャネル化するというビジネス要件があります。

私たちの設定は次のとおりです。

当社には、受信 HTTP リクエストのロード バランサーとして機能する nginx サーバーがあります。さらに、複数の Web サーバーがあり、処理サーバーに接続し、処理サーバーは顧客のデータベースに接続します。

クライアント --> ロードバランサー --> Web サーバー --> プロセス サーバー --> データベース

クライアント <-- ロードバランサ <-- Web サーバー <-- プロセス サーバー <-- データベース

現在、データベースのホワイトリストに追加する必要がある IP アドレスのリストをお客様に提供しています。ただし、規模が拡大するにつれてこのホワイトリストは長くなり、お客様はホワイトリストを再度更新する必要が生じます。

希望する設定

この問題を回避するには、すべての送信接続を別の nginx サーバーに通して、処理サーバーの IP アドレスをマスクします。その結果、お客様がホワイトリストに登録する IP アドレスは 1 つだけになります。

クライアント --> ロードバランサー --> Web サーバー --> プロセス サーバー --> IP マスキング --> データベース

クライアント <-- ロードバランサ <-- Web サーバー <-- プロセス サーバー <-- IP マスキング <-- データベース

これは nginx だけで可能でしょうか。可能であれば、これを実現するにはどのような手順を踏む必要がありますか?

答え1

もう 1 つの解決策は、NAT を使用することです。この場合、マスキング サーバーは、ネットワーク アドレス変換が構成されたルーターになります。この場合、node.js 構成で顧客データベース IP を変更する必要はありませんが、すべてのプロセス サーバーでネットワーク (場合によってはルーティング構成) を変更し、NAT が構成されたゲートウェイを 1 つ用意する必要があります。

答え2

ご質問の内容は、nginx バージョン 1.9.0 以降で可能です。tcp (http ではない) プロキシのサポートが追加されました。1.9.13 以降では、udp プロキシも追加されました。https://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream そしてnginx.ru/en/docs/stream/ngx_stream_proxy_module.html を参照してください。

難しいのは、(IP マスク nginx) の着信接続を区別して、どのデータベースに接続するかを決定することです。HTTP プロキシでは、ホスト名を使用できます。TCP プロキシでは、異なるポートまたは異なる IP アドレスでリッスンする必要があります。nginx.conf:

worker_processes  4;

error_log  /var/log/nginx/error.log;

events { worker_connections  1024; }
stream {
        server {
           listen 3307;
           proxy_pass client2.db.dev:3306;
           proxy_buffer_size 16k;
        }
        server {
           listen 3308;
           proxy_pass client1.db.dev:3306;
           proxy_buffer_size 16k;
        }
}

関連情報