Можно ли установить X-Real-IP при использовании прокси-протокола? - PullRequest
0 голосов
/ 13 декабря 2018

Моя настройка следующая:

Балансировщик нагрузки → nginx → Traefik

Балансировщик нагрузки на месте не поддерживает протокол прокси.Вместо этого он добавляет реальный IP-адрес клиента в поле параметров TCP (я знаю, я знаю! Подробности ).Это то, что Traefik не поддерживает.

Чтобы получить настоящий IP-адрес для Traefik, я добавил промежуточный элемент nginx, который не делает ничего, кроме принятия соединений через порты 80 и 443 и добавления протокола Proxy при использовании SSL.Traefik настроен для протокола Proxy.Все работает как положено.

Однако я хотел бы установить заголовок X-Real-IP на правильный IP, когда используется протокол Proxy.Когда я пытаюсь установить заголовок вручную через curl , он используется, так что клиенты могут перезаписать его.

Как я могу сказать Traefik всегда установить X-Real-IP для IP-адреса в соответствии с протоколом прокси-сервера?

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Я решил свою проблему и теперь вижу яснее.Он зависит от того, какой узел в вашей конфигурации (Load Balancer → nginx → Traefik) завершает запрос клиента.В моей настройке (Load Balancer → Traefik), Load Balancer использует NATing для отправки запроса в Traefik.Затем Traefik принимает запрос клиента и отправляет новый запрос соответствующему бэкэнду.Поэтому мне пришлось настроить Traefik так, чтобы он никогда не доверял заголовку X-Real-Ip, но всегда устанавливал исходный ip запроса в заголовке X-Real-Ip.Конфигурация выглядит примерно так:

    [entryPoints.http.proxyProtocol]
      insecure = true
      trustedIPs = ["10.10.10.1", "10.10.10.2"]
    [entryPoints.http.forwardedHeaders]
      trustedIPs = ["10.10.10.1", "10.10.10.2"]

Наиболее часто встречающаяся конфигурация (я думаю) состоит в том, что балансировщик нагрузки принимает запрос клиента и затем отправляет новый запрос в nginx (балансировщик нагрузки обратного прокси-сервера).В этом случае балансировщик нагрузки должен установить заголовок X-Real-Ip, nginx должен распространить заголовок на Traefik, а Traefik должен быть настроен на доверие nginx в качестве источника для заголовка X-Real-Ip.

0 голосов
/ 11 июля 2019

Я только что заглянул в исходный код из-за аналогичной проблемы.Traefik устанавливает заголовок X-Real-Ip с исходным IP-адресом перенаправляемого запроса.Если заголовок X-Real-Ip уже существует, он будет пропущен без изменений.Я надеюсь, что это отвечает на вопрос.

if req.Header.Get (XRealIp) == "" {
  req.Header.Set (XRealIp, clientIP)
}
...