Dans cet article, nous allons créer notre propre serveur OpenVPN avec Docker. La mise en place de ce serveur VPN nous sera utile car en nous y connectant, il sera possible d'accéder à tous les services connectés au même réseau que celui-ci. De plus grâce à l'utilisation de Docker, nous allons également simplifier au maximum cette mise en place afin qu'elle puisse être complétée en quelques minutes.

Avant-propos

Pour réaliser cette installation vous aurez bien sûr besoin de ... Docker ! Pour rappel, voici un article détaillant l'installation de Docker.

Je vais réaliser cette installation sur un VPS qui possède deux réseaux :

  • WAN : 51.178.56.X
  • LAN : 10.0.86.X

J'ai également une seconde machine sur le même LAN, qui me servira pour confirmer le bon fonctionnement de mon VPN.

Après quelques recherches, j'ai décidé de n'utiliser aucune image présente sur le docker hub. Pourquoi ?

L'image la plus utilisée sur le Hub Docker d'OpenVPN est la suivante : https://hub.docker.com/r/kylemanna/openvpn/

Avec plus de 500 Millions de téléchargements, et après un tour rapide sur le fichier Dockerfile, elle semble parfaite. Toutefois la dernière mise à jour date - lors de l'écriture de l'article - à plus de 8 mois et je trouve ça un peu dommage.

Mais fort heureusement, le créateur de cette image a mis le lien vers les sources sur github ! Je vais donc partir de là afin de construire l'image pour le serveur OpenVPN.

Cette image contient un certains nombres de commandes qui vont faciliter le déploiement d'un serveur OpenVPN.

Mise en place du serveur

Dans un premier temps, nous allons cloner le dépôt :

git clone https://github.com/kylemanna/docker-openvpn.git

Dès le téléchargement terminé, rendez-vous dans le dossier :

cd docker-openvpn

Nous allons pouvoir construire l'image avec les éléments à jour :

docker build -t server_vpn .

Vous pouvez ensuite créer un dossier afin de stocker les fichiers de configuration et les clés nécessaires au serveur. Si vous ne stockez pas ces informations persistantes, au prochain redémarrage de votre serveur, il sera nécessaire de refaire la configuration et de générer à nouveau les clés.

cd ..
mkdir openvpn-etc

Lançons maintenant notre première configuration :

$ docker run -v $PWD/openvpn-etc:/etc/openvpn --rm server_vpn ovpn_genconfig -u udp://IP_ADDRESS:1194
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
Cleaning up before Exit ...

C'est donc la commande ovpn_genconfig de l'image qui va créer cette première configuration. On utilise ici le paramètre --rm de la commande Docker afin de supprimer le container automatiquement à la fin de la génération.

Enfin on passe avec l'argument -u l'addresse de notre serveur ainsi que le port d'écoute d'OpenVPN.

TCP vs UDP ?

On utilise généralement le protocole UDP pour une connexion VPN. Il est malgré tout possible de réaliser cette connexion en TCP.

La configuration TCP offre les avantages suivants :

  • Plus stable puisque le protocole TCP garantit l'émission des paquets,
  • By-Pass des firewalls : Il est rare de bloquer le port 80 et 443 en TCP,

Par contre de ce fait le protocole TCP est plus lent.

De ce fait le protocole UDP offrira comme gros avantage d'être beaucoup plus rapide. Par contre il peut être déconseillé dans des cas où la connexion n'est pas stable ou si votre infrastructure ne le permet pas.

Dans tous les cas, j'aurais pu utiliser Traefik afin de router les paquets TCP ou UDP. Mais je reviendrai sur cette possibilité dans un article ultérieur, le but ici étant de réaliser mon installation le plus rapidement possible.

Génération des certificats

Nous devons maintenant générer les clés PKI du serveur. Le script d'initialisation, en plus de créer la clé privée,  va également générer le certificat CA. Un mot de passe vous sera demandé afin de sécuriser votre clé privée.

docker run -v $PWD/openvpn-etc:/etc/openvpn --rm -it server_vpn ovpn_initpki

Le script exécuté sera cette fois-ci : ovpn_initpki

Une fois ces éléments générés, vous pouvez lancer le serveur :

docker run -v $PWD/openvpn-etc:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN server_vpn

Enfin, nous allons pouvoir créer les comptes utilisateurs pour connecter au VPN. L'image possède encore un outil pour faciliter notre travail :

docker run -v $PWD/openvpn-etc:/etc/openvpn --rm -it server_vpn easyrsa build-client-full user1 nopass

Le mot de passe de votre certificat PKI vous sera demandé.

Nous venons d'ajouter un compte utilisateur avec le nom user1, et dans le cadre de notre tutoriel, j'ai utilisé l'option nopass. Avec cette option, l'utilisateur peut se connecter directement avec le fichier de configuration.

Cela signifie également que si quelqu'un obtient le fichier de configuration que nous venons de générer en quelques secondes, il pourra alors se connecter à notre serveur VPN sans avoir besoin d'une autre authentification.

Dernière étape de notre installation, nous allons exporter le fichier de configuration qui sera envoyé à l'utilisateur pour se connecter :

docker run -v $PWD/openvpn-etc:/etc/openvpn --rm server_vpn ovpn_getclient user1 > monuser.ovpn

Installation du client sous Windows

Rien de complexe, vous pouvez télécharger celui-ci à l'adresse suivante :

Une fois l'installation terminée, il vous suffira d'importer le fichier de configuration que nous avons précèdement créé ( à récuperer à l'aide de scp/rsync/winscp par exemple ) :

import file

Vous pouvez valider le fonctionnement de votre VPN en essayent de ping une machine sur le réseau distant, dans mon cas ping 10.0.86.122 par exemple.


Votre VPN est enfin prêt pour réaliser une connexion sur votre réseau. Bien évidement cette configuration est un exemple et il reste certains éléments à affiner. Sur mon exemple, tout le flux réseau passe par le VPN. Dans le cadre d'une utilisation en entreprise, il serait nécessaire de limiter le réseau passant par vos infrastructures.

L'installation via ce type d'image Docker permet de gagner un temps précieux dans l'installation et la mise en place d'OpenVPN. Vous pouvez même envisager d'utiliser plusieurs instances avec différents ports, pour offrir différents niveaux d'accès à votre réseau.

Avez-vous déjà installé OpenVPN sur Docker ? Pour quelle(s) raison(s) ?

En tout cas  n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, c'est toujours un plaisir d'avoir des retours et des échanges !