HAproxyに問題があります。
HAproxyをロードバランサーとして使用して、着信HTTPリクエストを5つのWebサーバーに分散します。通常、クライアント要求はロードバランサーのIPを使用してWebサーバーに転送されます。しかし、Webサーバーに何かを要求するクライアントIPまたは実際のIPが必要です。実際のクライアントのIPを記録する必要があるからです。
WebサーバーでクライアントのIPを取得しようとしましたが、今のところ成功できません。ロードバランサーのIPが常に表示されます。
X-forward-forオプションを使用していますが、問題は解決していません。その後、別のオプション "source 0.0.0.0:80 usesrc clientip"を見つけましたが、HAproxyのUSE_TPROXYオプションを使用してコンパイルする必要があるHAproxyを実行しようとするとエラーが発生しました。私はそれをしました、私はUSE_TPROXYオプションでHAproxyを再コンパイルしますが、何も変更しません。実際のクライアントのIPを学習するにはどうすればよいですか。
私のLinuxカーネルのバージョンは2.6.32-34です。つまり、カーネルは透過プロキシをサポートしています。私はUBUNTU 10.4 LTSを使用しています
私の設定ファイルはここにあります
global
maxconn 100000
uid 99
gid 99
daemon
defaults
option forwardfor except 127.0.0.1
mode http
(1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
(2)source 0.0.0.0:80 usesrc clientip
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen myWeb 0.0.0.0:80
mode http
balance source
option forwardfor header X-Client
option http-server-close
stats enable
stats refresh 10s
stats hide-version
stats scope .
stats uri /lb?stats
stats realm LB2\ Statistics
stats auth admin:xXx
server S1 192.168.1.117:80 check inter 2000 fall 3
server S2 192.168.1.116:80 check inter 2000 fall 3
server S3 192.168.1.118:80 check inter 2000 fall 3
(1)(2)HAproxyのテスト中、私はこれら2つの行のいずれかを使用しました。
誰かが私たちのサーバーからリクエストされているクライアントの実際のIPを学ぶのを手伝ってくれませんか?
私はこの問題を解決しました。最初から問題なかったのかもしれません。この問題に直面したときにgoogle searchを実行し、それを見た
option forwardfor
haproxy.cfgファイルやその他のオプションで使用するための行。私はhaproxyの再コンパイルを含むそれらのオプションを試しました...しかし、Webサーバー上の実際のクライアントのIPの学習に関連する実際の問題はHAproxyからではなく、サーバースクリプトによるヘッダーの読み取りに関するものです。このスクリプト言語はPHPです。
これらのコマンドでクライアントのIPを学習しようとしています
echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];
これらのコマンドは、ロードバランサーのIPを表示します。これは正しいですが、それは私が期待していることではありません。 forwardforオプションにもかかわらず、これらのコマンドは、ロードバランサーのIPを提供しました
Forwardforオプションを使用することにより、HAproxyがx-forwarded-forヘッダーをWebサーバーに送信されるクライアントのリクエストに挿入できるようにします。 HAproxyはこのフィールドをヘッダーに配置しましたが、これは無視しました。今日私はこれがヘッダーフィールドであり、このヘッダーをこのように読まなければならないことに気付きました
echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];
このコマンドで、クライアントのIPアドレスをロードバランサーのIPアドレスではなく取得しました。
しかし、私の提供は、ヘッダーデータを取得して他の情報を調査するためのもので、PHPのgetallheaders()関数です。
//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
echo "$name: $value<br>\n";
}
私の最後のhaproxy.cfgファイルの終わりは以下のようです。
global
maxconn 100000
uid 99
gid 99
daemon
defaults
option forwardfor except 127.0.0.1
mode http
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen myWeb 0.0.0.0:80
mode http
balance source
option forwardfor
option http-server-close
stats enable
stats refresh 10s
stats hide-version
stats scope .
stats uri /lb?stats
stats realm LB2\ Statistics
stats auth admin:passwd
server S1 192.168.1.117:80 check inter 2000 fall 3
server S2 192.168.1.116:80 check inter 2000 fall 3
server S3 192.168.1.118:80 check inter 2000 fall 3
それにもかかわらず、uidやgidの意味など、HAproxyに関する多くの欠けている点があります。
ApacheログにクライアントIPアドレスが必要な場合は、Apache confを変更して、元のソースの代わりにX-forwarded-forをログに記録できます(5h)
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
@Systemのソリューションを試したところ、ヘッダー名が_HTTP_X_FORWARDED_FOR
_から_x-forwarded-for
_に変更されたようです。おそらくそれはHAproxyのバージョンに関連しているのでしょう。なぜなら、答えは5年前に書かれたためです...?
例として、これは生産に取り組んでいます:
String requestIp = httpRequest.getHeader("x-forwarded-for");