Mettre en place OpenVPN rapidement avec Docker

J'avais besoin de mettre en place un serveur OpenVPN (pour plusieurs raisons mais je vous passe les détails) et j'ai finalement trouvé mon bonheur avec Docker ! Mon seul pré-requis était d'avoir une authentification par certificat (uniquement).

Mise en place d'un sous-domaine

Ce n'est pas quelque chose d'obligatoire mais autant faire les choses propres, ici il s'agissait d'ajouter un sous-domaine vpn.xorhak.fr (A et AAAA). Comme ça j'utilise ce sous-domaine pour les accès (c'est plus simple qu'une IP, non ?).

Préparation de l'environnement

Ensuite j'ai préparé un peu le terrain côté serveur avant d'y déployer le service OpenVPN. J'ai fais relativement simple en mettant tout dans le dossier /home/docker/openvpn. Le dossier data contient toutes les configurations du service (et les users) :

$ mkdir -p /home/docker/openvpn/data

Pré-configuration du service

Avant de déployer le service, il est nécessaire de le lancer une première fois afin de l'initialiser, c'est très simple (n'oubliez pas de changer les paramètres) :

$ docker container run --rm -v /home/docker/openvpn/data:/etc/openvpn kylemanna/openvpn:latest ovpn_genconfig -u udp://vpn.xorhak.fr
$ docker container run --rm -ti -v /home/docker/openvpn/data:/etc/openvpn kylemanna/openvpn:latest ovpn_initpki

N'oubliez pas de préciser une passphrase quand même, c'est toujours mieux d'un point de vue sécurité. La génération de la clé peut prendre un peu de temps, alors soyez patient !

Préparation du docker-compose

Pour que ce soit plus simple à gérer sur le temps terme, le mieux c'est d'y mettre un fichier docker-compose.yml avec ce type de configuration. Attention n'oubliez pas de remplacer les paramètres aussi :

openvpn:
    image: "kylemanna/openvpn:latest"
    container_name: openvpn
    ports:
        - "1194:1194/udp"
    volumes:
        - "/home/docker/openvpn/data:/etc/openvpn"
    cap_add:
        - NET_ADMIN
    restart: always

Puis il reste à lancer le service :

$ docker-compose up -d

Création de l'utilisateur

Maintenant que le service OpenVPN tourne en tâche de fond, reste plus qu'à créer un utilisateur (normal), là aussi c'est très simple :

$ docker container run --rm -ti -v /home/docker/openvpn/data:/etc/openvpn kylemanna/openvpn:latest easyrsa build-client-full djerfy nopass

La configuration étant généré, il faut encore récupérer le fichier (type .ovpn) :

$ docker container run --rm -v /home/docker/openvpn/data:/etc/openvpn kylemanna/openvpn:latest ovpn_getclient djerfy > djerfy.ovpn

Vous aurez le fichier djerfy.ovpn qui sera à mettre en place sur les postes client (fonctionne au top sur macOS et iOS avec un client compatible OpenVPN).

Firewall

Le service utilise le port 1194 en UDP donc n'oubliez pas de l'ouvrir côté firewall et de le tester depuis l'extérieur (c'est mieux). Personnellement j'utilise ufw donc l'ajout se fait très simplement :

$ ufw allow 1194/udp comment 'public access openvpn'

Debug

Si vous avez besoin de faire un peu de debug (les logs du serveur) :

$ docker-compose logs -f

Mise à jour

Faire une mise à jour du container est très simple et rapide :

$ docker-compose pull
$ docker-compose up -d

Voilà, j'espère que ça peut vous servir un jour. Enjoy! 😘
XorHak