Aller au contenu
  1. Articles/

Protégez votre réseau domestique avec pfSense - Un guide simple

Ixonae
Auteur
Ixonae
Sommaire

Avertissement : Cet article a été traduit de l’anglais par un LLM. La précision n’est pas garantie. Vous pouvez lire l’article original en anglais.

Il y a quelques semaines, j’ai publié un article expliquant comment transformer un Raspberry Pi inutilisé en routeur WiFi faisant passer tout votre trafic par un VPN avec OpenWRT. Dans l’article d’aujourd’hui, nous passerons au niveau supérieur et verrons comment gérer votre réseau domestique si vous souhaitez plus de contrôle, de fonctionnalités et de performances.

Pour cela, nous utiliserons pfSense, une distribution firewall/routeur basée sur FreeBSD maintenue par NetGate, et effectuerons les opérations suivantes :

  • Créer une configuration de base fonctionnelle de pfSense
  • Rediriger votre trafic (ou du moins une partie) à travers un VPN
  • Configurer un résolveur DNS local
  • Installer pfBlockerNG, l’équivalent de PiHole pour améliorer votre vie privée (les publicités et les trackers seront bloqués au niveau DNS)
  • Mettre en place une surveillance de base avec Snort

Notez que j’utilise un Protectli FW4B (4 Go de RAM, 32 Go de disque dur - jusqu’ici, cela semble être plus que suffisant) et un routeur WiFi basique fonctionnant en mode point d’accès. La configuration pourrait être améliorée en utilisant un point d’accès supportant les VLANs (particulièrement si vous souhaitez isoler des appareils tels que les appareils Amazon). J’utilise la dernière version de pfSense (2.6.0) au moment de la rédaction de cet article.

Ah, et juste un mot sur les VPN, car on entend beaucoup de choses à leur sujet ces temps-ci… Les VPN ne sont pas une sorte de magie qui vous rendra sécurisé ou quoi que ce soit. Ce qu’ils font principalement est :

  1. Plutôt que votre FAI, une autre entreprise voit votre trafic Internet. C’est une bonne chose si vous faites davantage confiance à votre fournisseur VPN qu’à votre FAI (de plus, il peut être plus difficile pour votre fournisseur VPN de lier votre trafic à une identité réelle)
  2. Plusieurs personnes utiliseront la même adresse IP que vous, il sera donc plus difficile pour les sites web et autres de vous suivre. Cela masque également votre véritable localisation géographique (qui peut être connue dans une certaine mesure avec votre vraie adresse IP)

Configuration de base
#

La configuration initiale est assez simple. Vous devez d’abord télécharger l’image depuis le site web de pfSense (j’ai utilisé AMD64/DVD Image ISO Installer), flasher l’ISO sur une clé USB, et démarrer votre machine avec après avoir branché le port WAN à votre Internet, et le port LAN à votre ordinateur (vous aurez également besoin de brancher la machine à un écran/clavier, ou d’utiliser le port COM).

Le processus d’installation vous posera diverses questions assez standard. Si vous utilisez une machine Protectli, vous voudrez choisir UEFI dans la configuration de démarrage. Une fois l’installation terminée, vous pouvez vous connecter à l’interface d’administration via votre navigateur à l’adresse https://192.168.1.1, et vous connecter avec le nom d’utilisateur admin et le mot de passe pfsense.

De là, vous passerez par un écran de configuration vous demandant à nouveau diverses choses standard. J’ai décoché l’option Override DNS et je n’ai pas rempli les serveurs DNS, car nous utiliserons un résolveur local.

Ensuite, vous pouvez débrancher votre ordinateur du port LAN de l’appareil, brancher votre point d’accès à la place, et vous connecter via WiFi. Notez que si vous souhaitez vous connecter en SSH à votre pare-feu, vous devrez l’autoriser depuis le menu System/Advanced/Secure Shell Menu.

