J'ai la configuration suivante:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
Pour les requêtes HTTP, cela fonctionne très bien , les requêtes sont très bien distribuées sur mes serveurs Apache. Pour les demandes SSL, j'avais HAproxy distribuant les demandes à l'aide de l'équilibrage de charge TCP, et cela a fonctionné cependant puisque HAproxy n'a pas agi en tant que proxy, il n'a pas ajouté l' X-Forwarded-For
en-tête HTTP et les serveurs Apache / PHP ne connaissaient pas le client. véritable adresse IP.
Donc, j'ai ajouté stunnel
devant HAproxy, en lisant que Stunnel pouvait ajouter l' X-Forwarded-For
en-tête HTTP. Cependant, le paquet que je pourrais installer dans pfSense n'ajoute pas cet en-tête ... aussi, cela tue apparemment ma capacité à utiliser les requêtes KeepAlive , que j'aimerais vraiment garder. Mais le plus gros problème qui a tué cette idée était que Stunnel convertissait les requêtes HTTPS en requêtes HTTP simples, donc PHP ne savait pas que SSL était activé et tentait de rediriger vers le site SSL.
Comment puis-je utiliser HAproxy pour équilibrer la charge sur un certain nombre de serveurs SSL, permettant à ces serveurs à la fois de connaître l'adresse IP du client et de savoir que SSL est utilisé? Et si possible, comment puis-je le faire sur mon serveur pfSense?
Ou devrais-je laisser tomber tout cela et utiliser simplement nginx?
X-Forwarded-For
, voir ici .Réponses:
Vous n'avez pas besoin de tout laisser tomber, vous pouvez simplement utiliser nginx devant haproxy pour le support SSL, en gardant toute votre configuration d'équilibrage de charge. Vous n'avez même pas besoin d'utiliser nginx pour HTTP si vous ne le souhaitez pas. Nginx peut transmettre à la fois X-Forwarded-For et un en-tête personnalisé indiquant que SSL est utilisé (et les informations de certificat client si vous le souhaitez). Extrait de configuration Nginx qui envoie les informations requises:
la source
Pour mémoire, comme ce fil est souvent mentionné concernant HAProxy + SSL, HAProxy prend en charge le SSL natif des deux côtés depuis 1.5-dev12. Donc, avoir X-Forwarded-For, HTTP keep-alive ainsi qu'un en-tête indiquant au serveur que la connexion a été établie via SSL est aussi simple que ce qui suit:
Je suis sûr qu'au moment où vous avez trouvé quelque chose de différent, mais au moins les nouveaux visiteurs auront la solution facile maintenant :-)
la source
acl is-ssl dst_port 443
et réécrire une ligne:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx semble gérer cet en-tête assez bienPour tous ceux qui trouvent cette question, j'ai suivi les conseils d'Ochoto et utilisé nginx. Voici les étapes spécifiques que j'ai utilisées pour que cela fonctionne sur mon routeur pfSense :
À l'aide de l'interface Web pfsense, j'ai installé le package pfsense PfJailctl et le package "jail_template" sous Système> Packages afin de pouvoir créer une prison FreeBSD sous laquelle compiler et installer nginx sur le système pfsense.
J'ai configuré une prison pour mon serveur nginx sous Services> Jails , donnant à la nouvelle prison le même nom d'hôte et la même adresse IP que l'alias IP virtuel sur lequel j'avais HAproxy en cours d'exécution. J'ai lié la prison à l'interface WAN. J'ai utilisé le modèle de prison par défaut et activé unionfs plutôt que nullfs.
Une fois la prison commencée, j'ai SSHed dans la boîte pfsense et j'ai couru
jls
pour trouver le numéro de la prison. J'ai ensuite courujexec 1 sh
chercher un obus à l'intérieur de la prison. De là, j'ai configuré les ports BSD et installé nginx en utilisant:J'ai ensuite configuré nginx pour écouter sur le port 443 et transmettre toutes les demandes à HAproxy sur le port 80, y compris la véritable IP et l'état SSL dans les en-têtes HTTP. Mes
usr/local/etc/nginx/nginx.conf
looks:J'ai ensuite modifié mon application PHP pour détecter l'
X-Forwarded-Proto
en-tête HTTP:La configuration finale est donc:
la source
Ma configuration pour une version 1.5-dev-17 de haproxy:
Il utilise l'
ssl_fc
ACL. Veuillez noter que laoption http-server-close
partie est très importante.la source
HAProxy ne peut pas frapper un backend SSL sans utiliser le mode TCP brut, perdant
X-Forwarded-For
, mais vous pourriez potentiellement rechiffrer le trafic avec un stunnel d'écoute pour le transit du backend. Moche, cependant.J'aime mieux l'approche d'Ochoto, avec une mise en garde: nginx est un équilibreur de charge parfaitement capable; si vous l'utilisez, je dirais l'utiliser pour tout. Proxy votre HTTPS entrant pour charger des backends HTTPS équilibrés - et de cette façon, il n'y a pas besoin d'en-têtes personnalisés pour les informations SSL (sauf si vous avez besoin du certificat client).
la source
J'ai implémenté une solution l'année dernière pour intégrer HAProxy à pfSense de manière à exploiter toutes les fonctionnalités de HAProxy et à maintenir une bonne isolation avec pfSense. C'est donc une option viable pour les environnements de production . SSL est résilié sur HAProxy . J'ai installé HAProxy dans une prison dans pfSense en utilisant ezjail et Ports Collection . De cette façon, il est très facile de maintenir les deux composants indépendamment. Et vous pouvez installer la version que vous souhaitez. J'ai commencé avec 1.5-dev13. Et depuis, cela fonctionne parfaitement pour moi. J'ai documenté le tout ici.
Installer HAProxy sur pfSense
BTW Willy, merci beaucoup pour cet excellent produit.
la source