Eu tenho a seguinte configuração:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
Para solicitações HTTP, isso funciona muito bem , as solicitações são distribuídas para meus servidores Apache muito bem. Para solicitações SSL, eu tinha o HAproxy distribuindo as solicitações usando o balanceamento de carga TCP, e funcionou no entanto, uma vez que o HAproxy não agia como proxy, não adicionava o X-Forwarded-For
cabeçalho HTTP e os servidores Apache / PHP não conheciam o cliente. endereço IP real.
Então, eu adicionei stunnel
na frente do HAproxy, ler esse stunnel poderia adicionar o X-Forwarded-For
cabeçalho HTTP. No entanto, o pacote que eu poderia instalar no pfSense não adiciona esse cabeçalho ... além disso, isso aparentemente mata minha capacidade de usar solicitações KeepAlive , que eu realmente gostaria de manter. Mas o maior problema que acabou com essa ideia foi que o stunnel converteu as solicitações HTTPS em solicitações HTTP simples, então o PHP não sabia que o SSL estava ativado e tentou redirecionar para o site SSL.
Como posso usar o HAproxy para carregar o equilíbrio em vários servidores SSL, permitindo que esses servidores saibam o endereço IP do cliente e saibam que o SSL está em uso? E, se possível, como posso fazer isso no meu servidor pfSense?
Ou devo largar tudo isso e usar o nginx?
fonte
X-Forwarded-For
, veja aqui .Respostas:
Você não precisa descartar tudo, basta usar o nginx na frente do haproxy para suporte a SSL, mantendo toda a sua configuração de balanceamento de carga. Você nem precisa usar o nginx para HTTP, se não quiser. O Nginx pode passar o X-Forwarded-For e um cabeçalho personalizado indicando que o SSL está em uso (e informações de certificação do cliente, se você desejar). Snippet de configuração do Nginx que envia as informações necessárias:
fonte
Apenas para constar, como esse encadeamento é frequentemente referido com relação ao HAProxy + SSL, o HAProxy suporta SSL nativo em ambos os lados desde o 1.5-dev12. Portanto, manter o X-Forwarded-For, HTTP keep-alive e um cabeçalho informando ao servidor que a conexão foi feita através de SSL é tão simples quanto o seguinte:
Tenho certeza de que, quando surgir algo diferente, mas pelo menos novos visitantes terão a solução mais fácil agora :-)
fonte
acl is-ssl dst_port 443
e reescrever uma linha:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx parece lidar com este cabeçalho razoavelmente bemPara quem encontrar essa pergunta, segui o conselho de Ochoto e usei o nginx. Aqui estão as etapas específicas que eu usei para fazer isso funcionar no meu roteador pfSense :
Usando a interface da web pfsense , instalei o pacote pfsense PfJailctl e o pacote "jail_template" em Sistema> Pacotes para criar uma prisão do FreeBSD na qual compilar e instalar o nginx no sistema pfsense.
Configurei uma cadeia para o meu servidor nginx em Serviços> Cadeias , fornecendo à nova cadeia o mesmo nome de host e endereço IP do alias de IP virtual no qual o HAproxy estava sendo executado. Liguei a prisão à interface da WAN. Eu usei o modelo de prisão padrão e habilitei unionfs em vez de nullfs.
Depois que a prisão foi iniciada, eu entrei na caixa do pfsense e corri
jls
para encontrar o número da prisão. Eu corrijexec 1 sh
para pegar uma concha dentro da prisão. A partir daí, configurei as portas BSD e instalei o nginx usando:Em seguida, configurei o nginx para escutar na porta 443 e passar todas as solicitações para o HAproxy na porta 80, incluindo o IP real e o status SSL nos cabeçalhos HTTP. Minha
usr/local/etc/nginx/nginx.conf
aparência é:Modifiquei meu aplicativo PHP para detectar o
X-Forwarded-Proto
cabeçalho HTTP:Portanto, a configuração final é:
fonte
Minha configuração para uma versão 1.5-dev-17 do haproxy:
Ele usa a
ssl_fc
ACL. Observe que aoption http-server-close
peça é muito importante.fonte
O HAProxy não pode atingir um back-end SSL sem usar o modo TCP bruto, perdendo
X-Forwarded-For
, mas você pode potencialmente criptografar novamente o tráfego com um stunnel de escuta para o trânsito de back-end. Feio, no entanto.Gosto mais da abordagem de Ochoto, com uma ressalva: o nginx é um balanceador de carga perfeitamente capaz; se você estiver usando, eu diria que use para tudo. Proxy seu HTTPS de entrada para carregar back-end HTTPS balanceados - e, dessa forma, não há necessidade de cabeçalhos personalizados para informações SSL (a menos que você precise do certificado do cliente).
fonte
Eu implementei uma solução no ano passado para integrar o HAProxy ao pfSense , de forma a aproveitar todos os recursos do HAProxy e manter um bom isolamento com o pfSense. Para que seja uma opção viável para ambientes de produção . O SSL é encerrado no HAProxy . Instalei o HAProxy dentro de uma prisão no pfSense usando o ezjail e o Ports Collection . Dessa forma, é muito fácil manter os dois componentes independentemente. E você pode instalar a versão que desejar. Comecei com 1.5-dev13. E desde então está funcionando perfeitamente para mim. Eu documentei a coisa toda aqui.
Instalando o HAProxy no pfSense
Aliás, Willy, muito obrigado por um produto tão excelente.
fonte