Может ли обратный прокси-сервер использовать SNI с прохождением SSL?


18

Мне нужно обслуживать несколько приложений через https, используя один внешний IP-адрес.

Сертификатами ssl нельзя управлять на обратном прокси-сервере. Они установлены на серверах приложений.

Можно ли настроить обратный прокси-сервер на использование SNI и пропуск ssl для завершения в конечной точке?

Это возможно, используя что-то вроде Nginx или Apache? Как выглядит конфигурация?

Ответы:


14

Это возможно с Haproxy. Вы можете настроить прокси-сервер TCP и извлечь SNI и выполнить маршрутизацию на основе SNI. Вот пример:

backend be.app1
    mode tcp
    no option checkcache
    no option httpclose
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    tcp-request content reject
    use-server server1 if { req.ssl_sni -m beg app1. }
    server server1 server1:8443 check id 1 weight 0

Необходимо отложить запрос до получения приветствия SSL, иначе haproxy попытается установить соединение до получения заголовка SNI.

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

Надеюсь, это поможет.


Можете ли вы указать мне какую-либо документацию по этому или фрагменту конфигурации, чтобы я мог принять ответ?
user319862

3
@ user319862 Я нашел этот хороший учебник, который, кажется, о чем идет речь.
Майкл Хэмптон

1
В самом деле? Почему кто-то отрицает этот ответ?
Florin Asăvoaie

Проблема заключается в том, что IP-адрес клиента не пересылается, поэтому сервер только когда-либо видит трафик, поступающий от прокси-сервера.
Кайл,

@ Кайл Конечно. Это TCP прокси. Единственное, что вы можете сделать в этом случае, это настроить и настроить haproxy в качестве маршрутизатора для сервера и использовать tproxy.
Флорин Асэвоаие

5

Вы можете использовать sniproxy: https://github.com/dlundquist/sniproxy

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

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}

Спасибо за публикацию об этом проекте. Я не знал об этом
user319862

@mick Привет, mick, когда SNI работает как прозрачный прокси, он ломает некоторые сайты с ошибками SSL. Как это исправить?
Gripenfighter

1

Это, безусловно, возможно, даже сейчас, в 2019 году, с выходом TLS 1.3! Многие веб-серверы или специализированные обратные прокси-серверы предоставляют эту функциональность из коробки:

  • Nginx ≥ 1.11.5 (Debian ≥ Buster или Stret-Backports)
  • HAProxy ≥ 1.5 (Debian ≥ Джесси)
  • Sniproxy (Debian ≥ Buster)
  • и т.п.

Это пример конфигурации для Nginx, который является очень популярным выбором для установок, которые требуют обратного прокси:

stream {
  map $ssl_preread_server_name $selected_upstream {
    example.org upstream_1;
    example.net upstream_2;
    example.com upstream_3;
    default upstream_4;
  }
  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }
  upstream upstream_3 { server 10.0.0.3:443; }
  upstream upstream_4 { server 10.0.0.4:443; }
  server {
    listen 10.0.0.5:443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

Соответствующие модули Nginx - это stream_coreи stream_ssl_preread. Руководства:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.