Mise en place d’un tunnel chiffrer grâce à OpenVPN

I – Préparatif

Dans cet article nous allons voir comment mettre en place un serveur OpenVPN sous Debian. Pour commencer prenons une vue d’ensemble de notre réseau.

Le but est de pouvoir se connecter au VPN depuis l’ordinateur portable du réseau 192.168.5.0/24, ce réseau nous sert à « simuler internet (notre WAN) ».

Machine

@IP

RED IPCOP

192.168.5.214

GREEN IPCOP

172.16.255.2

Serveur OpenVPN

172.16.6.8

Je n’ai pas précisé l’adresse du PC portable car il obtient son IP par DHCP mais aussi parce qu’il sera déplacé durant l’article.

II – Installation d’OpenVPN et la commande OpenVPN

Dans un premier temps on intègre le PC portable au même réseau que le serveur OpenVPN, le PC portable est sous Debian, comme le serveur.

On commence par installer OpenVPN sur le serveur (apt-get install openvpn), on installe également tcpdump, un sniffer de paquets.

Dans cette partie nous allons tester le serveur VPN en ligne de commande. Pour commencer on éteint le service OpenVPN (service openvpn stop).

Sur le serveur, nous lançons la commande openvpn –dev tun0 –verb 5 –ifconfig 10.0.1.1 10.0.1.2 et on lance la commande openvpn –dev tun0 –verb 5 –ifconfig 10.0.1.2 10.0.1.1 –remote 172.16.6.8 (@IPserveurVPN).

L’option –dev indique qu’elle interface virtuelle utilisée pour la connexion VPN, on indique un niveau de verbosité pour les logs (–verb 5). Le VPN crée une connexion point à point, on doit donc définir les points, l’option –ifconfig sert à ça, la première @IP (10.0.1.1) indiqué est l’IP du point sur lequel on est et la deuxième IP (10.0.1.2) est le point suivant.

Sur le client les IP de l’option –ifconfig s’inverse, et on ajoute l’option –remote qui précise l’adresse réel du serveur VPN.

Une fois que l’on a lancé ces deux commandes on exécute un tcpdump sur chaque interface, la réel (enp0s3) et la virtuelle (tun0).

III – Les certificats

OpenVPN fonctionne avec un système de certificats pour vérifier et sécuriser les connexions, il va donc falloir générer des certificats pour les clients, un certificat pour le serveur et une autorité de certification pour signer tous nos certificats. Pour faire nos certificats on va utiliser openssl.

On commence par créer notre environnement de travail, on ne va pas utiliser l’emplacement de base d’openssl, on va le copier dans un autre emplacement. On crée les dossiers suivants :

  • /apps/openvpn/keys
  • /apps/openvpn/log
  • /apps/openvpn/conffiles
  • /apps/easy-rsa

Puis on copie le répertoire /usr/share/easy-rsa dans le dossier /apps/easy-rsa.

Maintenant on va définir les variables qui seront utilisées pour la création des certificats. Pour ce faire on modifie le fichier /apps/easy-rsa/vars, on va modifier les variables suivantes :

Ces variables seront les variables utilisées par défaut lors de la création des certificats et pour appliquer les valeurs aux variables il faut lancer la commande source vars.

Remarque : J’ai eu des soucis concernant le openssl.cnf qu’il ne trouvait pas, pour résoudre ce problème j’ai renommé la dernière version du openssl.cnf en openssl.cnf (mv openssl-1.0.0.cnf openssl.cnf). J’ai également dû lancer un ./clean-all bien que je n’ai aucune clefs existante, mais le source vars me demandait expressément d’exécuter cette commande.

Une fois que nos variables sont définies on peut lancer le script build-ca (./build-ca).

De la même manière on crée le certificat de notre serveur avec le script build-key-server.

On met, comme option, le nom de notre serveur, il ne faut pas oublier de préciser les options supplémentaires et surtout ne pas oublier de signer le certificat !

Et on crée un certificat par client avec le script build-key avec le nom de notre client comme option toujours en précisant les options qui n’ont pas de valeurs par défaut et on signe notre certificat.

On vérifie que toutes les clefs sont bien créées, on peut voir qu’il y a bien la clef du serveur (srvpn), de notre client (kovacs) et de notre autorité de certification (ca)

On génère une clé Diffie-Hellman de 2048 bits qui sortira sous le nom de dh2048.pem (-out dh2048.pem)

IV – Le tunnel

