MullvadVPN & pfSense
Pour les amateurs de vie privée 🤫
Toujours dans la continuité de mon p’tit homelab, j’ai voulu faire en sorte que tout le flux sortant de mon VLAN « CTI » à destination d’Internet passe au travers d’un VPN… et étant donné que je suis déjà très bon client de Mullvad, j’ai cherché un peu et je suis tombé rapidement sur ce super tutoriel de chez eux: https://mullvad.net/fr/help/pfsense-with-wireguard
Du coup, ‘me suis dit que ce serait sympa de vous le partager et de l’adapter en français, en y mettant ma propre pâte ! 🫡
I) Génération de la paire de clefs côté pfSense
Alors ici je ne vais pas détailler à nouveau ce qu’est Wireguard, si vous souhaitez en savoir davantage je vous renvois sur l’un de mes articles qui en parle.
Si vous n’avez pas encore installé le package, il suffit de vous rendre sur Package Manager, Available Package.
Ensuite, il faudra activer SSH sur notre pfSense, ‘quand même plus pratique qu’en console. Pour ça, on se rend sur System, Advanced, puis Admin Access:

Une fois connecté en SSH, on va donc générer notre paire de clefs, et envoyer notre clef publique à Mullvad histoire de pouvoir obtenir une IP de leur part:
# On se rend dans le bon folder
cd /usr/local/etc/wireguard
# On génère la paire de clefs, classique
wg genkey | tee privkey | wg pubkey > pubkey

Ensuite, on peut utiliser l’API de chez Mullvad via curl pour obtenir notre IP, qui sera sauvegardée dans un fichier nommé mullvad-ip :
# Pour afficher sa clef publique
cat pubkey
# Pour utiliser l'API
curl https://api.mullvad.net/wg/ -d account=YOURMULLVADACCOUNTNUMBER --data-urlencode pubkey=YOURPUBLICKEY | tee mullvad-ip
Remplacez YOURMULLVADACCOUNTNUMBER et YOURPUBLICKEY, rien de plus facile !

On reste encore un peu connecté pour l’instant, on aura besoin de notre clef privée juste en bas !
II) Création du tunnel Wireguard
On se rend donc sur VPN, Wireguard, puis Add tunnel:

- On renseigne une description ;
- On laisse (en général) le port d’écoute par défaut ;
- On renseigne sa fameuse clef privée dans Interface Keys ;
- On renseigne ensuite l’adresse IP que l’on a reçue, sur Interface Addresses ;
A noter que l’on reçoit une IPv4 et une IPv6, mais comme dit en introduction on va se concentrer sur l’IPv4 only.
On valide !
On se rend suite sur l’onglet Peers, pour ajouter notre fameux serveur Wireguard:

- On choisi le tunnel créé précédemment, tun_wg0 ;
- On rajoute une description, en général on mettra le nom du serveur Mullvad que l’on va utiliser ;
- On désactive le dynamic endpoint, pour justement choisir un serveur unique ;
- On renseigne la clef publique de ce serveur ;
- On rajoute 0.0.0.0/0 dans le champ Allowed IPs, donc tout réseau est autorisé à transiter par ce tunnel, on fera en sorte d’ajuster ça plus tard niveau Firewall/Gateways ;
Concernant le choix du serveur, rendez-vous sur le site de Mullvad directement: https://mullvad.net/fr/servers

Ici, vous pouvez filtrer selon vos propres critères persos… bon forcément prenez Wireguard et En ligne comme type de serveurs, ça va de soit 😌
Pour le coup, j’ai préféré prendre un serveur qui est possédé et non loué par l’entreprise, et qui prend en charge DAITA, mais faites comme vous bon vous semble~
On peut donc valider, puis activer et/ou redémarrer le service !

III) Création de l’interface et de la gateway
On poursuit en nous rendant dans Interfaces, puis Assignments. Vous devriez voir l’interface du tunnel Wireguard disponible:

Cliquez sur Add, puis re-cliquez dessus afin de pouvoir l’éditer:

- On coche Enable ;
- On choisi Static IPv4 ;
- On désactive l’IPv6 ;
- On renseigne notre IPv4 obtenue en début d’article, dans le fichier mullvad-ip ;
On valide encore !
On clique ensuite sur System, Routing, puis Gateways, pour en créer une nouvelle via Add:

- On choisi notre interface précédemment configurée ;
- On renseigne un p’tit nom ;
- On renseigne à nouveau notre IP privée reçue par Mullvad ;
- On peut encoder au besoin notre propre gateway comme IP à monitorer, de sorte à ce que si elle n’est plus atteignable, c’est très certainement que notre tunnel VPN est dans les choux ;
Important, pas oublier de descendre plus bas, cliquer sur Advanced, et cocher Use non-local gateway:

On peut valider, et appliquer !
(Courage, on touche presque à la fin 😉)
On peut enfin lier notre gateway nouvellement créée à notre interface pour notre tunnel Wireguard:

