В настоящее время я использую аппаратный балансировщик нагрузки Cisco CSS. С точки зрения веб-сервера IP-адрес конечного пользователя проставляется во всем трафике, как будто балансировщик нагрузки вообще не присутствует.
Сейчас я рассматриваю программные замены, такие как HAProxy, Pound или AWS ELB. У них всех есть одна общая черта: веб-сервер получает IP-адрес балансировщика нагрузки вместо IP-адреса конечного пользователя. Ваша система должна знать об этом и обращаться к заголовку X-Forwarded-For, если вам нужен IP-адрес конечного пользователя, или, в случае SSL, расшифровывать и повторно шифровать трафик.
Итак, мой вопрос: почему так происходит? Почему программные балансировщики нагрузки не могут вести себя так же, как аппаратные балансировщики нагрузки, а просто передавать TCP-пакеты, как если бы они были простым сетевым устройством?
решение1
Потому что это программное обеспечение работает на уровне 7 (приложение)Модель OSI, есть программные решения, которые работают на уровне 3/4, напримерЛВС.
Что касается вашей проблемы, то решение довольно простое, если вы используете Apache в качестве веб-сервера, вам просто нужно установитьmod_rpafЭтот модуль позволяет напрямую регистрировать IP-адрес, предоставленный заголовком X-Forwarded-For.
решение2
Хм, если коротко, то «могут», поэтому я не уверен, что на этот вопрос можно ответить.
Однако я рискну предположить, что разница между аппаратными и программными решениями заключается в том, что аппаратное устройство предназначено для работы в качестве маршрутизатора, то есть оно будет видеть весь трафик от клиента к конечному серверу и может соответствующим образом обрабатывать его в обоих направлениях, в то время как программные решения устанавливаются на устройствах, которые не маршрутизируют и, следовательно, переписывают адрес клиента, что является дешевым и простым способом заставить обратный трафик проходить через них для обработки.
решение3
Программные балансировщики нагрузки работают на более высоком уровне стека TCP. Для достижения того же эффекта следует использовать iptables
. Пример можно найти здесьздесь.
решение4
Они могут, это не поддерживается по умолчанию в ядре. Обычно это называют (я полагаю) подменой исходного адреса. Если вы загуглите "source spoofing haproxy", то получите несколько результатов.
В частности.
http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/