Перейти к содержимому

Окружение за прокси и в облаке - адреса, протокол, доступ наружу

Настраиваем сайт, перед которым стоит балансировщик, защитный сервис или сеть облачного провайдера, чтобы он видел посетителя, а не посредника.

Решение

Смотрим, какой адрес видит сайт:

printf("адрес=%s протокол=%s\n",
$_SERVER['REMOTE_ADDR'], $_SERVER['HTTPS'] ?? 'off');
print_r(array_intersect_key($_SERVER, array_flip([
'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_PROTO', 'HTTP_X_REAL_IP',
])));
// один и тот же адрес у всех посетителей означает, что виден прокси

Один и тот же адрес у всех посетителей сайта - главный признак работы через посредника. Он ломает всё, что опирается на адрес: статистику, ограничение попыток входа, региональность и защиту от перебора.

Возвращаем реальный адрес на веб-сервере:

set_real_ip_from 10.0.0.0/8; # адреса самого балансировщика
real_ip_header X-Forwarded-For; # заголовок, в котором приходит гость
real_ip_recursive on;
# доверять заголовку можно только от своих адресов, иначе его подделает кто угодно

Доверять этому заголовку можно только от известных адресов посредника. Открытое доверие любому источнику превращает подмену адреса в задачу на одну строку для любого желающего.

Передаём протокол запроса:

proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host; # без него сайт соберёт ссылки на чужой домен
# в настройках сайта на стороне приложения эти заголовки и читают

Без признака протокола сайт считает запрос незащищённым и отправляет посетителя на защищённый адрес. Посредник снова приходит по незащищённому протоколу, и браузер сообщает о слишком большом числе переходов.

Проверяем исходящий доступ:

Окно терминала
curl -sS -o /dev/null -w '%{http_code}\n' https://www.1c-bitrix.ru/
getent hosts smtp.example.com
# обновлениям, проверке лицензии и почте нужен доступ наружу, а не только внутрь
# проверяют с самого сервера сайта: сеть администратора устроена иначе

Закрытая наружу сеть остаётся вполне типовой настройкой облака. Сайт при этом работает, а обновления, проверка ключа и отправка почты молча не проходят, и связывают это с сетью далеко не сразу.

Схему прохождения запроса стоит держать записанной. Через полгода никто не помнит, где заканчивается защищённое соединение и кто именно подставляет адрес гостя, а разбор простоя начинается именно с этих двух вопросов.

Проверять доступность площадки стоит с чужой сети, а не с самого сервера. Изнутри недоступный снаружи порт выглядит открытым, и половина разбирательств с балансировщиком начинается именно с этой ошибки.

Кэш и композит за посредником живут уже по его собственным правилам. Посредник, кэширующий страницы по своему усмотрению, показывает посетителям чужие персональные блоки, и лечится это заголовками ответа, а не настройками сайта.

Типичные проблемы

У всех посетителей один и тот же адрес.

Сайт видит адрес посредника вместо адреса самого пришедшего к нему гостя. Реальный адрес приходит отдельным заголовком запроса от балансировщика.

Браузер сообщает о цикле переходов.

Признак защищённого протокола запроса до самого сайта не доходит вовсе. Сайт бесконечно отправляет пришедший запрос на защищённый адрес.

Обновления и проверка ключа не проходят.

В облачной сети закрыт весь исходящий доступ наружу. Сайт при этом работает, а связь с внешними службами уже не устанавливается.

Адрес посетителя можно подделать.

Заголовку с адресом доверяют без ограничения по источнику запроса. Доверять ему можно только от известных адресов своего посредника.

Посетители видят чужие персональные блоки.

Посредник кэширует готовые страницы сайта целиком. Персональные области закрывают от его кэша заголовками ответа.

Частые вопросы

Почему ограничение попыток входа не работает?

Оно считает попытки по адресу, а адрес у всех один. После возврата реального адреса счёт начинает работать.

Нужен ли сертификат на самом сервере за балансировщиком?

Не всегда: часто защищённое соединение заканчивается на балансировщике. Тогда серверу достаточно внутреннего соединения.

Как проверить, доходит ли адрес гостя?

Вывести адрес и заголовки на служебной странице и открыть её с телефона по мобильной сети. Совпадение адресов и есть проверка.

Что с почтой в облаке?

Исходящий порт почты у большинства провайдеров закрыт по умолчанию. Почту отправляют через внешний сервис, а не с самого сервера.

Смежное

Первоисточник