haproxy и пересылка IP-адреса клиента на серверы

15

У меня проблема с HAproxy.

Я использую HAproxy в качестве балансировщика нагрузки, который распределяет входящие http-запросы на 5 веб-серверов. обычно клиентские запросы направляются на веб-серверы с IP-адресом loadbalancer. Но мне нужны клиентские IP-адреса или реальные IP-адреса, которые запрашивают что-то с веб-серверов. Потому что нам нужно регистрировать IP-адреса реальных клиентов.

Я пытаюсь получить IP-адреса клиентов на веб-серверах, но до сих пор не могу добиться успеха. Всегда вижу IP балансировщика нагрузки.

Я использую опцию x-forward-for, но проблема не решена. После этого я нашел другую опцию « source 0.0.0.0:80 использует rc clientip », но у меня возникла ошибка при попытке запустить HAproxy, что касается компиляции с опцией USE_TPROXY опции HAproxy. Я сделал это, я перекомпилирую HAproxy с опцией USE_TPROXY, но ничего не меняет. что я могу сделать, чтобы узнать реальные 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 я использовал одну из этих двух строк.

Кто-нибудь помогает мне узнать реальные IP-адреса клиентов, которые запрашивают наши серверы?

система
источник
То, что вы ищете, называется «прозрачный прокси». iptables как-то участвует, но я точно не знаю, как именно.
sysadmin1138
говоря о прозрачном прокси, я упоминаю, что прокси, которые не изменяют заголовки http, распределяют входящие соединения. таким образом, настоящий IP-адрес запрашивающего клиента веб-страницы может быть отправлен на веб-сервер. Вот что я понял из прозрачного прокси.
Система

Ответы:

15

Я решил эту проблему. Может быть, это не было проблемой с самого начала. Я сделал поиск в Google, когда столкнулся с этой проблемой, и я увидел, что

option forwardfor

строка для использования в файле haproxy.cfg, а также другие параметры. Я попробовал эти варианты, включая перекомпиляцию haproxy ... Но настоящая проблема, связанная с изучением реальных IP-адресов клиентов на веб-серверах, не исходит от HAproxy, а заключается в чтении заголовков серверными сценариями, в нашем случае этот язык сценариев - PHP.

Я пытаюсь узнать IP-адреса клиента по этим командам

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

и эти команды отображают IP-адрес loadbalancer. Это правильно, но это не то, чего я ожидаю. Несмотря на опцию forwardfor этих команд, мне дали IP loadbalancer

Используя опцию forwardfor, мы включаем HAproxy для вставки заголовка x-forwarded-for в запросы клиента, отправляемые на наши веб-серверы. HAproxy поместил это поле в заголовок, но я проигнорировал это. Сегодня я понял, что это поле заголовка, и я должен прочитать этот заголовок, как это

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

С помощью этой команды я получил IP-адрес клиента, а не IP-адрес loadbalancer.

Но мое предложение состоит в том, чтобы получить данные заголовка для исследования другой информации - это функция getallheaders () для PHP.

//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

Тем не менее, у меня много пропущенных вещей в HAproxy, таких как значение uid или gid.

система
источник
2

Если вам нужен клиентский IP-адрес в журнале Apache, вы можете изменить свой 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
Марсело Биттенкур
источник
Спасибо за ваш ответ Марсело, но нам не нужен IP-адрес клиента в журнале Apache. мы пытаемся учиться с помощью наших PHP-скриптов.
Система
1

Только что попробовал решение @ System, и кажется, что название заголовка было изменено с HTTP_X_FORWARDED_FORна x-forwarded-for. Возможно, это связано с версией HAproxy, потому что ответ был написан 5 лет назад ...?

Как пример, это работает на производстве:

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

Рок Боронат
источник