web-dev-qa-db-ja.com

NGinx $ proxy_add_x_forwarded_forおよびreal_ip_header

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;
}
_
  1. ロードバランサーは、クライアントIPに_X-Forwarded-For_フィールドを追加します
    _X-Forwarded-For_ = _a.a.a.a_
  2. LB IP(_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それは私が欲しいものです!)
    しかし、NGinxは_X-Forwarded-For_ではなく_a.a.a.a_ IPで_b.b.b.b_ヘッダーも補完します
  3. WEBAPPは次のヘッダーを受け取ります。
    _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_値を置き換える機能です。

誰でもこの問題を解決するのに役立ちますか?

25
pierrefevrier

ここで同じ問題。それは迷惑であり、これが機能かバグかは実際にはわかりません:)

私はそれが解決策ではないことを知っていますが、real_ip_headerを削除し、X-Forwarded-For最初のipaddressを使用して、必要な場所でクライアントのIPアドレスを取得します(例:ログ)。

3
faja

私は最近、同じ「問題」に遭遇し、この動作はreal_ip_recursive on;ディレクティブによって引き起こされるという結論に達しました。

nginx realip docs から:

再帰検索が有効になっている場合、信頼できるアドレスの1つと一致する元のクライアントアドレスは、要求ヘッダーフィールドで送信された最後の信頼できないアドレスに置き換えられます。

b.b.b.bを信頼するように指定しました(set_real_ip_from b.b.b.b;

したがって、あなたが期待するもの、つまりa.a.a.a, b.b.b.ba.a.a.a, a.a.a.aに置き換えられます。

これを明確にしたソースは次のとおりです。 https://serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong

2
Tom