Предположения
Если я вас правильно понимаю, вы действительно хотите, чтобы nginx прослушивал один IP-адрес и комбинацию TCP-порта (например, listen 10.0.0.1:443
), а затем, в зависимости от характеристик входящего трафика TCP-потока, перенаправлял его на один из 3 разных IP-адресов. адреса.
Вы явно не упоминаете, как вы ожидаете, что он будет различать 3 разных домена, но я предполагаю, что вы предполагаете, что это всего лишь TLS, и вы должны захотеть использовать какой-то механизм TLS SNI (указание имени сервера) для доменная дифференциация.
Я считаю, что документация по потокам, представленная на http://nginx.org/docs/, является достаточно авторитетной и исчерпывающей для модулей. на кону (я перечисляю все это здесь, поскольку, по-видимому, еще нет центрального места для перекрестных ссылок, например, пока нет ссылок из модуля "ядра потока" на подмодули (и docs/stream/
просто перенаправляет обратно docs/
), что действительно довольно сбивает с толку, поскольку такие вещи, как http://nginx.org/r/upstream, задокументированы только для применения к http
, без любое упоминание о применимости к stream
, даже если в конце директивы примерно одинаковы):
Отвечать
Обратите внимание, что каждая директива nginx из каждого модуля имеет ограниченное количество применимых Context
.
Таким образом, к сожалению, здесь просто нет директивы для отслеживания SNI!
Напротив, фактически задокументировано в stream_core
, что, цитируя, "Different servers must listen on different address:port pairs.
", как вы могли заметить, это также противоречит тому, как listen
работает в более распространенном http_core
, и является довольно недвусмысленной ссылкой на тот факт, что в настоящее время для listen
в stream
не реализована поддержка SNI.
Обсуждение
В качестве предмета обсуждения и предложения по разрешению проблемы предположение, что трафик OpenVPN - это просто TLS с отслеживаемым SNI, также не обязательно верно (но я не слишком знаком с OpenSSL или SNI):
Учтите, что даже если сегодня SNI пассивно отслеживается, это явно противоречит обещанию TLS обеспечивать безопасность соединения и, как таковое, может измениться в будущей версии TLS.
Для обсуждения, если OpenVPN просто использует соединение TLS, и если он НЕ использует TLS для аутентификации пользователей с помощью пользовательских сертификатов (что значительно усложнит задачу для MitM потока, но все еще несут данные аутентификации все время), то теоретически если бы nginx действительно имел поддержку SNI около listen
в stream
, то вы, возможно, смогли бы активно MitM это с nginx (поскольку proxy_ssl
уже поддерживается в stream_proxy
).
Что наиболее важно, я считаю, что OpenVPN лучше всего запускать по собственному протоколу на основе UDP, и в этом случае вы можете использовать один и тот же IP-адрес и номер порта для одного экземпляра https на основе TCP и другого для OpenVPN на основе UDP. без конфликта.
В конце концов, вы можете спросить, для чего же тогда модуль stream был бы полезен? Я считаю, что его целевой аудиторией будет (0) балансировка нагрузки HTTP/2
с несколькими upstream
серверами на основе hash
IP-адреса клиента, например, и / или (1), более простой и протокольно- независимая замена для stunnel
.
person
cnst
schedule
23.01.2016