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.
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.
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:
Você pode usar o sniproxy: https://github.com/dlundquist/sniproxy
Um exemplo de configuração:
fonte
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:
Esta é uma configuração de exemplo para o Nginx, que é uma escolha muito popular para configurações que exigem um proxy reverso:
Os módulos Nginx relevantes são
stream_core
estream_ssl_preread
. Manuais:fonte