Віддалені 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
        варіант вперед

Вказується, що програма повинна звертатися до заголовка 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-адреси у ваших журналах. FYI: 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 або новішої версії.
Ladadadada

1

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

Одне рішення може бути, якщо ваша єдина проблема з веб-сервером, заглянути в заголовок X-перенаправленого 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


неправильно, ви можете з опцією "форвард"
wittwerch

Так, і ця опція вмикається за замовчуванням, але те, що вона робить, - це встановлення заголовка HTTP X-Forwarded-For. Те, що я говорив, і мені здається, саме те, що запитував запитувач,
стосувалося

0

Ну, здається, що X-Forwarded-for не працює добре для вашої установки. Отже, чи є якась особлива причина, щоб ви дотримувалися гапрокси? Здається, що 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:1043

режим tcp

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

варіант httpchk GET / ping

опція журналу здоров'я-перевірки

сервер w1 192.168.1.1.4543 check-sxy check check-ssl verify none

сервер w2 192.168.1.1.4543 check-proxy check check ssl verify none

.

.

Nginx потребує підтримки проксі-протоколу

nginx.conf:

.

.

прослухати 192.168.1.1.4543 ssl proxy_protocol;

.

.

set_real_ip_f 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.