Reverse proxy HTTPS avec pfSense

I. Présentation

Dans ce nouveau tutoriel dédié à pfSense, je vous propose de voir comment configurer un reverse proxy avec pfSense, en s'appuyant sur le paquet Squid. La mise en place d'un reverse proxy va permettre de publier de façon sécurisée un ensemble de sites web, eux-mêmes hébergés par plusieurs serveurs web, au travers de notre pare-feu.

Rappel : à l'inverse du proxy qui permet à un utilisateur du réseau local d'accéder à Internet, le reverse proxy permet l'inverse, c'est-à-dire accéder depuis Internet à un service hébergé sur le réseau local (DMZ, de préférence...) de l'entreprise.

Lorsqu'un utilisateur va tenter d'accéder à notre site web, celui si va contacter le serveur reverse proxy qui va ensuite renvoyer la requête vers le serveur web, après l'avoir analysée. Il a plusieurs avantages :

  • Sécurisation des serveurs web ("anonyme" derrière le reverse proxy qui échange en direct avec le client)
  • Gestion du cache (via squid) sur les requêtes effectuées pour optimiser le temps de réponse
  • Répartition de charge entre plusieurs serveurs web
  • Possibilité d'analyser les flux en amont (exemple : antivirus)

Dans cet exemple, nous allons simuler l'utilisation d'un reverse proxy comme si l'on voulait l'utiliser pour IT-Connect.

II. Installation du package "squid" sur pfSense

A partir de l'interface web de pfSense, nous allons installer le paquet "squid". Pour cela, accédez au menu "System" puis "Package Manager".

Cliquez sur "Available Packages" et recherchez "squid" dans la base de paquets disponibles.

Lorsqu'il s'affiche sur la page, cliquez sur "Install" sur la droite.

Patientez pendant l'installation du paquet squid...

Passons à la suite de la configuration.

III. Création de la règle "System Tunables"

Il est nécessaire de créer une règle dans la section System Tunables de pfSense (voir ci-dessous pour quelle raison). Sous le menu "System", cliquez sur "Advanced".

Cliquez sur l'onglet "System Tunables" et ajoutez un nouvel élément en cliquant sur "New".

Remplissez le champ "Tunable" avec la valeur "net.inet.ip.portrange.reservedhigh" et indiquez "0" comme valeur. En fait, si l'on n'ajoute pas cette option, nous ne pouvons pas utiliser les ports 80 et 443 avec Squid, car ils sont réservés. Par défaut, nous devrions utiliser un port supérieur à 1024.

Validez en cliquant sur "Save" et ensuite appliquez les changements en cliquant sur "Apply Changes".

IV. Configuration de Squid Reverse Proxy

Commençons la configuration du reverse proxy en lui-même, un rôle assuré par Squid et que l'on retrouve avec le nom "Squid Reverse Proxy" dans le menu "Services" de pfSense.

Dans la section "Web Servers", nous allons créer un nouvel élément en cliquant sur "Add".

Cette étape permet d'ajouter un serveur web, nous allons ensuite lier le serveur web à un nom de domaine. Dans le cas où vous avez plusieurs serveurs web pour le même site, il faut répéter cette opération.

Cochez la case "Enable this peer" et remplissez les différentes valeurs :

  • Peer alias : le nom d'hôte de votre serveur web, vous pouvez mettre le nom de domaine directement s'il n'y a qu'un seul serveur
  • Peer IP : l'adresse IP privée de votre serveur web
  • Peer port : port d'écoute de votre site web
  • Peer Protocol : pour publier un site sécurisé via HTTPS, sélectionnez ce protocole
  • Peer description : nom du site, par exemple

Cliquez sur "Save" pour ajouter l'entrée.

Passez ensuite sur l'onglet "Mappings" et appuyez sur 'Add" pour créer un nouvel objet.

Maintenant, nous allons devoir ajouter notre nom de domaine. Cochez la case "Enable this URI" et donnez un nom à ce groupe (Group Name). Le nom de domaine me semble être une bonne idée 🙂

Dans le champ "Peers", sélectionnez le(s) serveur(s) web qui hébergent ce site et vers lesquelles il faudra rediriger les flux. Dans cet exemple, il y a un seul serveur.

Indiquez le nom de domaine dans la zone "URI", sans précéder par http:// ou https://, sinon ça ne fonctionnera pas.

Maintenant que nos objets sont créés au niveau du reverse proxy, passons à la suite.

V. Autoriser le flux HTTPS dans le firewall

Au niveau filtrage, nous allons devoir créer une règle sur le firewall pour qu'il autorise le flux : à savoir la connexion des utilisateurs sur le port 443 de notre interface WAN pfSense. Sinon, le reverse proxy ne pourra pas être interrogé.

Sous le menu "Firewall", cliquez sur "Rules" et ensuite sur l'onglet "WAN".

Créez une nouvelle règle pour autoriser (Action = pass) les flux sur l'interface WAN provenant de n'importe quelle source (source = any) et à destination du port 443. Ce qui nous donne :

La règle étant créée, pensez à l'activer avant de poursuivre.

VI. Création de l'autorité de certification

Qui dit HTTPS, dit certificat SSL pour sécuriser les connexions. Dans le cadre de la publication d'un site Internet, il faut utiliser un certificat SSL qui émane d'une autorité de certification de confiance et reconnue nativement au sein des navigateurs clients. S'il s'agit d'un extranet et que vous souhaitez générer un certificat directement depuis pfSense, il est possible de créer une autorité de certification.

Attention : Si vous désirez importer directement votre certificat SSL, passez cette étape.