Avant de continuer, faisons une petite amélioration : vous avez peut-être remarqué que le tableau de bord n’a que deux colonnes disponibles pour organiser les widgets ; une grande partie de votre écran est donc probablement inutilisée. Allons dans System/General Setup, et changeons la valeur de Dashboard Columns à 3 pour ne pas gaspiller cet espace. Ensuite, vous pouvez configurer le tableau de bord comme vous le souhaitez avec de nouveaux widgets (en utilisant le + en haut à droite de la page du tableau de bord).

Configuration spécifique à Protectli
#

Si vous utilisez un appareil Protectli, le fabricant conseille d’effectuer quelques modifications dans la configuration pour mieux tirer parti du matériel (comme détaillé sur cette page).

Dans System/Advanced/Miscellaneous :

  • Dans Power Savings, cochez Enable PowerD, et mettez les trois champs suivants en Hiadaptive -> cela vous permettra d’utiliser le widget Thermal Sensors dans le tableau de bord, et de voir la température par cœur de CPU
  • Définissez le Cryptographic Hardware comme AES-NI and BSD Crypto Device (aesni, cryptodev)
  • Définissez les Thermal Sensors comme Intel Core* CPI on-die thermal sensor

Notez que vous verrez probablement votre CPU quelque part entre 50 et 60 degrés Celsius lors de l’utilisation de la machine. C’est normal et tout à fait acceptable.

Résolveur DNS
#

Nous voulons utiliser notre machine comme résolveur DNS plutôt que d’utiliser un DNS sur Internet. Allez dans le menu Services/DNS Resolver, et assurez-vous d’avoir les éléments suivants dans les General Settings :

  • Enable DNS Resolver coché
  • Network Interfaces -> All
  • Outgoing Network Interfaces -> All (notez que nous changerons cela lorsque le VPN sera configuré, afin que toutes vos requêtes VPN passent par celui-ci)
  • Struct Outgoing Network Interface Binding décoché
  • Enable DNSSEC Support coché
  • Enable Python Module coché
  • Enable Forwarding Mode décoché

Nous nous assurerons également que Query Name Minimization est coché dans les Advanced Settings.

À ce stade, nous avons un réseau fonctionnel utilisant notre propre VPN, et tous les clients connectés à votre point d’accès l’utiliseront par défaut.

Une note rapide sur le DNS
#

Avec les paramètres précédents, nous avons notre propre résolveur DNS. Cela signifie que si vous essayez de vous connecter à maps.google.com, le résolveur va :

  • Contacter le DNS racine pour demander où trouver le DNS en charge du TLD dot com
  • Contacter le DNS en charge du TLD dot com, et lui demander où trouver google
  • Contacter google, et demander où trouver maps

Notez que comme Query Name Minimization est activé, le résolveur enverra des requêtes sans inclure d’informations superflues. Par exemple, lors du contact avec le DNS racine, il demandera où se trouve le TLD en charge du dot com, mais ne transmettra pas l’intégralité de maps.google.com qu’il cherche à résoudre. De même, lorsqu’il interroge le TLD en charge de la zone dot com, il demandera google.com et non maps.google.com. Utiliser le résolveur de cette manière signifie que les requêtes DNS seront faites en clair sur le port 53.

Si vous préférez que le résolveur ne demande qu’à un serveur DNS le résultat (de manière chiffrée), vous pouvez faire ce qui suit :

  • Dans Services/DNS Resolver/General Settings, cochez Enable Forwarding Mode et Use SSL/TLS for outgoing DNS Queries to Forwarding Servers
  • Dans System/General Setup, renseignez un serveur DNS de votre choix (de préférence un qui prend en charge le DNS over TLS), par exemple Quad9 ou Cloudflare
  • Toujours dans le General Setup, définissez le DNS Resolution Behavior pour n’utiliser que le DNS local et ignorer les DNS distants (sinon, vous serez potentiellement sujet à des fuites DNS lors de l’utilisation d’un VPN)

Les deux méthodes ont leurs avantages et inconvénients, et je n’ai pas d’avis tranché sur laquelle est la meilleure.

Baux DHCP statiques
#

