Eu uso o módulo stream para passar o tráfego tls onde não posso reverter o proxy, por exemplo, porque não tenho o certificado (instalação local do 3CX) ou ele quebra coisas (ssl vpn com certificado do cliente). Em seguida, encaminhei o "resto" para um IP diferente no mesmo host (127.0.0.1) para proxy reverso. O problema era que o remote_addr nem sempre era 127.0.0.1 e parece não haver como definir o endereço remoto "real". Para contornar isso, habilitei o proxy_protocol e usei $proxy_protocol_addr.
No entanto, isso interrompe todos os sites de passagem e não encontrei uma maneira de habilitar condicionalmente o proxy_protocol apenas para o "padrão"
Faço tudo isso para poder combinar no sni e usar um único IP para todos os sites.
Não estou preso a fazer exatamente dessa maneira, se alguém tiver uma ideia de como conseguir isso de uma maneira diferente/melhor, sou todo ouvidos.
stream {
map $ssl_preread_server_name $targetBackend {
3cx.example.com 192.168.1.2:443;
vpn.example.com 192.168.1.3:443;
default 127.0.0.1:443;
}
server {
listen 192.168.1.100:443;
proxy_connect_timeout 1;
proxy_timeout 3s;
resolver 192.168.1.1;
proxy_protocol on;
proxy_pass $targetBackend;
ssl_preread on;
}
então... como tornar o proxy_protocol condicional (afaik se simplesmente não funcionar no contexto do stream) ou resolver de outra forma?
Parece que você precisa instalar um frontend para
3cx
evpn
que decodifique o protocolo PROXY e o converta em solicitações HTTP para o servidor web real.Outra opção é ter instâncias nginx separadas para serviços da Web e protocolos com proxy.