Pour créer une autorité de certification, accédez au menu "System" puis "Cert. Manager".

Dans la section "CAs", cliquez sur "Add".

Donnez-lui un nom, par exemple "IT-CONNECT CA", et choisissez la méthode "Create an internal Certificate Authority". Remplissez les autres informations en fonction de vos besoins... Choisissez une longueur de clé et un algorithme de chiffrement suffisant, par exemple une longueur de 2048 et sha256.

Une fois créée, la CA s'affiche bien dans la liste :

Maintenant, il reste à gérer la partie certificat...

VII. Création (ou importation) d'un certificat

Toujours dans le menu "Cert. Manager", basculez cette fois-ci sur l'onglet "Certificates". Cliquez sur "Add/Sign".

Deux choix : soit créer un certificat signé par la CA de notre pfSense en choisissant "Create an internal certificate" ou sinon importer notre propre certificat, ce qui est encore plus simple.

Dans le cas où l'on crée un certificat, il faut remplir les différents champs, voici un exemple :

 

VIII. Ajout du certificat dans Squid Reverse Proxy

Nous devons indiquer au reverse proxy quel certificat il doit utiliser pour le traitement des flux HTTPS. Sous "Services", retournez dans "Squid Reverse Proxy".

Au niveau des paramètres HTTPS, cochez l'option "Enable HTTPS Reverse Proxy" pour qu'il soit actif sur les flux HTTPS. Indiquez le port "443" juste en dessous. Ensuite, au niveau du champ "Reverse SSL Certificate", sélectionnez le certificat importé ou créé à l'étape précédente.

Note : si vous utilisez plusieurs sites web avec un sous-domaine différent à chaque fois, il est nécessaire d'importer un certificat SSL Wildcard pour que le certificat puisse s'appliquer aux différents noms de domaine.

Maintenant, au niveau des paramètres généraux, indiquez que le reverse proxy écoute sur l'interface WAN et si vous hébergez un seul site web, vous pouvez indiquer directement son nom de domaine pour le champ "External FQDN".

Pensez à valider pour appliquer les changements 🙂

IX. Activation de Squid

Il nous reste une dernière étape avant les tests : configurer et démarrer le service Squid en lui-même. Puisque le rôle reverse proxy s'appuie sur Squid, il est obligatoire de démarrer le service "Server Squid".

Sous le menu "Services", accédez à "Squid Proxy Server".

Avant d'activer Squid, il faut configurer et activer le cache dans Squid via l'onglet "Local Cache" sinon le service refusera de démarrer.

Une fois que c'est fait, dans l'onglet "General", cochez l'option "Enable Squid Proxy" et laissez sur "LAN" pour l'interface, car il est question ici du proxy (et non du reverse proxy).

Il ne reste plus qu'à valider, à s'assurer que le service Squid démarrer et à tester depuis un poste client que tout fonctionne 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5503.Voir tous les posts

10 thoughts on “Reverse proxy HTTPS avec pfSense

  • Pas mal le tuto.
    Il serait bien de l’alimenter avec let’s encrypt avec le plugin acme

    Répondre
  • Ouep, pas mal le tuto, mais pourquoi privilégier Squid à HAProxy ?
    Pas de jugements de valeur de ma part, mais une pure question innocente.

    Répondre
    • Hello,

      C’est plus parce que Squid peut jouer aussi le rôle de proxy classique, ce qui ouvre plus de possibilités. Après, si on utilise pfSense uniquement pour faire reverse proxy, la question se pose. Lequel des deux serait le plus performant à ton avis ?

      Répondre
      • C’est bien pour ça que je pose la question 🙂
        Je n’utilise que HA dans mes infras Online…
        La mise en place est très similaire, mais lequel marche mieux…
        HA est utilisé sur les hyperviseurs Proxmox par défaut et mes partenaires qui bossent en opensource ne jurent que par ça.
        J’ai fait un peu de recherches et il semble que la question soit difficile à trancher… Chacun à sa préférence, mais Squid semble intégrer plus de features.

        Répondre
  • Comme tous les tutos it-connect, excellent !!
    Nous souhaitons utiliser une conf similaire pour publier 3 serveurs web.
    Avec ce tuto, nous n’avons pas répondu à une question :
    Pour ces 3 sites web, nous aurons 3 noms de domaine différents
    => comment présenter 3 certificats différents ?

    Peut être sommes nous passé à côté de quelque chose…

    Répondre
    • Je pense que tu peux mettre la chaine de certification complète dans le certificat serveur lorsque que tu l’importes
      C.a.d. tu edites le certificat serveur en txt et après le END CERTIFICATE tu colles l'(es) intermédiaire(s) et enfin le certificat racine. Puis tu importes le tout.
      La chaine devrait être complète.

      Répondre
  • Salut,

    pour ma part, dans l’image ou tu mets les informations pour ton srv web le champs alias ne prend pas les .;:/ etc…
    Il prend seulement a-A, 0-9, – et _

    Petite rectif 😉
    Mais un grand merci pour tes tutos.

    Répondre
  • Salut,

    actuellement j’ai mis en place le reverse proxy avec squid et 2 serveur web (GLPI et Exchange), l’accès web est fonctionnel. Problème je souhaite mettre Outlook via un poste client cependant, il ne fonctionne pas car je dois mettre deux règles de NAT et filtrage (port 80 vers exchange et 443 vers exchange), forcément car priorité aux règles de NAT. As-tu une idée sur ce problème?

    Si mes explications ne sont pas correctes fait moi le savoir.

    Merci.

    Répondre

Répondre à Steeve Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.