Удаленные IP-адреса с HAProxy


19

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

Тем не менее, мы только что определили это за ha_proxy, чтобы мы могли взглянуть на добавление еще нескольких серверов приложений, но теперь удаленный IP-адрес всегда отображается как 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

Ответы:


31

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

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

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

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

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

   option http-server-close
   option forwardfor

2
Лучше использовать, option forwardfor header X-Real-IPи reqidel ^X-Real-IP:это перестает подделывать IP-адреса в ваших журналах. К сведению: X-Real-IPзаголовок по умолчанию для NginXопции set_real_ip_from.
Тино

Вопрос не затрагивает nginx. X-Real-IP не будет работать.
Рик Флетчер

1. эти две опции должны быть установлены в разделе конфигурации внешнего или внутреннего интерфейса? (Потому что они здесь не работают) 2. Требуется ли какой-либо тип конфигурации на уровне Tomcat?
yglodt

6

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

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

Несколько заметок:

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

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


2

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


1

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

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

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


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

1

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

Одним из решений может быть, если ваша единственная проблема связана с веб-сервером, - заглянуть в HTTP-заголовок X-forwarded-for, который должен содержать адрес клиента. Теперь это в значительной степени зависит от приложения / языка, но взгляните на этот пример в 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


неправильно, вы можете с опцией "forwardfor"
wittwerch

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

0

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

Взгляни на:

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

и

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

Использование IPVS в режиме «IP-туннелирование» или «Прямая маршрутизация» сохраняет адрес клиента.


0

Попробуйте 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

-1

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

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

haproxy.conf:

,

,

слушай ssl 0.0.0.0:443

режим tcp

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

опция httpchk GET / ping

опция log-health-проверок

сервер w1 192.168.1.1:443 проверка отправки-прокси check-ssl проверки нет

server w2 192.168.1.1:443 проверка отправки-прокси 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;

,

,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.