私のファイアウォールは正常に動作しています。インターネットからの接続は NGINX サーバーに転送され、それに応じて分散され、内部ログを除いてアプリケーション サーバーは正常に動作します。
私が直面している問題は、アプリケーション サーバーが受信する IP に関するものです。それらは「クライアント IP」ではなく、現在は NGINX IP です。
次のネットワークを検討してください: クライアント IP 1、ファイアウォール IP 2、NGINX IP 3、Web サーバー IP 4。
ファイアウォールでは、パケットが NGINX に転送されていることがわかりますが、NGINX では、tcpdump
元のソース IP 1 ではなく、独自の NGINX IP 3 からの着信接続が表示されます。
ポイントは、Web サーバーのログでは入力接続が IP 3 として表示されますが、期待されるのは IP 1 であるということです。
ファイアウォールまたは NGINX の設定ミスでしょうか? これを解決する方法について何かアイデアはありますか?
現在の設定 ( /etc/nginx/sites-enabled/app.domain.com
):
...
location ^~ / {
proxy_pass http://10.0.0.11;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
...
答え1
これは通常の動作です。nginx がリバース プロキシの場合、最終宛先への接続を開き、クライアントからアプリケーション サーバーにプロキシします。ソース IP は nginx IP アドレス以外にすることはできません。そうしないと、TCP 接続が機能しません。
X-Real-IP
TCP 接続からの IP アドレスではなく、ヘッダーに指定された IP アドレスを使用するようにアプリケーション サーバーを設定する必要があります。
答え2
この場合の解決策は、以下のように C# コードを変更することでした。ファイアウォールや nginx の変更は行われませんでした。
var userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
これまでの失敗した試み:
var userIP = Request.ServerVariables["X_FORWARDED_FOR"];
var userIP = Request.ServerVariables["X-REAL-IP"];
var userIP = Request.ServerVariables["REMOTE_ADDR"];
var userIP = Request.UserHostAddress;
問題がファイアウォールや nginx の設定になかったことを明確にするために協力してくれたすべての貢献者に感謝します。