NGinxの下にwebappがあり、次のようなフロントロードロードバランサーがあります(x.x.x.x = IPアドレス):
クライアント(a.a.a.a)-> LB(b.b.b.b)-> NGX(c.c.c.c)-> WEBAPP(d.d.d.d)
ここに私のNGinx設定のスニペットがあります:
_location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
real_ip_header X-Forwarded-For;
set_real_ip_from b.b.b.b;
real_ip_recursive on;
}
_
X-Forwarded-For
_フィールドを追加しますX-Forwarded-For
_ = _a.a.a.a
_X-Forwarded-For
_)を省略して_b.b.b.b
_ヘッダーでクライアントの実際のIPを検索し、_$remote_addr
_を_b.b.b.b
_から_a.a.a.a
_に変更して_proxy_set_header X-Real-IP $remote_addr
_になりますtrue(OKそれは私が欲しいものです!)X-Forwarded-For
_ではなく_a.a.a.a
_ IPで_b.b.b.b
_ヘッダーも補完しますX-Forwarded-For
_ = _a.a.a.a, a.a.a.a
_X-Real-IP
_ = _a.a.a.a
_X-Forwarded-For
_は_a.a.a.a, b.b.b.b
_でなければなりません必要なのは、最初に_proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
_を設定し、次に実際のIPを検索して_$remote_addr
_値を置き換える機能です。
誰でもこの問題を解決するのに役立ちますか?
ここで同じ問題。それは迷惑であり、これが機能かバグかは実際にはわかりません:)
私はそれが解決策ではないことを知っていますが、real_ip_headerを削除し、X-Forwarded-For最初のipaddressを使用して、必要な場所でクライアントのIPアドレスを取得します(例:ログ)。
私は最近、同じ「問題」に遭遇し、この動作はreal_ip_recursive on;
ディレクティブによって引き起こされるという結論に達しました。
再帰検索が有効になっている場合、信頼できるアドレスの1つと一致する元のクライアントアドレスは、要求ヘッダーフィールドで送信された最後の信頼できないアドレスに置き換えられます。
b.b.b.b
を信頼するように指定しました(set_real_ip_from b.b.b.b;
したがって、あなたが期待するもの、つまりa.a.a.a, b.b.b.b
はa.a.a.a, a.a.a.a
に置き換えられます。
これを明確にしたソースは次のとおりです。 https://serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong