Pare-feu, serveur VPN et plus avec pfSense

Image


pfSense est un utilitaire basé sur FreeBSD. Son utilisation principale est celle d'un pare-feu, mais il est en fait plus complexe et propose beaucoup de fonctionnalités. Ici, je vais entrer dans les détails concernant l'utilisation que j'en fais, mais il y a beaucoup plus de choses que nous pouvons faire avec, beaucoup de fonctionnalités que je n'utilise pas pour l'instant.



Cluster


La première chose à savoir est que j'ai en fait 2 ordinateurs pfSense fonctionnant en cluster. Chaque membre du cluster dispose d'une interface « SYNC » dédiée pour synchroniser les états et les règles du pare-feu, ainsi que la configuration. Une adresse IP virtuelle (VIP) est créée à l'aide de CARP pour les interfaces LAN et WAN. Mes autres machines utilisent ces VIP pour accéder au pare-feu.



Voici une vue de l'état des VIP sur le nœud master :
Image


Voici une vue de l'état des VIP sur le nœud backup :
Image

Grâce à cela, en cas de défaillance de l'un des pare-feux, il est totalement invisible pour les autres machines de savoir qu'il y a une défaillance, puisque le pare-feu restant prend le relais et que les VIP sont toujours accessibles. Dès que le pare-feu défaillant se rétablit, tout revient à la normale, ce qui est également invisible pour les autres machines.



Pare-feu


Ce serveur me sert principalement de pare-feu. Il est installé sur deux machines physiques dédiées qui possèdent deux interfaces réseau gigabit, et une interface SYNC dédiée comme mentionné ci-dessus. En ce qui concerne les autres interfaces, l'une est branchée sur le routeur de mon fournisseur d'accès, ce qui est le côté WAN, et l'autre est branchée sur un commutateur, ce qui est le côté LAN. Les deux sont sur un sous-réseau différent, de sorte que le LAN est isolé du WAN, et tout ce qui entre ou sort est filtré par des règles de pare-feu. En ce qui concerne le réseau local, chaque machine dispose également de son propre pare-feu, où tout est bloqué à l'exception des connexions dont les machines ont besoin.



Voici un aperçu des logs du pare-feu :
Image

Par défaut, le système est possède certaines règles prédéfinies, comme le refus de chaque connexion entrante sur l'interface WAN. Je peux aussi ajouter des règles moi-même.

Sur l'onglet action, une croix rouge signifie que le trafic est bloqué et une icône de validation verte signifie que le trafic est autorisé et passe.

L'interface correspond à l'interface à laquelle la règle est appliquée. Lorsqu'il y a une flèche pointant vers la droite, cela signifie qu'il s'agit d'une connexion sortante de l'interface. Lorsqu'il n'y a pas de flèche, il s'agit d'une connexion entrante.

L'onglet règle affiche le nom de la règle. Lorsqu'il s'agit d'une règle définie par l'utilisateur, il y a une icône de personne à côté du nom de la règle.

La source et la destination affichent l'adresse IP et le port source, ainsi que l'adresse IP et le port de destination. La section protocole nous indique quel protocole est utilisé.



Pfblocker-ng


En ce qui concerne le pare-feu, j'ai également installé un utilitaire appelé pfblocker-ng, qui est très similaire à pi-hole qui est bien connu.

C'est un utilitaire qui crée un trou DNS qui fonctionne avec des listes noires et listes blanches. Une liste d'URL et d'IP sont présentes dans ces listes, et celles qui sont bloquées sont redirigées via DNS vers une VIP qui ne mène nulle part et agit comme un trou noir. Par conséquent, ladite URL n'est pas résolue et ne peut pas être affichée. Lorsqu'il s'agit d'une adresse IP, elle est directement bloquée.

Ceci est très utile pour bloquer les publicités indésirables, les logiciels espions, les logiciels malveillants ainsi que les sites et IP de spam. Il est possible de bloquer les connexions entrantes et sortantes.



Voici un exemple de blockage de pfblocker-ng :
Image

Il y a plusieurs onglets ici. Il y a l'heure et l'interface comme habituellement. La source correspond à l'appareil qui a initié la connexion bloquée. Le domaine fait référence à l'URL bloquée et le groupe de flux indique quelle liste a été utilisée pour bloquer la connexion.

Il est possible d'utiliser autant de listes que je veux. Beaucoup d'entre elles sont disponibles sur github et d'autres sites comme celui-ci. Je configure ces flux et listes dans l'onglet de configuration de pfblocker-ng.



OpenVPN


J'ai également un serveur openvpn configuré sur cette machine. Il me permet de me connecter à distance à mon infrastructure lorsque je ne suis pas chez moi. C'est très utile quand je dois résoudre des problèmes ou juste quand je veux travailler sur mes projets quand je ne suis pas chez moi.

