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

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

Я тестирую новую настройку веб-сервера, у которой есть несколько проблем. По сути, у нас есть веб-сервер, на котором код использует удаленный 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

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

- if the application needs to log the original client's IP, use the
  "forwardfor" option which will add an "X-Forwarded-For" header with the
  original client's IP address. You must also use "httpclose" to ensure
  that you will rewrite every requests and not only the first one of each
  session:
        option httpclose
        option forwardfor

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

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

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

   option http-server-close
   option forwardfor

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

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

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

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

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

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

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

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

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

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

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

Взгляни на:

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

и

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

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

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

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

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

haproxy.conf:

.

.

слушайте ssl 0.0.0.0:443

режим tcp

баланс минимум

опция httpchk GET / ping

опция журнала проверки работоспособности

server w1 192.168.1.1:443 send-proxy check check-ssl verify none

server w2 192.168.1.1:443 send-proxy check check-ssl verify none

.

.

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;

.

.