Рейтинг:0

NGINX с открытым исходным кодом: обеспечьте зашифрованную связь между балансировщиком и узлами

флаг tr

Я настраиваю балансировщик нагрузки, который должен взаимодействовать с другими узлами с помощью TLS. Это важно, поскольку внутренние узлы не находятся в частной сети. Конфигурация приведена ниже.

В результате Nginx возвращает 502 Неверный шлюз, и Nginx, похоже, не может перенаправить на мои домены. Кроме того, поскольку я использую открытый источник версия, я не можем использовать решать ключевое слово внутри восходящей конфигурации. Как я могу изменить эту конфигурацию, чтобы Nginx шифровал данные между example.com -> backendX.example.com?

ВНИМАНИЕ: если я использую IP-адреса вместо URL-адресов в восходящем блоке, балансировка нагрузки работает, но я не думаю, что он зашифрован.

ОШИБКА:

*3 Ошибка проверки SSL-сертификата восходящего потока: (2: невозможно получить сертификат издателя) при установлении связи SSL с восходящим потоком, клиент: 0.0.0.0, сервер: lb.example.com

Результат openssl s_client -connect backend1.example.com:

Цепочка сертификатов
 0 s:CN = backend1.example.com
   i:C = US, O = Let’s Encrypt, CN = R3
 1 s:C = US, O = Let’s Encrypt, CN = R3
   i:C = США, O = Исследовательская группа по безопасности в Интернете, CN = ISRG Root X1
 2 s:C = США, O = Исследовательская группа по безопасности в Интернете, CN = ISRG Root X1
   i:O = Digital Signature Trust Co., CN = DST Root CA X3
вышестоящий пример.com{
   наименьшее_соединение;
   сервер backend1.example.com;
   сервер backend2.example.com;
}

сервер {

        слушать [::]:443 ssl ipv6only=on;
        слушать 443 ssl;
        имя_сервера lb.example.com;

        место расположения / {
                прокси_пароль https://example.com;

                proxy_ssl_trusted_certificate /etc/letsencrypt/.../chain.pem;
                proxy_ssl_session_reuse включено;
                proxy_ssl_verify включен;
                proxy_ssl_verify_depth 2;
                proxy_set_header Хост $host;
        }
    ssl_certificate /etc/letsencrypt/.../fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/.../privkey.pem; # под управлением Certbot
    включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

}

