web-dev-qa-db-ja.com

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

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を学ぶのを手伝ってくれませんか?

15
System

私はこの問題を解決しました。最初から問題なかったのかもしれません。この問題に直面したときに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に関する多くの欠けている点があります。

15
System

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
2

@Systemのソリューションを試したところ、ヘッダー名が_HTTP_X_FORWARDED_FOR_から_x-forwarded-for_に変更されたようです。おそらくそれはHAproxyのバージョンに関連しているのでしょう。なぜなら、答えは5年前に書かれたためです...?

例として、これは生産に取り組んでいます:

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

1
Roc Boronat