Isso é possível com o Haproxy. Você pode configurar um proxy TCP e extrair o SNI e fazer o roteamento baseado 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 o pedido até que você receba o SSL hello, 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. Provavelmente você pode encontrar maneiras melhores de jogar com isso.
Espero que isso ajude.