Etape 1 : Présentation de l’infrastructure.
Sur notre schéma ci-dessous nous pouvons voir deux réseaux, un réseau DMZ hébergeant des serveurs en 192.168.0.1/24 et un réseau utilisateur en 10.0.0.0/24.
Pour joindre internet les deux réseaux sortent par leur passerelle par défaut situé en France.
L’objectif ici va être de configurer sur notre PFsense un client OpenVPN pointant vers un serveur vpn situé en Ukraine et de router seulement le réseau utilisateur à travers le tunnel OpenVPN. Voir schema ci-dessous :
Il n’est cependant pas possible de déclarer plusieurs passerelles par défaut.
Pour router l’ensemble des flux utilisateurs à travers le tunnel OpenVPN il va falloir faire du « policy based routing ».
Plus communément appelé PBR cette technique permet à partir de règles de filtrage de router un flux vers une passerelle en particulier.
Etape 2 : Choix du prestataire vpn
Pour faire mon choix entre les différents prestataires vpn existant, je me suis aidé de ce site : https://www.privacytools.io/#vpn
Il regroupe un ensemble de prestataires VPN jugés digne de « confiance ».
Pour ce tutoriel j’ai choisi de prendre un abonnement d’un 1 mois à proxy.sh
Voici l’offre que j’ai chez proxy.sh pour 5$/mois
Avec cette offre j’ai le choix entre plusieurs pays pour monter mon tunnel OpenVPN : USA, France, Allemagne, Pays-bas, Ukraine.
Pour ma part j’ai choisi l’Ukraine car c’est le seul pays proposait en dehors des Fourteen Eyes.
Etape 3 : Configuration du client OpenVPN sur PFsense
Pour cet exemple je vais me baser sur les informations fournies par Proxy.sh pour configurer mon VPN. Le principe est le même si vous choisissez un autre fournisseur.
La configuration à mettre en place est disponible sur l’interface utilisateur de proxy.sh. Je vous la mets ici, histoire que vous puissiez suivre le tuto sans avoir de compte :)
Sur l’interface de management de pfsense rendez-vous dans System > Certs Manager > onglet CAs.
Nous allons ajouter le certificat serveur fournis par Proxy.sh.
Ajoutez un nouveau certificats nommé proxy et copiez/coller le certificat suivant :
[sh]—–BEGIN CERTIFICATE—–
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
TSMSym4Np+AmT7OX
—–END CERTIFICATE—–[/sh]
Nous pouvons maintenant procéder à la configuration de client OpenVPN à proprement parler.
Rendez-vous dans VPN > OpenVPN > Onglet Client.
Cliquez sur
Peer Certificate Authority : Sélectionnez le certificat que nous avons ajouté toute à l’heure.
Client Certificate : Sélectionnez le certificat de votre client
Encryption algorithm : Sélectionnez None (nous le configurerons dans les options avancé)
Dans advanced configuration nous allons rajouter plusieurs options dont celle qui va nous servir à nous authentifier.
[sh]comp-lzo
cipher AES-256-CBC
auth SHA512
tls-client
verb 5
auth-user-pass /home/admin/mdp.txt
route-nopull[/sh]
Il vous faut maintenant créer sur votre pfsense en ssh un fichier mdp.txt qui va contenir les logins/mdp fournies dans l’interface d’administration de votre prestataire vpn. Pensez à modifier le chemin du fichier si vous n’utilisez pas le même que moi.
un exemple de fichier avec en haut le login et en bas le mot de passe :
[sh]cat /home/admin/mdp.txt
dsofjodifsjodijf
Kfhhf0zajdf[/sh]
Nous allons maintenant vérifier que notre tunnel VPN est bien monté.
Dans System logs > onglet OpenVPN la ligne de log suivante vous indique que le vpn est up :
[sh]openvpn[91281]: Initialization Sequence Completed[/sh]
Nous allons maintenant assigner une interface à notre tunnel vpn.
Dans l’interface d’administration de pfsense selectionnez Interfaces > Assign
Pour me faciliter la vie j’ai renommé mon interface en « VPN_UKRAINE »
Il ne vous reste plus qu’à activer l’interface en cliquant sur « Enable » :
Nous allons maintenant déclarer cette interface comme passerelle.
Dans System > Routing
Sauvegarder la configuration.
La passerelle prendra l’ip attribué dynamiquement par le client VPN.
Etape 3 : NAT
Nous allons maintenant mettre en place le nat pour que le réseau source (10.0.0.0/24) soit translaté sur l’ip publique de notre vpn.
Pour se faire il faut aller dans Firewall > NAT > onglet Outbound
Selectionnez Manual Outbound NAT rule Generation et cliquez sur Save.
Cela va nous permettre de configurer manuellement notre translation d’adresse.
Cliquez sur pour ajouter une nouvelle règles.
Interface : Elle correspond à l’interface sur laquelle nous avons monter notre tunnel OpenVPN.
Source : Cela correspond à notre réseau utilisateur.
Translation : Nous spécifions la translation d’adresse qui doit s’effectuer. Ici la source sera modifiée par l’adresse IP publique de l’interface.
Cliquez sur Save.
Pour le réseau 10.0.0.0/24 vous devriez obtenir quelque chose comme suit :
Si elle n’existe pas vous pouvez configurer une seconde règles qui vous permettra de sortir sans vpn : Le routage étant effectué avant la translation d’adresse il n’y a pas d’incompatibilité à spécifier les deux règles. Le choix de l’interface de sortie se faisant par le biais du PBR.
Etape 4 : Policy Based Routing
La configuration du PBR se fait dans Firewall > Rules > Onglet de votre réseau local.
Imaginons que vous souhaitiez router tous les flux http à travers votre vpn. Rien de plus simple il suffit de créer la règle suivante :
Puis dans les options avancées de la règles il vous suffit de préciser la passerelle de sortie.
Tous les flux TCP à destination du port 80 (http) passeront par notre tunnel OpenVPN
A l’inverse si vous souhaitez faire transiter l’ensemble de vos flux à travers votre tunnel OpenVPN il vous faudra remplacer la règle précédente par la suivante :