В моем балансировщике нагрузки HAProxy у меня есть следующие блоки конфигурации:
defaults
mode http
log global
option httplog clf
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
frontend main_http *:80
option forwardfor except 127.0.0.1
option httpclose
default_backend backend_http
backend backend_http
balance roundrobin
option httpchk
server node1 10.0.0.64:80 check port 80
server node2 10.0.0.65:80 check port 80
server node3 10.0.0.66:80 check port 80
На узлах (Tomcat) я регистрирую запросы в этом формате (в сочетании с x-forwarded-for в первом поле и реальным REMOTE_ADDR, прикрепленным к концу):
pattern='%{X-Forwarded-For}i - %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %a'
Кажется, это хорошо работает для большинства запросов, но в некоторых случаях, я предполагаю, что клиенты сами находятся за прокси, я вижу запросы, в которых первое поле содержит эти значения (каждая строка представляет один реальный запрос, я исказил реальные IP-адреса для конфиденциальности):
10.83.103.44, 10.83.103.44
10.83.198.52, 10.83.198.52
10.53.109.36, 10.53.109.36
unknown, unknown
192.168.1.43, 127.0.0.1
192.168.11.189, 127.0.0.1
10.1.6.3, 216.x.y.194, 10.37.52.202
192.168.50.250, 38.x.y.5, 10.37.31.201
Согласно документам HAproxy, последний X-Forwarded-For должен быть правильным, который он добавил, но, похоже, это не так. Мое приложение использует IP-адрес клиента для поиска по местоположению, так что это не просто проблема с логированием, это на самом деле все портит.
Я бы хотел сделать следующее: вместо того, чтобы HAproxy добавлял IP-адрес клиента к существующему заголовку X-Forwarded-For, который он получает, просто перезапишите его. Итак, если он получит X-Forwarded-For: 10.1.2.3
с IP-адреса 98.76.54.32, то, что он отправит клиентам, просто X-Forwarded-For: 98.76.54.32
. Есть какой-либо способ сделать это? Я хотел бы знать, почему такой очевидный мусор попадает в узлы - unknown, unknown
это явно нежелательная информация, но я соглашусь на обходной путь, если он существует.
Заранее спасибо.
Оторвите его от заголовка запроса, прежде чем HAProxy добавит свой:
reqidel ^X-Forwarded-For:.*
Риск этого изменения заключается в том, что вы потеряете информацию о «реальном» IP-адресе клиента - в ваших журналах будет отображаться IP-адрес прокси-сервера, который использует клиент. Похоже, ты с этим согласен!
В стороне см. этот вопрос для получения некоторой интересной информации о путанице с порядком добавления X-Forwarded-For
заголовок.
Для тех, кто все еще не понимает, вы можете использовать один из этих двух фрагментов напрямую:
Первый:
backend forward_real_ip
mode http
reqidel ^X-Forwarded-For:.*
option forwardfor
Второй:
backend forward_real_ip
mode http
http-request set-header X-Forwarded-For %[src]
См. Документацию HAProxy:
Если вы посмотрите документацию haproxy конкретно на forwardedfor
вариант, вы можете прочитать:
option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
Вы можете изменить соответствующую строку в своей конфигурации, например:
option forwardfor except 127.0.0.1 header My-X-Forwarded-For
Таким образом, у вас будет два X-Forwarded-For
заголовки. Возможно, вам будет полезно сохранить реальные IP-адреса клиентов, и в то же время вы получите haproxy, вставляющий его заголовок без путаницы.
Это еще один вариант, который может вас заинтересовать :)