私の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
は明らかにジャンク情報ですが、回避策が存在する場合はそれで解決します。
前もって感謝します。
HAProxyが独自に追加する前に、リクエストヘッダーから切り離します。
reqidel ^X-Forwarded-For:.*
この変更のリスクは、「実際の」クライアントIPアドレスに関する情報が失われることです。ログには、クライアントが使用しているプロキシサーバーのIPが表示されます。大丈夫そうですね。
余談ですが、X-Forwarded-For
ヘッダーの追加順序の混乱に関する興味深い情報については この質問 を参照してください。
まだ困惑している人は、次の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のドキュメントを参照してください。
特に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がヘッダーを挿入するようになります。
これはあなたが興味を持つかもしれないもう一つのオプションです:)