web-dev-qa-db-ja.com

haproxyのX-Forwarded-Forヘッダーをオーバーライドしますか?

私のHAProxyロードバランサーには、次の構成チャンクがあります。

defaults
    mode                    http
    log                     global
    option                  httplog clf
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch

frontend  main_http *:80
    option forwardfor except 127.0.0.1
    option httpclose
    default_backend         backend_http

backend backend_http
    balance     roundrobin
    option httpchk
    server  node1 10.0.0.64:80 check port 80
    server  node2 10.0.0.65:80 check port 80
    server  node3 10.0.0.66:80 check port 80

ノード(Tomcat)では、次の形式でリクエストをログに記録しています(最初のフィールドでx-forwarded-forと結合され、最後に実際のREMOTE_ADDRが追加されています)。

pattern='%{X-Forwarded-For}i - %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %a'

これはほとんどのリクエストでうまく機能するようですが、一部のケースでは、クライアント自体がプロキシの背後にあると想定し、最初のフィールドにこれらの値が含まれているリクエストが表示されます(各行は1つの実際のリクエストを表し、実際のIPを壊しました)プライバシー保護のため):

10.83.103.44, 10.83.103.44 
10.83.198.52, 10.83.198.52 
10.53.109.36, 10.53.109.36 
unknown, unknown 
192.168.1.43, 127.0.0.1 
192.168.11.189, 127.0.0.1 
10.1.6.3, 216.x.y.194, 10.37.52.202 
192.168.50.250, 38.x.y.5, 10.37.31.201 

HAproxyのドキュメントによると、最後のX-Forwarded-Forは追加された正しいものであるはずですが、そうではないようです。私のアプリケーションはクライアントIPを地理検索に使用しているため、これは単なるログの問題ではなく、実際に問題を引き起こしています。

私がしたいのは、HAproxyがクライアントのIPを、受信した既存のX-Forwarded-Forヘッダーに追加するのではなく、単に上書きすることです。したがって、X-Forwarded-For: 10.1.2.3 IPアドレス98.76.54.32から、クライアントに送信されるのはX-Forwarded-For: 98.76.54.32。これを行う方法はありますか?このような明らかな迷惑メールがノードに到達している理由を知りたい-unknown, unknownは明らかにジャンク情報ですが、回避策が存在する場合はそれで解決します。

前もって感謝します。

6
Evan

HAProxyが独自に追加する前に、リクエストヘッダーから切り離します。

reqidel ^X-Forwarded-For:.*

この変更のリスクは、「実際の」クライアントIPアドレスに関する情報が失われることです。ログには、クライアントが使用しているプロキシサーバーのIPが表示されます。大丈夫そうですね。

余談ですが、X-Forwarded-Forヘッダーの追加順序の混乱に関する興味深い情報については この質問 を参照してください。

12
Shane Madden

まだ困惑している人は、次の2つのスニペットのいずれかを直接使用できます。

最初:

backend forward_real_ip
    mode http
    reqidel ^X-Forwarded-For:.*
    option forwardfor

第二:

backend forward_real_ip
   mode http
   http-request set-header X-Forwarded-For %[src]

HAProxyのドキュメントを参照してください。

1
zhouji

特にforwardedforオプションでhaproxyのドキュメントを見ると、次のように読むことができます。

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

あなたの設定の対応する行を他のようなものに変更できます:

option forwardfor except 127.0.0.1 header My-X-Forwarded-For

この方法では、2つのX-Forwarded-Forヘッダー。クライアントに実際のIPを維持すると便利であると同時に、混乱を招くことなくhaproxyがヘッダーを挿入するようになります。

これはあなたが興味を持つかもしれないもう一つのオプションです:)

0
Khaled