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