Proxy transparent : mise en place de Squid sur PfSense
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment mettre en place un serveur proxy transparent avec Squid sur un pare-feu PfSense, avec la prise en charge du HTTPS.
L'objectif de la mise en place de ce proxy transparent, c'est de permettre l'accélération de la navigation Internet grâce à la mise en cache, mais aussi le filtrage des sites Internet, sans aucune configuration sur les postes clients. Pour suivre ce tutoriel, vous avez besoin d'un accès à Internet, d'un serveur PfSense avec deux interfaces réseau (LAN et WAN), et au minimum un poste client connecté au LAN afin de tester le proxy transparent.
Dans cette configuration, le proxy transparent (192.168.100.1/24) fait office de passerelle pour les machines du réseau local.
Remarque importante : lors de la mise en place d'un serveur proxy, qu'il soit transparent ou non, pensez à le préciser dans la charte informatique de votre entreprise, notamment pour l'aspect filtrage. Pour la mise en place de cette solution, il est important de bien prendre en compte les aspects juridique. Pour cela, je vous invite à regarder ce document et plus précisément la partie "Aspects juridiques" : ANSSI - Filtrage HTTPS
Il s'agit d'un premier tutoriel sur Squid en mode proxy transparent. Un second tutoriel, qui est une suite de celui-ci, concernera la configuration de Squid Guard pour aller plus loin dans le filtrage.
Si la notion de Proxy (et de Reverse Proxy) est floue pour vous, je vous invite à lire mon article "Les serveurs Proxy et Reverse Proxy pour les débutants" ou à regarder la vidéo intégrée à ce même article.
II. Installer de Squid sur PfSense
Connectez-vous sur l'interface d'administration de PfSense afin d'installer le paquet "squid". Pour cela, sous "System", cliquez sur "Package Manager" et ensuite sur l'onglet "Available Packages".
System > Package Manager > Available Packages
Recherchez "squid" et cliquez sur le bouton "Install" à droite, au niveau de la ligne correspondante.
À la fin de l'installation, le message "pfSense-pkg-squid installation successfully completed" doit s'afficher.
Le paquet étant installé, on peut passer à la configuration.
III. Configurer Squid (Proxy) sur PfSense
La configuration de Squid s'effectue via le menu "Services" :
Services > Squid Proxy Server
La configuration est découpée en plusieurs onglets. Afin de pouvoir activer Squid, il faut configurer le cache local sinon le démarrage du processus Squid échouera. Cliquez sur l'onglet "Local Cache". Comme pour chaque section, nous retrouvons de nombreux paramètres... Pour le cache, j'attire votre attention sur ces options :
- Hard Disk Cache Size : par défaut sur "100" pour 100 Mo, cette valeur correspond à la taille maximale du cache sur l'espace disque. Vous pouvez augmenter cette valeur à 1024 Mo pour avoir 1 Go de cache.
- Hard Disk Cache Location : l'emplacement du cache, à savoir par défaut "/var/squid/cache".
Que vous décidiez de modifier ou non l'un des paramètres de la section "Local Cache", vous devez cliquer sur le bouton "Save" en bas de la page.
Ensuite, cliquez sur l'onglet "General". Là encore, il y a de nombreuses options. Voici ce qu'il faut configurer à minima :
- Enable Squid Proxy : cochez la case pour activer Squid sur le pare-feu, ce qui signifie qu'il va démarrer
- [facultatif] Listen IP Version : écouter en IPv4, en IPv6 ou les deux
- Proxy interface(s) : sur quelle interface souhaitez-vous activer le proxy ? Ici, ce sera seulement sur l'interface "LAN" donc je la sélectionne. Vous pouvez en sélectionner plusieurs si besoin, mais dans tous les cas le "WAN" ne sera pas sélectionné.
- Proxy Port : on laisse le port par défaut, à savoir 3128, mais il ne devra pas être déclaré sur les postes clients puisque l'on va configurer Squid en mode proxy transparent.
- Allow Users on interface : cochez cette case pour autoriser implicitement les utilisateurs connectés sur le réseau "LAN" à utiliser le proxy. Cela évite de déclarer le réseau dans un second temps.
Descendez dans la page... et cochez l'option "Transparent HTTP Proxy" pour activer le mode proxy transparent pour le protocole HTTP. Pour l'activer pour le protocole HTTPS, il faudra cocher une autre option (nous en parlerons par la suite).
Dans le même esprit qu'au début de la configuration, sélectionnez "LAN" pour l'option "Transparent Proxy Interface(s)".
En configurant l'option "Bypass Proxy for these Source IPs", vous avez la possibilité de déclarer des adresses IP sources (ou un sous-réseau source) qui peuvent passer outre le proxy et accéder en direct à Internet. Dans le même esprit, l'option "Bypass Proxy for these Destination IPs" permet d'outrepasser le proxy pour certaines destinations.
Pour le moment, laissez l'option "Enable SSL filtering" décochée.
Continuez de descendre dans la page... Activez les journaux comme ceci :
- Enable Access Logging : cochez l'option pour activer les journaux, ce qui va permettre de savoir qui fait quoi sur Internet.
- Rotate Logs : pendant combien de jours souhaitez-vous conserver les logs ? Pour les établissements scolaires, c'est pendant 365 jours qu'il faut conserver les logs (sauf erreur de ma part).
Ensuite, la section "Headers Handling, Language and Other Customizations" permet de configurer les messages Squid. Le champ "Visible Hostname" correspond au nom d'hôte qui peut s'afficher côté client, notamment sur les pages de blocage Squid, tout comme l'e-mail spécifié pour l'option "Administrator's Email". Pour les messages d'erreurs justement, précisez la langue française au niveau de l'option "Error Language".
Pour des raisons de sécurité, on va masquer les informations sur Squid, notamment la version, en cochant l'option "Suppress Squid Version". Ce qui donne :
Voilà, on est arrivé au bout de la page de configuration ! Cliquez sur "Save" pour appliquer cette nouvelle configuration.
IV. Tester le proxy transparent Squid
Pour tester le bon fonctionnement de notre proxy transparent HTTP, on peut tout simplement s'amuser à naviguer sur Internet. Pour que ce soit plus parlant, on va bloquer un nom de domaine.
Cliquez sur l'onglet "ACLs", toujours dans la configuration de Squid. C'est ici que vous pouvez déclarer les sous-réseaux autorisés à utiliser le proxy (Allowed Subnets) mais pour nous c'est implicite (souvenez-nous de l'option cochée précédemment). Pour autoriser une ou plusieurs adresses IP (ou sous-réseau) à passer outre les restrictions, renseignez l'option "Unrestricted IPs".
Ce qui m'intéresse pour ce test, c'est l'option "Blacklist" puisqu'elle permet d'indiquer un ou plusieurs domaines à bloquer. Pour ce test, il nous faut un site en HTTP (ce qui est de plus en plus "rare", enfin surtout au niveau des sites connus). J'ai pris le site "horizons21.fr", au hasard, et je l'ai ajouté comme ceci :
Ensuite, on sauvegarde la configuration... Puis, à partir d'un poste de travail situé sur le réseau local, on tente d'accéder au site horizons21.fr. Et là, on peut voir que ça ne fonctionne pas ! On peut voir qu'une page "Accès interdit" renvoyée par Squid s'affiche !
On peut aussi suivre les logs en temps réel côté Squid, via l'onglet "Real Time". On voit très bien nos requêtes à destination du site "horizons21.fr" depuis l'hôte 192.168.100.11 : c'est la preuve irréfutable que notre PC passe bien par le proxy transparent !
V. Configurer Squid en proxy transparent HTTPS (SSL Inspection)
C'est bien beau notre configuration, mais notre proxy transparent fonctionne seulement sur le protocole HTTP. Depuis quelques années maintenant, la tendance est au HTTPS (et on va pas s'en plaindre) alors c'est indispensable que l'on permette à notre proxy transparent de travailler le HTTPS.
Cela est un peu plus complexe qu'une simple case à cocher dans les options du proxy, car il faut faire ce que l'on appelle du SSL Inspection. Puisqu'un flux HTTPS est chiffré, le proxy ne peut pas seulement regarder les trames passer. En effet, pour chaque connexion, il doit déchiffrer le flux, l'inspecter puis le chiffrer à nouveau afin de l'acheminer : une tâche d'envergure et gourmande en ressources.
A. Créer l'autorité de certification PfSense
Pour commencer, il faut créer une autorité de certification sur notre pare-feu PfSense. Rendez-vous dans le menu "System" puis "Cert. Manager" et dans l'onglet "CAs". Cliquez sur "Add" et renseignez les différents champs : c'est tout simple.
Note : si vous avez une autorité de certification Active Directory, il doit être possible d'ajouter un certificat existant directement.
Vous obtenez une autorité de certification, comme la mienne nommée "CA-ITCONNECT" et qui existait déjà sur mon pare-feu, car je l'utilise pour le VPN client-to-site.
B. SSL Inspection avec Squid
Retournez dans la configuration de Squid, via le menu "Services". Cochez l'option "Resolve DNS IPv4 First" pour activer la résolution DNS en amont du filtrage, ce qui est recommandé lorsque l'on filtre le HTTPS (ce que l'on s'apprête à faire).
Ensuite, activez l'option "Enable SSL filtering". Pour le mode "SSL/MITM Mode", choisissez le mode "Splice All" : c'est le mode le moins contraignant à mettre en œuvre, car il ne nécessite pas de déployer le certificat de l'autorité de certification sur l'ensemble des postes clients. C'est aussi le mode recommandé lorsque l'on prévoit de déployer Squid Guard, ce qui sera le cas dans la seconde partie de ce tutoriel.
Remarque : si vous prenez l'autre mode, il faut exporter le certificat de la CA créée précédemment et le déployer sur toutes les machines qui vont passer par le proxy transparent.
Sélectionnez l'autorité de certification créée précédemment au niveau de l'option "CA".
Sauvegardez via le bouton en bas de page.
C. Tester l'accès à Internet
Maintenant, retournez sur votre poste de travail qui passe par le proxy puis tentez de naviguer sur un site en HTTPS. Vous allez très probablement obtenir le message d'erreur "SSL_ERROR_RX_RECORD_TOO_LONG". Pour résoudre cette erreur, il faut que l'on utilise notre proxy comme résolveur DNS (directement ou indirectement).
D. Ajuster les paramètres DNS
Pour ajuster les paramètres DNS et faire fonctionner le proxy transparent, il y a deux options :
- Définir l'adresse IP du proxy comme DNS sur le poste de travail (manuellement ou via DHCP)
- Attention, si vous utilisez un domaine Active Directory, il faut créer une règle dans le résolveur DNS de PfSense pour renvoyer les requêtes liées à votre domaine vers le contrôleur de domaine.
- Définir l'adresse IP du contrôleur de domaine comme DNS sur le poste de travail, comme c'est le cas actuellement
- Sur le contrôleur de domaine, dans les options du serveur DNS, on va définir le serveur proxy (notre PfSense) comme redirecteur DNS. Cela signifie qu'il sera sollicité pour les requêtes correspondantes à des hôtes sur Internet (car non connu de notre DNS interne). Ce qui donne :
Une fois que la configuration est effectuée, on retourne sur l'interface de configuration Squid.
E. ACL : bloquer un site HTTPS dans Squid
Comme toute à l'heure, on va retourner dans l'onglet "ACLs" au niveau de la section "Blacklist". Cette fois-ci, on va bloquer un domaine où le site tourne en HTTPS : "facebook.com", à tout hasard. Ce qui donne :
On sauvegarde et on tente d'accéder à Facebook... Voici le message que l'on obtient :
Même si ce message n'est pas très esthétique et fait plutôt penser à une erreur, il empêche bien l'accès au site facebook.com. L'erreur de certificat qui s'affiche est liée à l'utilisation de notre certificat de CA locale pour filtrer facebook.com, alors forcément la correspondance entre les deux ne peut pas être effectuée.
Voilà, le proxy transparent HTTP/HTTPS avec Squid sur un pare-feu PfSense est en place ! Rendez-vous demain pour la suite : l'ajout du paquet Squid Guard pour aller plus loin dans le filtrage, notamment l'utilisation d'une blacklist par catégorie.
En attendant, vous pouvez explorer encore un peu plus la configuration de Squid. Il y a notamment l'onglet "Authentication" qui permet de soumettre l'utilisation du proxy à authentification via la base locale, un serveur Radius voire un annuaire Active Directory. Quant à l'onglet "Traffic Mgmt", il permet de brider le téléchargement de fichiers au travers du proxy.
Tu viens de me donner envie de retenter cette mise en place d’un proxy car tu vas plus loin que l’erreur de dns. D’ailleurs je me demande si on peut le faire avec bins9 ou unbound si on a pas d’active directory.
Bon, ca marche mais il ne faut pas hésiter à réinstaller pfSense plusieurs fois avant que le réseau LAN ait accès à internet. Pareil pour Squid, le http suit les ACL tout de suite mais pour le https il faut relancer pfsense complètement sinon les postes clients ( j’ai mis un windows 10 et un linux ) soient concernés par les ACL.
Très bon tuto, en revanche il est honteux et décevant de ne pas y trouver la moindre mention sur l’aspect juridique de faire du déchiffrement de trafic chiffré. Vous mettez en place cette solution chez vous ? Faites, si ça vous amuse. Vous la mettez en place dans votre entreprise ? Alors consultez d’abord cette note de l’ANSSI : https://www.ssi.gouv.fr/uploads/IMG/pdf/NP_TLS_NoteTech.pdf en particulier la section « Aspects juridiques ». Ce n’est pas quelque chose qui se met en place tel le simple paramétrage technique d’un serveur, il y a beaucoup de choses à considérer, notamment d’un point de vue confidentialité et données personnelles/bancaires !
Bonjour Dan,
Décevant peut-être, honteux je ne crois pas. 🙂
Merci pour le document, je vais ajouter le lien au début de l’article. J’ai mentionné la charte informatique pour attirer l’attention sur l’aspect juridique mais ce n’est surement pas suffisant.
A+
Florian
Bonjour Florian,
Merci pour tout ce boulot tutos et vidéos propres et efficaces;
Concernant le filtrage HTTPS ne faut il pas ajouter la CA pfSense sur le PC client (dans le gestionnaire de certificats), en tant que autorité racine de confiance ? pour éviter des messages du genre « l’origine du certificat ne peut pas être vérifiée »
Bien expliquer merci florian merci pour
la partage de la connaissance
Bonjour,
Merci pour votre article très intéressant. J’avais juste une question concernant les règles de pare-feu.
Comment être certains que tous les paquets passent obligatoirement pour le proxy vu que vous n’avez mis aucune règle bloquant les accès aux port 80 & 443.
merci pour votre réponse
Nebus
Hello,
Super tuto ! Ca m’aide bien sur la découverte de Squid.
Par contre, je rencontre un soucis pour les update Microsoft, apparament ca serait à cause de la signature du au « Man in the middle ». Et je ne parvient pas à bypasser les domain de Microsoft même en whitelist…
Une idée ?
Bonjour,
merci pour ce partage
par contre , je sais pas si vous pouvez m’aider.
ma configuration :
toutes les sortie de mon pfsense passe par vpn, afin de rester anonyme sur le net.
mes tests:
– Squid actif avec squidguard
> des que je lance un DNS Leak mon adresse publique est trouvée .
– Si je déactive Squid
> je n’ai plus de fuite DNS.
Donc le soucis est squid mais je n’arrive pas a résoudre ce problème.
merci par avance du temps
comment faire l’authentification sur le squid proxy on utilisons LDAP ou RADIUS ou portail captif
comment utiliser LDAP sur squid Gard.