Протокол прокси и SSL

У меня есть следующая конфигурация:

HAProxy -> NGinx -> Бэкэнд

(HAProxy используется для балансировки нагрузки, NGinx для завершения SSL) Конфигурация не может быть изменена

Я пытаюсь передать исходный IP-адрес на сервер, используя протокол прокси. Работая без SSL, все работает нормально. Добавляя SSL к уравнению, я либо не получаю подтверждение SSL, либо не вижу способа заставить NGinx передать прокси-протокол на сервер.

Пример конфигурации 1:

Прокси-протокол хорошо передается по не ssl-соединению, но для ssl-соединения ssl-соединение прерывается

HAProxy:

listen HTTP-TCP_8090
    bind :8090

    server nginx nginx:8090 send-proxy

listen HTTPS-TCP_8092
    bind :8092

    server nginx nginx:8092 send-proxy

Nginx:

stream {
    upstream some_backend {
         server some_host:8090;
    }

    server {
        listen                8090;
        listen                8092 ssl;
        proxy_pass            some_backend;
        proxy_protocol        on;

        ssl_certificate       /etc/ssl/server.crt;
        ssl_certificate_key   /etc/ssl/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSLTCP:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
    }
}

Пример конфигурации 2:

оба соединения, ssl и нет, работают хорошо, но заголовок протокола прокси не передается бэкэнду в обоих случаях

HAProxy:

listen HTTP-TCP_8090
    bind :8090

    server nginx nginx:8090 send-proxy

listen HTTPS-TCP_8092
    bind :8092

    server nginx nginx:8092 send-proxy

Nginx:

stream {
    upstream some_backend {
         server some_host:8090;
    }

    server {
        listen                8090 proxy_protocol;
        listen                8092 proxy_protocol ssl;
        proxy_pass            some_backend;

        ssl_certificate       /etc/ssl/server.crt;
        ssl_certificate_key   /etc/ssl/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSLTCP:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
    }
}

Любая идея, как я могу создать конфигурацию, которую он знает о протоколе прокси по соединению SSL, а также передает заголовок на сервер?

1 ответ

Ну, похоже, документация NGinx не очень хорошая...

https://www.nginx.com/resources/admin-guide/proxy-protocol/

если вы хотите, чтобы nginx принимал протокол прокси, вам нужно добавить параметр proxy_protocol в директиве listen

listen 8090 proxy_protocol;

если вы хотите, чтобы nginx отправлял протокол прокси, вам нужно добавить директиву proxy_protocol в разделе сервера

proxy_protocol on;

если вы хотите, чтобы nginx принимал протокол прокси и передавал принятый заголовок на другом конце, вам нужно добавить оба! Звучит логично, правда? Правильно. Но это не задокументировано хорошо. Легко понять, что при работе с трафиком, отличным от http, простая установка директивы proxy_protocol в разделе сервера включает его на обоих концах соединения. Итак, наконец, это конфигурация, которая работает:

stream {
    upstream some_backend {
         server some_host:8090;
    }

    server {
        listen                8090 proxy_protocol;
        listen                8092 proxy_protocol ssl;
        proxy_pass            some_backend;
        proxy_protocol        on;

        ssl_certificate       /etc/ssl/server.crt;
        ssl_certificate_key   /etc/ssl/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSLTCP:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
    }
}
Другие вопросы по тегам