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