Вопрос: Удаленный IP-адрес с HAProxy


Я тестирую новую настройку веб-сервера, которая имеет пару проблем. По сути, у нас есть веб-сервер, где код использует удаленный IP для некоторых интересных вещей, а также некоторые Apache-каталоги, привязанные к некоторым определенным IP-адресам (наш офис и т. Д.).

Тем не менее, мы просто забросили это за ha_proxy, поэтому мы можем посмотреть на добавление еще нескольких серверов приложений, но теперь удаленный IP-адрес всегда используется как прокси-сервер, а не настоящий удаленный пользователь. Это означает, что мы не можем добраться до некоторых мест, и наше приложение ведет себя немного странно, где важна IP-адрес пользователя.

Наша конфигурация такова:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check

19
2018-06-23 14:00


Источник




Ответы:


Цитируется из документа HAProxy по адресу haproxy.1wt.eu,

- если приложение необходимо зарегистрировать IP-адрес исходного клиента, используйте
  «forwardfor», который добавит заголовок «X-Forwarded-For» с
  IP-адрес оригинального клиента. Вы также должны использовать «httpclose» для обеспечения
  что вы будете переписывать все запросы, а не только первую
  сессия:
        опция httpclose
        вариант вперед

Сообщается, что приложение должно обрабатывать HTTP-заголовок X-Forwarded-For, чтобы знать клиентский IP-адрес. Кажется, единственный способ пойти в вашем случае.

Обновлено для HAProxy 1.4

Haproxy 1.4 представила новый режим с опцией http-server-close. Это   все еще закрыл соединение с сервером, но поддерживает сохранение работоспособности   к клиенту, если это возможно и используется. На большинстве настроек вы, вероятно,   хотите использовать это, поскольку это помогает с задержкой в ​​одиночной высокой задержке   часть вашего соединения (между Haproxy и клиентом).

   option http-server-close
   option forwardfor

31
2018-06-23 14:32



Лучшее использование option forwardfor header X-Real-IP а также reqidel ^X-Real-IP:, это останавливает подделку IP-адресов в ваших журналах. FYI: X-Real-IP является заголовком по умолчанию для NginXвариант set_real_ip_from, - Tino
В вопросе не упоминается nginx. X-Real-IP не будет работать. - Rick Fletcher
1. Должны ли быть установлены эти два параметра в разделе конфигурации интерфейса или бэкэнд? (Потому что они, похоже, не работают здесь). 2. Нужен ли какой-либо тип конфигурации на уровне Tomcat? - yglodt


Существует способ перекомпилировать HAproxy для включения Tproxy, который позволит перенаправить исходный адрес.

Здесь есть сообщение в блоге: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Несколько примечаний:

Последнее linux-ядро (2.6.28-11-server) включает поддержку TProxy, поэтому перекомпиляция ядра не требуется.

Не забудьте настроить серверы в вашей ферме с адресом шлюза по умолчанию, который указывает на сервер HAProxy.


6
2017-09-05 05:16





Использовать модуль apache rpaf http://stderr.net/apache/rpaf/  Я знаю, что это и старый пост, но мне потребовались дни, чтобы найти это. Это представит любому приложению x-forwarded-for ip.


2
2018-01-29 16:06





Обратите внимание, что вы можете переопределить то, что приложение видит в моем изменении заголовков Apache:

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

Однако это не работает для доступа Apache через «Разрешить» и т. Д.


1
2018-06-23 14:19



Это может привести к непредсказуемым результатам, если клиент отправит существующий X-Forwarded-For заголовок, поскольку новый IP-адрес добавляется в конец существующего списка, разделенный запятой и пробелом. Изменить (.*) в ([^ ]*)$ только захватить последний IP ... или использовать mod_rpaf или mod_remoteip для Apache 2.4 или новее. - Ladadadada


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

Одним из решений может быть, если ваша единственная проблема связана с веб-сервером, изучить заголовок HTTP с пересылкой HTTP, который должен содержать адрес клиента. Теперь это довольно специфическое приложение / язык, но посмотрите на этот пример в php:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

Если вы также хотите зарегистрировать исходный адрес, вы можете изменить LogFormat в httpd.conf, чтобы выглядеть примерно так:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common


1
2018-06-23 14:26



неправильно, вы можете с опцией «forwardfor» - wittwerch
Да, и эта опция включена по умолчанию, но то, что она делает, это настройка заголовка X-Forwarded-For HTTP. То, что я говорил, и мне кажется, что на самом деле спрашивал искатель, был фактический адрес источника IP-пакета - Thiagodrv


Похоже, что X-Forwarded-for не подходит для вашей настройки. Итак, есть ли какая-то особая причина для вас придерживаться haproxy? Похоже, что IPVS более подходит для ваших нужд (я действительно использую ldirector, который, в свою очередь, использует ipvs).

Взгляни на:

http://kb.linuxvirtualserver.org/wiki/IPVS

а также

http://www.vergenet.net/linux/ldirectord/

Использование IPVS в режиме «IP Tunneling» или «Direct Routing» сохраняет адрес клиента.


0
2018-06-23 14:36





Попробуйте mod_extract_forwarded из http://www.openinfo.co.uk/apache/

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

0
2017-10-29 14:48





Простой способ с haproxy в режиме tcp и nginx:

добавьте параметр send-proxy в качестве сервера:

haproxy.conf:

,

,

слушать ssl 0.0.0.0:443

режим tcp

баланс наименьшее

опция httpchk GET / ping

опция log-health-checks

server w1 192.168.1.1:443 send-proxy check check-ssl проверить нет

server w2 192.168.1.1:443 send-proxy check check-ssl проверить нет

,

,

Nginx нуждается в поддержке прокси-протокола

nginx.conf:

,

,

прослушать 192.168.1.1:443 ssl proxy_protocol;

,

,

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

,

,


-1
2018-01-20 17:01