У меня проблема с 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");