Petite précision : nos deux machines sont dans le même réseau (172.16.6.0/24).

On va commencer par déplacer le certificat de l’autorité de certification ainsi que la clé Diffie-Hellman et le certificat, avec sa clé, de notre serveur dans le dossier /apps/openvpn/keys (je fais un mv des fichiers ca.crt, dh2048.pem, srvpn.crt et srvpn.key vers /apps/openvpn/keys)

Le démon OpenVPN vient chercher sa configuration dans le fichier /etc/openvpn/*.conf, nous n’allons pas nous servir du démon tout de suite donc on placera notre fichier de configuration dans le dossier /etc/openvpn plus tard. Pour l’instant nous travaillons dans notre environnement que nous avons créé (/apps)

Voilà à quoi ressemblera notre fichier de configuration, il s’appellera srvpn.conf ($nomserveur.conf). Il sera créé dans le dossier /apps/openvpn/conffiles.

Et la configuration du client sera comme sur l’image précédente, il faut envoyer ce fichier de configuration sur le client ainsi que les certificats et la clef nécessaire, en précisant les bons chemins.

Une fois que le client et le serveur disposent de leurs fichiers de configuration on peut les exécuter, pour ce faire nous exécuter la commande openvpn « confserver » (openvpn srvpn.conf) et la même commande sur le client sauf qu’on lance avec le fichier de configuration client en option.

Dans le même temps on ouvre les logs du serveur pour vérifier que tout fonctionne (tail -f /apps/openvpn/log/openvpn.log).

Les logs du serveur VPN nous indiquent que le serveur VPN est prêt à recevoir le client.

V – Depuis l’extérieur

On place notre PC portable dans le réseau 192.168.5.0/24.

On modifie la configuration de notre client, pour y indiquer l’adresse IP du pare-feu car c’est lui qui recevra la connexion.

On ajoute l’option push pour envoyer une config sur le client, ici on envoie des routes à ajouter dans la table de routage, ces routes vont nous permettre d’obliger le client à utiliser le tunnel pour atteindre nos réseaux locaux.

Pour tout ce qui concerne la configuration du pare-feu on peut se référer à mon article sur le sujet.

On commence par ajouter un service sur le port 11094.

Remarque : depuis le début je configure mon VPN sur le port 11094, le port par défaut est le port 1194 (et non pas 11094 comme j’utilise), si j’utilise le 11094 à la place du 1194 c’est parce que mon pare-feu est un IPCOP et qu’IPCOP réserve le port 1194 (vu qu’il a un serveur OpenVPN intégré), comme je ne me sers pas du VPN d’IPCOP je change le port de fonctionnement de mon VPN.

On ajoute les deux règles encadrées en rouge, la première règle permet au VPN de pouvoir communiquer vers l’extérieur, lorsqu’un client se connecte le serveur doit effectuer des vérifications mais notre pare-feu bloque presque tout ce qui sort donc on doit ajouter une règle pour que le VPN puisse envoyer des paquets aux clients. Ensuite j’ajoute une règle de Port Forwarding renvoyant les paquets des clients arrivant sur le pare-feu vers le VPN.

Comme les clients doivent communiquer aussi bien avec le Vlan serveur qu’avec les autres Vlan de notre LAN, on ajoute donc une route sur notre routeur pour que les utilisateurs des Vlan puissent répondre aux utilisateurs VPN. On a donc ajouté une route qui nous permet de joindre le réseau virtuel (172.31.0.0/24) via le serveur VPN (172.16.6.8).

Pour terminer on lance le serveur OpenVPN comme précédemment (il faut aussi ouvrir les logs) et on démarre notre client VPN. Pour que le VPN se lance en même temps que le temps (ne pas renseigner le fichier de configuration mais le lancer avec un /etc/init.d/openvpn start) il suffit de déplacer, ou de faire un lien, du fichier de configuration dans le dossier /etc/openvpn.

sources : Diffie Hellman sur Wikipedia ; stackexchange ; openvpn sur wikipedia ; le site officiel d’openvpn ; le forum officiel d’openvpn

1 réflexion au sujet de “Mise en place d’un tunnel chiffrer grâce à OpenVPN

  1. Bonjour Kilian,
    Je viens de consulter ton log pour la config openVPN, j’ai essyé de monter un openvpn d’apres l’installation il n’affiche toujours pas l’interface virtuelle tun0, pourtant il est bien indiqué sur le fichier server.conf ‘dev tun’

Laisser un commentaire

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