haproxyおよびサーバーへのクライアントIPアドレスの転送


15

HAproxyに問題があります。

着信HTTP要求を5つのWebサーバーに分散するロードバランサーとしてHAproxyを使用します。通常、クライアントリクエストは、ロードバランサーの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を知るのを助けてくれますか?


探しているものは「透過プロキシ」と呼ばれます。iptablesはどういうわけか関与していますが、どのように正確にわからないのですか。
sysadmin1138

透過プロキシを言うことで、私はそれを言及します、着信接続を配布する間、httpヘッダーを変更しないプロキシ。したがって、実際のWebページリクエスタクライアントのIPをWebサーバーに送信できます。それが透過プロキシから理解したことです。
システム

回答:


15

この問題を解決しました。初めから問題ではなかったのかもしれません。私はこの問題に直面したときにグーグル検索を行いました、そして私はそれを見ました

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がWebサーバーに送信されるクライアントのリクエストにx-forwarded-forヘッダーを挿入できるようにします。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について多くの欠落している点があります。


2

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

Marceloの回答に感謝しますが、ApacheログにクライアントのIPアドレスは必要ありません。私たちはphpスクリプトで学習しようとします。
システム

1

@Systemのソリューションを試したところ、ヘッダー名がからに変更されたHTTP_X_FORWARDED_FORようx-forwarded-forです。おそらく、5年前に答えが書かれていたので、HAproxyバージョンに関連しています。

例として、これは本番で動作しています:

String requestIp = httpRequest.getHeader("x-forwarded-for");

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.