Um proxy reverso pode usar SNI com SSL?

18

Preciso atender a vários aplicativos através de https usando um endereço IP externo.

Os certificados ssl não devem ser gerenciados no proxy reverso. Eles são instalados nos servidores de aplicativos.

Um proxy reverso pode ser configurado para usar o SNI e passar o SSL para finalização no terminal?

Isso é possível usando algo como Nginx ou Apache? Como é a configuração?

user319862
fonte

Respostas:

14

Isso é possível com o Haproxy. Você pode configurar um proxy TCP e extrair o SNI e fazer o roteamento com base no SNI. Aqui está um exemplo:

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

É essencial atrasar a solicitação até você receber o olá SSL, caso contrário, o haproxy tentará fazer uma conexão antes de receber o cabeçalho SNI.

Estou usando servidores com peso 0 porque, na minha configuração atual, só tenho um servidor em execução para cada SNI e não quero que eles recebam solicitações aleatórias. Você provavelmente pode encontrar melhores maneiras de brincar com isso.

Eu espero que isso ajude.

Florin Asăvoaie
fonte
Você pode me indicar alguma documentação deste ou de um snippet de configuração para que eu possa aceitar a resposta?
user319862
3
@ user319862 Encontrei este bom tutorial que parece ser o que está sendo discutido.
Michael Hampton
1
Verdade? Por que alguém rebaixou essa resposta?
Florin Asăvoaie
O problema é que o endereço IP do cliente não é encaminhado; portanto, o servidor só vê o tráfego vindo do proxy.
Kyle
@ Kyle Claro. É um proxy TCP. A única coisa que você pode fazer sobre isso é se você configurar e configurar o haproxy como um roteador para o servidor e usar o tproxy.
Florin Asăvoaie
5

Você pode usar o sniproxy: https://github.com/dlundquist/sniproxy

Um exemplo de configuração:

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
}
mick
fonte
Obrigado por postar sobre esse projeto. Eu não estava ciente disso
user319862
@ mick Oi mick, quando executa o SNI como um proxy transparente, ele quebra alguns sites com erros de SSL. Como corrigi-lo ?
Gripenfighter
1

Isso certamente é possível, mesmo agora em 2019 com o próximo TLS 1.3! Muitos servidores da web ou proxies reversos especializados fornecem essa funcionalidade imediatamente:

  • Nginx ≥ 1.11.5 (Debian ≥ buster ou backports extensíveis)
  • HAProxy ≥ 1.5 (Debian ≥ jessie)
  • Sniproxy (Debian ≥ buster)
  • etc.

Esta é uma configuração de exemplo para o Nginx, que é uma escolha muito popular para configurações que exigem um proxy reverso:

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;
  }
}

Os módulos Nginx relevantes são stream_coree stream_ssl_preread. Manuais:

vog
fonte