Si vous souhaitez que toutes vos machines utilisent un VPN pour se connecter à Internet et utiliser pfBlockerNG, vous pouvez ignorer cette étape. En gros, nous voulons nous assurer que les machines connectées au réseau auront toujours la même adresse IP afin de pouvoir configurer des règles spécifiques pour elles (c’est-à-dire que vous n’avez pas besoin de le faire pour les machines pour lesquelles vous ne voulez pas définir de règles spéciales).

D’abord, vous devrez aller dans le menu Services/DHCP Server. Si vous avez utilisé la configuration par défaut, vous avez probablement quelque chose comme ceci :

Default DHCP Ranges

Nous allons modifier la plage pour que les IP attribuées par DHCP soient de 192.168.1.100 à 192.168.1.245. Cela nous permettra d’attribuer manuellement une IP entre 192.168.1.2 et 192.168.1.99 à nos machines.

Ensuite, en bas de la page, nous ajouterons une entrée dans DHCP Static Mapping for this Interface. Notez que si vos machines sont déjà connectées au réseau, vous pouvez aller dans Status/DHCP Leases, et cliquer sur Add Static Mapping pour les entrées concernées, afin de ne pas avoir à taper l’adresse MAC et le nom d’hôte vous-même. Vous voudrez alors configurer les choses comme montré dans la capture d’écran suivante. Notez que parfois, l’interface remplira automatiquement le nom d’hôte avec une adresse IP (principalement quand elle ne connaît pas le nom d’hôte). Cela rendra pfSense mécontent, donc vous ne voudrez pas faire cela.

Static Mapping Configuration

pfBlockerNG
#

Tout le monde déteste les publicités et le tracking. Faisons quelque chose à ce sujet également. pfBlockerNG est un module qui peut être installé dans pfSense, et qui permet de faire la même chose qu’un PiHole (ne pas résoudre les requêtes DNS de domaines connus de trackers/publicités, plus pas mal d’autres choses).

Pour l’installer, nous irons dans System/Package Manager/Available Packages, rechercherons pfBlockerNG-devel, puis cliquerons sur installer. Notez qu’il existe aussi une version pfBlockerNG, mais la version devel nous donnera plus de fonctionnalités.

La configuration peut maintenant être effectuée dans Firewall/pfBlockerNG.

Menu General#

Dans les paramètres généraux, nous cocherons la case Enable pour pfBlockerNG, et laisserons les autres paramètres par défaut. Notez que les Log Settings vous permettent de définir combien d’historique de requêtes vous souhaitez conserver.

Menu IP#

Ce menu peut être utilisé pour diverses choses comme empêcher la connexion avec des adresses IP signalées comme suspectes ou identifiées dans une certaine zone géographique, mais nous n’examinerons pas cela aujourd’hui.

Si vous souhaitez avoir des statistiques sur la localisation des IP résolues par le serveur DNS, vous pouvez obtenir une clé de licence MaxMind gratuite pour utiliser GeoIP, et la renseigner dans le menu approprié.

Menu DNSBL et Feeds#

C’est la fonctionnalité que nous utiliserons pour activer la liste de blocage DNS. Vous devez avoir la configuration suivante :

  • Enable DNSBL coché
  • DNSBL Mode -> Unbound python mode, ce qui permettra de meilleures performances et plus de fonctionnalités (comme exclure des IP spécifiques du blocage DNS)
  • DNS Reply Logging coché si vous souhaitez avoir des statistiques sur les noms de domaine résolus (bon à activer de temps en temps pour faire un audit de ce qui se passe avec vos machines)
  • DNSBL Blocking coché
  • HSTS Mode coché
  • Python Group Policy activé, si vous ne souhaitez pas utiliser le filtrage DNS pour certaines de vos machines

Si vous avez coché la case Python Group Policy, un menu du même nom avec un champ texte sera présent sur cette page. Vous pouvez ajouter une IP par ligne, et ces IP n’utiliseront pas DNSBL.

