Назад | Перейти на главную страницу

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

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

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

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

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

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

option forwardfor

строка для использования в файле haproxy.cfg, а также другие параметры. Я пробовал эти варианты, включая перекомпиляцию haproxy ... Но настоящая проблема, связанная с изучением 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 в запросы клиента, отправляемые на наши веб-серверы. HAproxy поместил это поле в заголовок, но я проигнорировал это. Сегодня я понял, что это поле заголовка, и я должен читать этот заголовок вот так

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

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

Но я предлагаю получить данные заголовка для исследования другой информации - это функция 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.

Если вам нужен IP-адрес клиента в журнале Apache, вы можете изменить конфигурацию apache, чтобы регистрировать 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");