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

Отмена заголовка X-Forwarded-For в haproxy?

В моем балансировщике нагрузки 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, вставляющий его заголовок без путаницы.

Это еще один вариант, который может вас заинтересовать :)