#### НГИНКС -Т
www-данные пользователя;
рабочие_процессы авто;
pid /run/nginx.pid;
включить /etc/nginx/modules-enabled/*.conf;

События {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Основные настройки
    ##

    отправить файл включен;
    tcp_nopush включен;
    tcp_nodelay включен;
    keepalive_timeout 65;
    типы_хэш_макс_размер 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    преобразователь 8.8.8.8 8.8.4.4 действительный=30 с;
    включить /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Настройки SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Удаление SSLv3, ссылка: POODLE
    ssl_prefer_server_ciphers включен;

    ##
    # Настройки ведения журнала
    ##

    журнал_доступа /var/log/nginx/access.log;
    журнал_ошибок /var/log/nginx/error.log;

    ##
    # Настройки Gzip
    ##

    gzip включен;

    # gzip_vary on;
    # gzip_proxyed любой;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Конфигурации виртуального хоста
    ##

    включить /etc/nginx/conf.d/*.conf;
    включить /etc/nginx/sites-enabled/*;
}

вышестоящий пример.com{
   наименьшее_соединение;
   сервер backend1.example.com;
   сервер backend2.example.com;
}

сервер {

        слушать [::]:443 ssl ipv6only=on;
        слушать 443 ssl;
        имя_сервера lb.example.com;

        место расположения / {
                прокси_пароль https://example.com;

                proxy_ssl_trusted_certificate /etc/letsencrypt/.../chain.pem;
                proxy_ssl_session_reuse включено;
                proxy_ssl_verify включен;
                proxy_ssl_verify_depth 2;
                proxy_set_header Хост $host;
        }
    ssl_certificate /etc/letsencrypt/.../fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/.../privkey.pem; # под управлением Certbot
    включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

}

сервер {
    если ($ хост = lb.example.com) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot


    слушать 80 default_server;
    слушать [::]:80 default_server;

    имя_сервера lb.example.com;
    вернуть 404; # под управлением Certbot


}

# файл конфигурации /etc/letsencrypt/options-ssl-nginx.conf:
# Этот файл содержит важные параметры безопасности. Если вы измените этот файл
# вручную, Certbot не сможет автоматически обеспечивать безопасность в будущем
# обновления. Вместо этого Certbot напечатает и зарегистрирует сообщение об ошибке с указанием пути к
# актуальный файл, на который вам нужно будет ссылаться при ручном обновлении
# этот файл.

общий ssl_session_cache: le_nginx_SSL: 10 м;
ssl_session_timeout 1440 м;
ssl_session_tickets выключен;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers выключен;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";

нгинкс -т nginx: синтаксис файла конфигурации /etc/nginx/nginx.conf в порядке nginx: проверка файла конфигурации /etc/nginx/nginx.conf прошла успешно

djdomi avatar
флаг za
почему вы используете https и порт для восходящих потоков? порт нужен только в том случае, если у вас не используются стандартные порты
AndreaCostanzo1 avatar
флаг tr
@djdomi Я также пробовал без указания портов. Это было испытание, которое я сделал, чтобы убедиться, что это не проблема
djdomi avatar
флаг za
оба бэкэнда могут быть разрешены?
AndreaCostanzo1 avatar
флаг tr
@djdomi Да, они оба доступны при обычном просмотре по их URL-адресу.
AndreaCostanzo1 avatar
флаг tr
@djdomi Я исправил пример. В любом случае, домен, используемый моим DNS, и домен, используемый другими узлами, отличаются друг от друга.
djdomi avatar
флаг za
пожалуйста, поделитесь выводом nginx -t, а затем nginx -T каждого другого сервера, потому что ИМХО часть сертификата ssl выглядит странно [посмотрите здесь в качестве примера] (https://www.digitalocean.com/community/tutorials/how-to- установка-nginx-балансировка-нагрузки-с-завершением SSL)
AndreaCostanzo1 avatar
флаг tr
@djdomi Добавлено ниже. Другие внутренние узлы — это уже существующие серверы на Apache, которые мы использовали в течение длительного времени. Я просто пытался использовать nginx в качестве балансировщика нагрузки, чтобы поместить его между ними. Если я удаляю URL-адреса и использую IP-адреса в восходящем направлении, все работает нормально, но проблема с использованием IP-адресов заключается в том, что я не знаю, зашифрована ли связь.
Michael Hampton avatar
флаг cz
Вам нужно указать «преобразователь», но я нигде его не вижу. Согласно [документам] (https://nginx.org/r/resolver), они должны находиться в блоках `http`, `server` или `location`.
AndreaCostanzo1 avatar
флаг tr
Есть (в моих настройках http)! Но это все еще не работает
Michael Hampton avatar
флаг cz
Хорошо, я вижу это сейчас. Я искал ваши записи error_log, но не могу найти их в вашем сообщении. Пожалуйста, попробуйте сделать другой запрос, а затем опубликуйте новые записи error_log.
AndreaCostanzo1 avatar
флаг tr
@MichaelHampton обнаружил проблему, но не нашел, как ее решить: во время рукопожатий SSL я не отправляю доверенный сертификат CA. Как я могу это исправить? ОШИБКА: *3 ошибка проверки SSL-сертификата восходящего потока: (2: невозможно получить сертификат эмитента) при подтверждении SSL к восходящему потоку, клиент: 0.0.0.0, сервер: lb.example.com,
AndreaCostanzo1 avatar
флаг tr
@MichaelHampton Я изменил доверенный сертификат ЦС на /etc/ssl/certs/ca-certificates.crt; и теперь ошибка: * 1 SSL-сертификат восходящего потока не соответствует "upstream-name" при подтверждении SSL к восходящему потоку

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.