Exception d'un chemin http dans HA Proxy sous pfSense

J'utilise HAProxy sous pfSense pour publier divers sites. Outre l'économie d'adresses IP, j'augmente la sécurité, je peux faire de la répartition de charge et je profite des certificats Let's Encrypt via le plugin Acme.

Tout fonctionne très bien, sauf sur un site ou pour lequel une URL en http a été codée en dur dans un logiciel distribué aux quatre coins du monde, logiciel que les utilisateurs rechignent à mettre à jour. Ce process http fait du GET et du POST et après avoir testé une redirection http vers https de type 308 au lieu de 301 sans grand succès, je me suis dit que la seule solution consisterait à contourner le problème... en faisant une exception pour l'url du formulaire.

Explications (en partant du principe que le lecteur connait un peu le couple pfSense / HAProxy)

  1. Je crée un SharedFrontEnd HTTPS sur une IP publique de type http / https (OffLoading) en SSL OffLoading sur le port 443
  2. Je crée un premier FrontEnd qui s'appuie sur le SharedFrontEnd HTTPS avec le certificat qui va bien, cela qui va faire transiter le flux HTTPS vers mon BackEnd. On vérifie le bon fonctionnement depuis un navigateur avec https://www.domain.tld. OK.
  3. Je crée un SharedFrontEnd HTTP sur la même IP publique de type http / https (OffLoading) sans SSL OffLoading sur le port 80
  4. Je crée un second FrontEnd qui s'appuie sur le SharedFrontEnd HTTP qui lui va faire transiter en HTTP mon exception via deux ACL (hostname + path) vers mon Backend avec ces deux conditions (au sens HAProxy) et redirigera tout le reste vers le premier FrontEnd en HTTPS grâce à une règle qui exclut mon exception.

 

Voici le règle de redirection que l'on peut également placer en custom rule.

http-request redirect code 301 location https://%[hdr(host)]%[path] unless REG_PATH

J'avoue que j'en ai un peu bavé (avec l'aide de Victor), mais ça prouve une fois de plus qu'il y a peu de choses en la matière que l'on ne peut faire avec le couple pfSense / HAProxy. D'ailleurs, je ne vais pas l'expliquer ici car je n'ai fait que suivre un bon tuto, mais il est parfaitement possible de publier ainsi un serveur Exchange avec répartition de charge et éviter de coûteux répartiteurs de charge.

Sources :