haproxy та пересилання IP-адреси клієнта на сервери


15

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

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

Я намагаюся отримати IP-адреси клієнта на веб-серверах, але досі не можу досягти успіху. Завжди бачу IP балансира навантаження.

Я використовую x-forward-for option, але це не вирішує проблему. Після цього я знайшов інший варіант " source 0.0.0.0:80 userc 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-адресу балансира. Це правильно, але це не те, чого я очікував. Незважаючи на параметр forfor ці команди, дав мені 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.


2

Якщо вам потрібен IP-адреса клієнта в журналі Apache, ви можете змінити свою конфігурацію apache, щоб увімкнути X-переадресацію на місце вихідного джерела (5 год)

#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

Просто спробував рішення системи @ і, схоже, ім'я заголовка було змінено з HTTP_X_FORWARDED_FORна x-forwarded-for. Можливо, це пов'язано з версією HAproxy, тому що відповідь була написана 5 років тому ...?

Як приклад, це працює над виробництвом:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.