Chaque utilisateur doit être créé avec un certificat. Lors de l'authentification, l'utilisateur doit également entrer un mot de passe en plus du fait que le serveur vérifie la validité du certificat.



Lorsqu'une connexion est établie :
Image

Je peux voir qui est connecté, l'heure à laquelle la connexion a été établie, ainsi que les adresses IP réelles et virtuelles des utilisateurs. Je peux couper la connexion en cliquant sur la croix à droite si je veux forcer la déconnexion d'un utilisateur.



Wireguard


Lorsque j'ai utilisé OpenVPN, j'ai remarqué que mon débit n'était pas très élevé. Cela devenait rapidement un problème lors du transfert de fichiers volumineux. C'est pourquoi j'ai lu en ligne les meilleures options qui s'offraient à moi. Beaucoup de gens ont mentionné Wireguard, alors je l'ai essayé. Le fonctionnement est similaire à celui de SSH : une clé privée et une clé publique. Une passphrase partagée, facultative mais recommandée, peut également être définie.


Lorsqu'un tunnel est créé, je peux ajouter des pairs à ce tunnel. J'ai choisi d'ajouter chaque pair manuellement avec une adresse /32 au lieu d'un sous-réseau entier pour une meilleure sécurité. Un widget m'indique ensuite le nombre de pairs connectés et la quantité de données qu'ils ont transférées.



Voici le widget :
Image

Maintenant, tous mes problèmes de débit sont résolus et j'utilise toujours Wireguard comme VPN pour me connecter à mon réseau domestique.



DHCP


DHCP est un protocole qui attribue une adresse IP à une machine qui la demande. Habituellement, cela se fait lorsqu'une machine est mise sous tension. Cela se fait également lorsque le bail est sur le point d'expirer.

La durée du bail est définie par moi-même dans la configuration du serveur DHCP. Habituellement, elle est réglé sur 24h, donc lorsque le serveur donne une adresse IP à une machine, la machine doit refaire une demande avant que le bail n'expire. Si la machine est éteinte et qu'aucune nouvelle demande n'est faite, le serveur DHCP efface le bail afin qu'une autre machine puisse se voir attribuer cette adresse IP.

Un bail est dynamique. Pour une même machine, différentes adresses IP peuvent être attribuées. Le serveur attribuera une IP qui se trouve dans la plage des IP à attribuer, qui sont également définies par moi-même dans la configuration du serveur. Je peux également ajouter des baux statiques, c'est-à-dire que lorsqu'une machine demande une adresse IP, le serveur lui donnera toujours la même adresse IP. C'est une réservation basée sur l'adresse MAC de la carte réseau.

Dans ma configuration actuelle, j'ai plusieurs baux statiques, ainsi que des baux dynamiques.



Voici une vue des baux :
Image

Comme les règles de pare-feu, les baux statiques définis par moi-même ont un logo d'utilisateur à côté d'eux. Pour les baux dynamiques, c'est un signe de validation.

Pour chaque bail, je peux voir l'adresse IP attribuée par le serveur, l'adresse mac du client, le nom d'hôte et la description. Les sections début et fin définissent le début et la fin du bail. Il n'y en a pas pour les baux statiques car la même adresse IP sera toujours fournie pour les machines correspondant aux adresses MAC définies. Ici, le seul bail dynamique est mon pc de bureau et sa durée est de deux heures.

Si mon pc de bureau ne demande pas de renouvellement, l'adresse IP sera effacée et de nouveau disponible. J'ai également le statut des machines, en ligne ou hors ligne, le type de bail et des actions telles que modifier, wake on lan, créer un bail statique.



NTP


Cette machine fait également office de serveur NTP. Il est utilisé par d'autres machines pour avoir l'heure et la date correctes via le réseau. Le serveur se synchronise avec ce qu'on appelle les pools NTP, qui donnent l'heure et la date exactes.



Voici les connexions NTP actives :
Image

Les pools ont plusieurs machines qui leur sont liées, donc si un serveur d'un pool est en panne, d'autres peuvent prendre en charge les demandes.



Certificats


pfSense peut générer des demandes de certificats, des clés privées et peut également signer des certificats. Il agit alors comme une autorité de certification. Grâce à cela, je peux créer des certificats pour toutes mes machines qui ont des interfaces web.

Je dois simplement faire confiance à l'autorité de certification de mon navigateur, et chaque interface Web à laquelle j'accède qui porte un certificat signé par cette autorité est considérée comme de confiance. Cela supprime le message disant "Votre connexion n'est pas privée" indiquant que l'autorité de certification ne peut pas être vérifiée.

Je peux également générer des certificats pour des services, comme OpenVPN, et il existe une liste de révocation de certificats où je peux révoquer des certificats.



Voici un certificat signé par pfSense :
Image