Задать вопрос
@dinegnet

Как прокинуть в nginx вторичный реверсивный проки с SSL без промежуточного шифрования, используя один и тот же ключ/сертификат на обоих серверах?

Предыстория:

Имеется веб-сервер example.com, живущий на адресе 1.1.1.1. Это основной сервер.
Имеется реверсивный проки на базе nginx, который обслуживает тот же домен example.com на адресе 2.2.2.2, находящийся на другом конце земного шара.
В DNS прописана запись А на домен example.com с обоими адресами - и с 1.1.1.1 и с 2.2.2.2
Все прекрасно работает по HTTP, в логах видно, что отдельные клиенты подключаются к одному серверу, отдельные клиенты - к другому серверу.

Отсутпление для любопытных:

Сделано это для повышения доступности серверов.
Как только сделали это - у клиентов исчезла ошибка "Сайт не доступен".
Разумеется, при этом скорость загрузки на клиентах, подключающихся через реверсивный прокси существенно меньше, чем у тех, кто подключен в основному серверу. Но это нами не управляется - это решает браузер.
Полагаю, что браузер просто пытается установить соединение и с тем и с другим сервером. Кто первый отвечает - с тем браузер в дальнейшем и работает.

Продолжение предыстории:


На сервере 1.1.1.1 включен и прекрасно работает HTTPS
При этом сервер 1.1.1.1 обслуживает и по HTTP, но от этого хотелось бы отказаться.

На сервере 2.2.2.2 включен и прекрасно работает HTTPS
При этом сервер 2.2.2.2 обслуживает и по HTTP, но от этого хотелось бы отказаться.

Вопрос:

Как сделать так, чтобы шифровалось ровно 1 раз.
Сейчас мы вынуждены поддерживать шифрованное соединение на 2.2.2.2, но из экономии ресурсов обратный прокси идет на 1.1.1.1 без шифрования.

Не проблема включить шифрование для связи между 1.1.1.1 и 2.2.2.2, но при этом получим:

а) Шифрует nginx на 2.2.2.2
б) Дешифрует ngixn на 2.2.2.2
в) Шифрует nginx для соединения с 1.1.1.1
г) Шифрует основной сервер, тот, что на 1.1.1.1
д) Дешифрует основной сервер, тот, что на 1.1.1.1

Сейчас мы хотя бы экономим немного за счет отсутствия шагов в), г) и д), когда подключение клиента идет через 1.1.1.1

Все инструкции в этих ваших интернетах говорят про то, как шифровать на nginx, и отдавать уже расшифрованное на сервер, стоящий за прокси. Или как шифровать между прокси и основным сервером.

Хотелось бы получить одноразовое сквозное шифрование, выполняемое один раз на 2.2.2.2 и расшируемое только на 1.1.1.1.

При том, чтобы клиент все так же мог случайным образом подключаться или к 1.1.1.1 или к 2.2.2.2, однако уже только по HTTPS с шифрованием. Обычный HTTP после этого отключим.

Поскольку домен оба сервера обслуживают один и тот же, то логично, что ключ/сертификат у обоих серверов будет один и тот же.

Замечание:

Прокси кэширует часть запросов.
То есть он сам расшифровывает запрос и отдает ответ клиенту на часть файлов.
Это тоже нужно учесть.
  • Вопрос задан
  • 362 просмотра
Подписаться 1 Оценить 3 комментария
Решения вопроса 1
Такое можно, но
1. Кеширование на втором сервере не будет. (он ведь не расшифровывает заспрос-ответ - и не знает uri)
2. Вы потеряете IP клиентов работающих через второй сервер.

А делается это через ngx_stream_proxy_module
Он доступен с версии 1.9.0

По моему намного лучше разрешить 80 порт только для межсерверных запросов на уровне фаервола и все оставить как есть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Wexter
gre/ipip/ipsec поднимаете между серверами и проксируете на адрес внутри туннеля без шифрования, шифрование можно поднять один раз на уровне туннеля
Ответ написан
Комментировать
theemfs
@theemfs
Кратко о себе
несмотря на то, что в вопросе речь про свой nginx, если не привязываться именно к своему серверу и регламенты позволяют, то взять какой-нибудь сервис вроде cloudflare.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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