Неверный IP-адрес клиента передан Apache из Varnish и HAProxy

У меня есть установка, в которой я использую Varnish / Hitch >> HAProxy >> Apache . Это работает, за исключением проблемы, когда IP-адрес клиента неправильно передается на внутренний сервер Apache. Журнал Apache показывает IP-адрес машины, на которой работает HAProxy.

Моя командная строка Varnish содержит:

varnishd -b 127.0.0.1:8080 -a 127.0.0.1:8000,PROXY

Hitch имеет следующее:

backend = "[127.0.0.1]:8000"
write-proxy-v2 = on

HAProxy настроен с помощью:

defaults
    option forwardfor
    mode http

frontend CacheFrontend
    bind    *:8080 

backend apache
    server          apache web01:80

В Apache я использую remoteip_module и есть это в httpd.conf

RemoteIPHeader X-Forwarded-For

Из того, что я прочитал, у меня нет причин изменять формат журнала в Apache при использовании этого модуля.

Я не уверен где неверная конфигурация.

РЕДАКТИРОВАТЬ:

Вот короткий сценарий PHP, показывающий, что передается в Apache:

<?php

echo $_SERVER['HTTP_X_FORWARDED_FOR'] . PHP_EOL;
echo $_SERVER['REMOTE_ADDR'] . PHP_EOL;
<redacted_client_ip>, 127.0.0.1
10.7.7.107

10.7.7.107 - это IP-адрес машины HAProxy.

0
задан 23 December 2020 в 09:36
1 ответ

Протокол PROXY определенно является правильным выбором, поскольку он передает исходный IP-адрес клиента независимо от количества переходов.

Однако для того, чтобы это работало, все переходы должны понимать протокол PROXY.

Varnish

Я не видел этого в вашем обзоре конфигурации, но вам определенно следует установить свойство .proxy_header в определении бэкенда вашего сервера Varnish.

Удалите параметр командной строки -b Varnish и замените его типичным -f /etc/varnish/default.vcl. В файле default.vcl вы должны объявить свой сервер и убедиться, что он говорит PROXY.

Вот пример файла default.vcl:

vcl 4.0;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .proxy = 2;
}

Как уже упоминалось, -b следует заменить на -f. Вот как это может выглядеть:

varnishd -f /etc/varnish/default.vcl -a 127.0.0.1:8000,PROXY

HaProxy и Apache

Что касается HaProxy: убедитесь, что входящие соединения HaProxy также используют PROXY.

А для Apache вы можете просто прочитать заголовок X-Forwarded-For, чтобы получить IP-адрес клиента, или также принимать подключения по протоколу PROXY.

0
ответ дан 23 December 2020 в 07:28

Теги

Похожие вопросы