- On la choisi dans le menu déroulant sous IPv4 Upstream gateway ;
Et à nouveau, on sauvegarde !
IV) Configuration des règles de NAT et firewall
La dernière étape consiste à indique à notre VLAN « CTI » d’utiliser cette nouvelle gateway plutôt que celle de base pour l’accès à Internet.
Rendez-vous sur Firewall, NAT, Outbound, et ici cela va dépendre un peu de votre configuration, mais normalement, vous devriez être en Automatic outbound NAT, c’est-à-dire que c’est pfSense qui gère automatiquement les règles de NAT pour vous.
L’astuce ici, ce sera de switcher non pas en Manual comme le préconise leur tutoriel, sinon je vais devoir m’amuser à créer des rules pour chacun de mes VLANs (et ils sont plutôt nombreux…), mais à plutôt passer en Hybrid Outbound NAT.
De cette manière, c’est toujours pfSense qui gère tout comme un grand, mais je peux aussi rajouter des règles manuelles, idéal donc pour mon fameux VLAN.

On sauvegarde, puis on applique !
Ensuite, on rajoute une règle spécifique pour notre VLAN, en cliquant sur Mappings > Add:

- On choisi notre interface ;
- On choisi bien IPv4, car c’est l’objet de cet article pour rappel ;
- Protocoles à Any ;
- Pour la destination, j’ai créé un alias concernant les plages d’IP privées, histoire que l’utilisation du VPN soit uniquement pour Internet, pas inter-vlans, du coup j’ai activé l’option Not ;
- On choisi bien l’adresse à utiliser pour la translation IP ;
Et encore et toujours, on valide !
Concernant cet alias « RFC1918« , je l’ai simplement créé en allant dans Firewall, puis Alias, rien de transcendant:

Et enfin, on autorise notre VLAN à contacter notre gateway Mullvad, via Firewall, Rules, puis Add:

- On laisse par défaut, et on choisi bien IPv4 ;
- On descend plus bas, dans Advanced, et on sélectionne notre gateway ;

On valide, et il ne reste plus qu’à tester !
V) Testing sur un client Windows
On se connecte donc sur notre petite VM Windows 11 dans notre VLAN « CTI »:

Et comme on peut le voir, it works ! Désormais, tous nos assets dans ce VLAN bien précis passerons par Mullvad VPN pour Internet 🎉
Mais il reste la partie DNS, et le petit kill switch en bonus~
VI) Configuration du DNS
C’est le plus simple/rapide, il suffit de se rendre dans System, puis General setup, et naviguer jusqu’à la partie DNS Server Settings:

Ici, on a utilisé le DNS non-filtré de Mullvad (10.64.0.1), et spécifié notre gateway. Aussi simple que ça !
De cette manière, pas de fuite DNS 😏
VII) Kill switch façon firewalling
Toujours très très utile d’avoir un kill switch, c’est-à-dire que si notre VPN venait à tomber, on coupe tout flux sortant !
Alors il y a plusieurs façons de procéder, ici on va passer par des floating rules, en nous rendant à nouveau dans Firewall, Rules, puis Floating:

- On choisi l’action Block ;
- On coche Quick, histoire d’arrêter directement les éventuels traitements en cours ;
- On spécifie l’interface WAN ;
- On choisi Out comme direction ;
- Toujours IPv4 ;
- Une petit description ;
Et on peut valider, mais tout en rajoutant une seconde floating rule, en amont de la précédente, sous peine de se couper l’herbe sous le pied avec Mullvad itself:

Vous devriez obtenir quelque chose comme ça, et notez l’importance de l’ordre d’exécution, si jamais le VPN venait à tomber, on coupe la connexion WAN:

Ah oui, c’est vrai que je ne l’ai pas décrit plus haut, mais une floating rule sur pfSense, littéralement règle flottante, c’est une règle firewall qui s’applique à plusieurs interfaces en même temps, au lieu d’être spécifique à une seule, et elles sont traitées avant les règles classiques. Bon à savoir, et parfait pout notre use case !
VI) Conclusion et side notes
Et bien félicitations à vous pour commencer, vous avez réussi à faire transiter la totalité des flux sortants de l’un voir plusieurs VLANs vers un VPN ! 😎
Ensuite, un grand merci à Mullvad pour la qualité de leur tutoriel, c’est du simple « Next, next… » le truc fonctionne parfaitement, même si l’on dévie légèrement des sentiers battus comme c’était le cas ici !
Comme ils le disent en fin de leur tutoriel, avec cette configuration, pas de support IPv6.
Alors dans mon cas ce n’est pas gênant car je n’ai pas encore commencé son implémentation dans mon homelab, mais si vous connaissez déjà SOCKS5, c’est possible moyennant un poil plus de config, cf: https://mullvad.net/fr/help/socks5-proxy
… ‘ferait peut être un article adapté IPv6 quand ce sera up & running de mon côté tiens… 🤔
Au passage, ayant tout juste fini d’écrire cet article, j’ai repensé à cette histoire de gateway monitoring… et si je ne dis pas de bêtises, il est clairement possible de créer plusieurs Peers/Gateways Wireguard afin de réaliser du Failover, tant que vous avez assez de dispo sur votre compte:

J’avoue que je n’ai pas encore testé car j’ai fait ça un peu d’une traite, je ferai éventuellement une update quand j’aurai le temps, mais je suis presque sûr que ça fonctionne en adaptant un peu 😋
Et pour finir, je suppose que ça coule de source comme depuis le début de ce blog et même de Notamax, mais cet article n’est clairement pas sponsorisé (malheureusement pour moi hehe), j’aime simplement leur philosophie et leur qualité de service, et grosso modo je n’ai fait « que » traduire leur tutoriel en apportant ma touche perso 🙂
Sur ce, j’espère vous avoir appris quelques bricoles, et vous souhaite une bonne journée/soirée ! Ciao !



Laisser un commentaire