Remarquez également la section DNSBL Whitelist qui vous permettra d’ajouter des domaines que vous ne voulez pas voir bloqués.

Groupes DNSBL
#

Dans ce sous-menu, nous pouvons configurer des groupes de listes, et la fréquence à laquelle vous souhaitez qu’elles soient rafraîchies. Par exemple, si nous configurons DNSBL pour utiliser l’EasyList, qui est assez populaire auprès des bloqueurs de publicités, vous devriez avoir quelque chose comme suit.

DNSBL Group for EasyList

Notez que vous pouvez changer le mode Logging/Blocking pour ne pas garder trace des domaines bloqués. Vous pouvez aussi définir la fréquence de mise à jour des listes.

Si vous souhaitez créer un groupe et ajouter des éléments manuellement, vous pouvez le faire en utilisant la DNSBL Custom_List qui vous permet de lister des noms de domaine.

Je n’ai aucun intérêt à censurer quoi que ce soit de mon réseau, mais si vous souhaitez le faire, vous pouvez utiliser les sous-menus DNSBL Category et DNSBL SafeSearch pour bloquer des choses par catégorie (par exemple pornographie, drogues, banque, hacking, jardinage… il y a un assez grand choix de filtres…)

Feeds
#

Ajouter des groupes et des listes de blocage à la main c’est bien, mais pas très amusant. Heureusement, pfBlockerNG est livré avec un ensemble de listes que vous pouvez activer depuis le menu Feeds. Vous n’avez qu’à cliquer sur l’icône + des éléments qui vous intéressent, et le logiciel pré-remplira le formulaire des groupes DNSBL pour vous.

Rapports
#

Maintenant que nous avons terminé la configuration, il est temps de voir quelques résultats. Avant cela (si c’est la première fois que vous utilisez le module), assurez-vous d’aller dans le menu Update et de forcer un rechargement pour avoir toutes les listes actives.

Étant donné que vous avez autorisé la journalisation, vous pouvez utiliser les sous-menus suivants :

  • Unified pour voir toute l’activité liée au blocage IP et DNSBL
  • Alerts pour voir les listes d’éléments bloqués
  • DNS Reply pour voir les requêtes DNS effectuées
  • DNS Reply Stats pour voir quelques graphiques sur votre activité DNS
  • DNSBL Block Stats pour en savoir plus sur les requêtes DNS bloquées

Notez que la profondeur de l’historique visible dépend du nombre de lignes que vous autorisez les journaux à stocker.

Configuration VPN
#

Maintenant, configurons pfSense pour que toutes les connexions à Internet passent par un VPN. Je n’entrerai pas dans les détails de la configuration d’une instance de client OpenVPN car elle sera légèrement différente selon le fournisseur que vous utilisez. J’ai mis des liens vers les guides pour Mullvad, ProtonVPN et PIA dans les références de cet article. Puisque nous utiliserons notre propre DNS, faites attention à ne pas configurer de DNS avec la connexion OpenVPN (ne cochez pas l’option Pull DNS).

Une fois votre client configuré et fonctionnant correctement, nous irons dans Interfaces/Interface Assignments et ajouterons une interface pour le client. Nous allons ensuite dans sa page de configuration, la nommons VPN1 (ou ce qui vous plaît), et cochons la case Block bogon network.

Ensuite, nous allons dans Firewall/NAT/Outbound, sélectionnons le mode Manual Outbound NAT rule generation, et sauvegardons. De nouveaux mappings devraient apparaître. Nous allons modifier les deux dernières règles (qui devraient ressembler à la capture d’écran suivante)

Original NAT Rules to Change

pour qu’elles ressemblent à ce qui suit (il suffit de changer l’interface de WAN à VPN1, et de désactiver les règles IPv6)

NAT rules after the changes

Ensuite, dans Firewall/Rules/LAN, nous nous assurons de désactiver les règles IP v6 (icône sur la droite) et de modifier la règle Default allow LAN to any rule pour utiliser notre interface VPN1 comme passerelle.

