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

Можно ли настроить Nginx для приема запросов с прокси-протоколом и без него на один и тот же URL-адрес?

У меня есть набор приложений за прокси-сервером, который соответствующим образом пересылает запрос и использует протокол прокси для сохранения исходных данных запроса. Приложения также отправляют запросы друг другу, поэтому я хочу, чтобы они принимали запросы с прокси-протоколом и без него. Можно ли каким-то образом настроить Nginx для этого без использования другого server_name или порт?

Без использования другого server блок, единственный способ сделать это - с другим listen директивы. Это означает, что сервер, на котором запущен nginx, должен иметь разные IP-адреса для подключения к серверу с внешнего прокси и из внутренней фермы серверов.

Например, у вас может быть внутренняя сеть 10.87.239.0/24 для ваших внутренних приложений, а сервер, на котором запущен nginx, находится на 10.87.239.3. Затем у вас есть внешняя сеть 10.87.238.0/24, которую ваш внешний прокси-сервер использует для доступа к nginx, и сервер имеет адрес 10.87.238.3. В этом случае вы можете настроить nginx как:

server {
    # PROXY protocol connections
    listen 10.87.238.3:443 ssl http2 proxy_protocol;
    set_real_ip_from 10.87.238.2;  # The address(es) of the proxies
    real_ip_header proxy_protocol;

    # Direct connections
    listen 10.87.239.3:443 ssl http2;
    listen [::]:443 ssl http2;

    # everything else for this block
}

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

Спецификация протокола прокси на Протокол прокси явно указывает на риск запуска прослушивателя, который пытается угадать, используется ли протокол прокси на том же адресе и порту.

The receiver MUST be configured to only receive the protocol described in this
specification and MUST not try to guess whether the protocol header is present
or not. This means that the protocol explicitly prevents port sharing between
public and private access. Otherwise it would open a major security breach by
allowing untrusted parties to spoof their connection addresses. The receiver
SHOULD ensure proper access filtering so that only trusted proxies are allowed
to use this protocol.

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