Pfsense : OpenVPN Policy Based Routing

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.

avant

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 :

Après

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

offreproxysh

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.

cert1

Ajoutez un nouveau certificats nommé proxy et copiez/coller le certificat suivant :

[sh]—–BEGIN CERTIFICATE—–
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
TSMSym4Np+AmT7OX
—–END CERTIFICATE—–[/sh]

cert2

Nous pouvons maintenant procéder à la configuration de client OpenVPN à proprement parler.

Rendez-vous dans VPN > OpenVPN > Onglet Client.
Cliquez sur icone pfsense

openvpn

openvpn2
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]

openvpn3Il 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

openvpn16

Pour me faciliter la vie j’ai renommé mon interface en « VPN_UKRAINE »

openvpn14

Il ne vous reste plus qu’à activer l’interface en cliquant sur « Enable » :

openvpn15

Nous allons maintenant déclarer cette interface comme passerelle.

Dans System > Routing

Cliquez sur icone pfsenseopenvpn12

Sauvegarder la configuration.

La passerelle prendra l’ip attribué dynamiquement par le client VPN.
openvpn13

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 icone pfsense pour ajouter une nouvelle règles.

openvpn4Interface : 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 :

openvpn5Si elle n’existe pas vous pouvez configurer une seconde règles qui vous permettra de sortir sans vpn : openvpn6Le 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 :

openvpn7Puis dans les options avancées de la règles il vous suffit de préciser la passerelle de sortie.

openvpn8Tous les flux TCP à destination du port 80 (http) passeront par notre tunnel OpenVPN

openvpn9A 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 :

openvpn10

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.