Firewall LAN rule after the change

Enfin, nous voulons nous assurer que notre DNS local envoie ses requêtes à travers la connexion VPN. Allez dans Services/DNS Resolver, et changez les Outgoing Network Interfaces pour que seul VPN1 soit sélectionné.

Redémarrez le client OpenVPN, et vous devriez pouvoir confirmer que vous avez la bonne adresse IP. Vous pouvez également faire un test de fuite DNS pour confirmer que le DNS ne fuit pas (c’est-à-dire que vous ne devriez voir que l’IP de votre VPN dans les résultats).

Exclure un appareil spécifique du VPN
#

Si pour une raison quelconque vous souhaitez qu’un appareil se connecte directement à Internet, nous pouvons le permettre en configurant quelques règles. D’abord, nous devons effectuer une configuration dans Firewall/NAT/Outbound. Nous allons en fait copier les règles que nous avons modifiées précédemment, mais cette fois mettre (à nouveau) WAN comme interface. Au final, vous devriez avoir les règles suivantes.

Final Outgoing NAT Rules

Ensuite, pour chaque appareil que vous souhaitez utiliser sans VPN, nous ajouterons une règle de pare-feu dans Firewall/Rules/LAN (vous devez utiliser Add rule to the top of the list, sinon cela ne fonctionnera pas). Vous devez modifier les champs suivants lors de la création d’une nouvelle règle :

  • Source (Single host or alias) -> L’IP de l’appareil (que vous avez configurée en statique via DHCP précédemment)
  • Description -> Un mémo pour vous
  • Gateway -> l’interface WAN

Snort
#

Enfin, ajoutons de la surveillance de sécurité à notre réseau et allons dans System/Package Manager/Available Packages, et installons snort (un système open source de détection et de prévention d’intrusions réseau). Ensuite, un nouveau menu Services/Snort apparaîtra. Nous effectuerons la configuration suivante :

  • Dans Global Settings, activez les règles qui vous intéressent, et définissez l’intervalle de mise à jour à 6 heures
  • Dans Updates, cliquez sur Update Rules, et vérifiez que tout est correctement téléchargé

Une fois cela fait, créons quelques interfaces Snort. Une pour LAN, et une pour WAN. Nous effectuons la configuration suivante :

  • Activer les interfaces
  • Cocher Enable Packet Captures pour pouvoir voir plus de contexte lors de l’investigation d’une alerte

Il y a aussi une option pour Block Offenders déclenchant une alerte. Si vous configurez un pare-feu domestique, je vous conseille de ne pas cocher cette option car vous finirez probablement par obtenir un bon nombre de faux positifs, et des machines seront bloquées sans bonne raison.

Avec cela, nous avons un Snort fonctionnel, et nous pouvons ajouter un widget au tableau de bord pour voir les dernières alertes. Je n’entrerai pas dans les détails de Snort maintenant, car je prévois d’écrire un article à ce sujet plus tard. Je mettrai le lien de l’article ici quand il sera en ligne.

Sauvegardez votre configuration
#

Maintenant que nous avons tout configuré, exportons un fichier de sauvegarde afin de pouvoir tout restaurer en cas de problème. Cela se fait dans le menu Diagnostics/Backup & Restore.

Pour aller plus loin
#

Si vous souhaitez en savoir plus sur les possibilités offertes par PfSense, vous pourriez être intéressé par cet article où j’explique comment exiger une connexion WireGuard pour accéder à vos services auto-hébergés en ligne, et comment configurer PfSense pour se connecter à WireGuard et router le trafic nécessaire.

Aussi, j’ai récemment écrit un nouvel article avec des améliorations que j’ai trouvées pour cette configuration (Home Network and pfSense Improvements). Cela pourrait vous intéresser si vous voulez que pfSense soit plus résistant aux coupures Internet en cas de défaillance du VPN, ou si vous souhaitez faciliter le basculement des machines entre l’utilisation et la non-utilisation du VPN.


Références et crédits
#

Références
#

Crédits
#