Comment exécuter OpenVPN dans un conteneur Docker sur Ubuntu 14.04

introduction

Ce didacticiel explique comment configurer et exécuter un conteneur OpenVPN à l’aide de https://docker.com [Docker].

OpenVPN fournit un moyen de créer des réseaux privés virtuels (VPN) en utilisant le cryptage TLS (évolution de SSL). OpenVPN protège le trafic réseau contre les attaques d’espionnage et les attaques de type «homme au milieu» (MITM). Le réseau privé peut être utilisé pour connecter en toute sécurité un périphérique, tel qu’un ordinateur portable ou un téléphone portable fonctionnant sur un réseau WiFi non sécurisé, à un serveur distant qui relaie ensuite le trafic sur Internet. Les réseaux privés peuvent également être utilisés pour connecter en toute sécurité des périphériques entre eux via Internet.

Docker offre un moyen d’encapsuler le processus du serveur OpenVPN et les données de configuration afin de le gérer plus facilement. Le fichier Docker OpenVPN image est préconfiguré et inclut toutes les dépendances nécessaires pour exécuter le serveur dans un environnement sain et stable. Les scripts sont inclus pour automatiser de manière significative le cas d’utilisation standard, tout en permettant une configuration manuelle complète si vous le souhaitez. Un conteneur de volumes Docker est utilisé pour stocker également la configuration et les données de certificat EasyRSA PKI.

Docker Registry est un référentiel central pour les images Docker développées par les utilisateurs et par les utilisateurs. L’image utilisée dans ce didacticiel est une image fournie par l’utilisateur disponible à l’adresse kylemanna/openvpn. L’image est assemblée sur les serveurs de construction en nuage de Docker Registry à l’aide de la source du référentiel GitHub. La version du serveur cloud associée à Github permet d’auditer l’image Docker afin que les utilisateurs puissent consulter le fichier source Docker et le code associé, appelé http://blog.docker.com/2013/11/introducing-trusted-builds/ [ Construction de confiance]. Lorsque le code est mis à jour dans le référentiel GitHub, une nouvelle image Docker est créée et publiée sur le registre Docker.

Exemples d’utilisation

  • Routage sécurisé vers Internet lorsque vous êtes sur un réseau public non sécurisé (WiFi)

  • Réseau privé pour connecter un ordinateur portable, un ordinateur de bureau, un ordinateur à la maison ou un téléphone portable

  • Réseau privé pour des services sécurisés derrière des routeurs NAT qui n’ont pas de capacité de traversée NAT

Buts

  • Configurer le démon Docker sur Ubuntu 14.04 LTS

  • Configurez un conteneur de volume Docker pour contenir les données de configuration.

  • Générer une autorité de certification EasyRSA PKI

  • Extraire les fichiers de configuration client générés automatiquement

  • Configurer un nombre sélectionné de clients OpenVPN

  • Gestion du démarrage du conteneur Docker au démarrage

  • Introduire des sujets avancés

Conditions préalables

  • Connaissance du shell Linux. Ce guide suppose en grande partie que l’utilisateur est capable de configurer et d’exécuter des démons Linux au sens traditionnel du terme.

  • Accès racine sur un serveur distant

  • Un DigitalOcean 1 CPU / 512 Mo de RAM RAM exécutant Ubuntu 14.04 est supposé pour ce didacticiel. Docker facilite l’exécution de l’image sur n’importe quelle distribution Linux hôte

  • Tout hôte virtuel fonctionnera tant qu’il utilisera la technologie de virtualisation QEMU / KVM ou Xen. * OpenVZ ne fonctionnera pas *

  • Vous aurez besoin d’un accès root sur le serveur. Ce guide suppose que l’utilisateur s’exécute en tant qu’utilisateur non privilégié avec sudo activé. Consultez le tutoriel Digital Ocean sur la gestion des utilisateurs sous Ubuntu 14.04 si besoin

  • Un périphérique client local tel qu’un téléphone, un ordinateur portable ou un PC Android. Presque tous les systèmes d’exploitation sont supportés via différents clients OpenVPN

Étape 1 - Configurer et tester Docker

Docker évolue rapidement et la politique de support à long terme (LTS) d’Ubuntu ne suit pas. Pour contourner ce problème, nous allons installer un PPA qui nous fournira la dernière version de Docker.

Ajoutez la clé de signature du package de référentiel Docker en amont. La commande + apt-key + utilise des privilèges élevés via + sudo +, de sorte qu’une invite de mot de passe pour le mot de passe de l’utilisateur peut apparaître:

curl -L https://get.docker.com/gpg | sudo apt-key add -
  • Remarque: * Entrez votre mot de passe sudo sur le curseur clignotant si nécessaire.

Ajoutez le référentiel Docker en amont à la liste des systèmes:

echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list

Mettez à jour la liste des packages et installez le package Docker:

sudo apt-get update && sudo apt-get install -y lxc-docker

Ajoutez votre utilisateur au groupe + docker + pour activer la communication avec le démon Docker en tant qu’utilisateur normal, où ++ est votre nom d’utilisateur. * Quittez et reconnectez-vous pour que le nouveau groupe prenne effet *:

sudo usermod -aG docker

Après * vous reconnecter *, vérifiez l’appartenance au groupe à l’aide de la commande + id +. La réponse attendue devrait inclure + docker + comme dans l’exemple suivant:

uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)

Facultatif: Exécutez + bash + dans une image simple de Docker Debian (+ - rm + pour nettoyer le conteneur après la sortie et + -it + pour interactive) pour vérifier le fonctionnement de Docker sur l’hôte:

docker run --rm -it debian:jessie bash -l

Réponse attendue du menu fixe lorsqu’il récupère les images et configure le conteneur:

Unable to find image 'debian:jessie' locally
debian:jessie: The image you are pulling has been verified
511136ea3c5a: Pull complete
36fd425d7d8a: Pull complete
aaabd2b41e22: Pull complete
Status: Downloaded newer image for debian:jessie
root@de8ffd8f82f6:/#

Une fois à l’intérieur du conteneur, vous verrez l’invite + root @: / # + indiquant que le shell actuel se trouve dans un conteneur Docker. Pour vérifier qu’il est différent de l’hôte, vérifiez la version de Debian exécutée dans le conteneur:

cat /etc/issue.net

Réponse attendue pour le conteneur OpenVPN au moment de la rédaction:

Debian GNU/Linux jessie/sid

Si vous voyez une version différente de Debian, c’est très bien.

Quittez le conteneur en tapant + logout + et l’invite de l’hôte devrait apparaître à nouveau.

Étape 2 - Configuration du magasin de certificats Easy RSA PKI

Cette étape est généralement un casse-tête pour ceux qui connaissent OpenVPN ou tout service utilisant une infrastructure à clé publique. Heureusement, Docker et les scripts de l’image Docker simplifient cette étape en générant des fichiers de configuration et tous les fichiers de certificat nécessaires.

Créez un conteneur de volume. Ce tutoriel utilisera la variable d’environnement ++ pour le rendre copiable et facile à coller. Définissez ceci comme bon vous semble. La valeur par défaut + ovpn-data + est recommandée pour les serveurs de conteneur OpenVPN Docker uniques. La définition de la variable dans le shell utilise la substitution de chaîne pour éviter à l’utilisateur de la remplacer manuellement à chaque étape du didacticiel:

="ovpn-data"

Créez un conteneur de volume Docker vide en utilisant + busybox + comme image Docker minimale:

docker run --name  -v /etc/openvpn busybox

Initialisez le conteneur ` qui contiendra les fichiers de configuration et les certificats, et remplacez ` par votre nom de domaine complet. La valeur ++ doit être le nom de domaine complet que vous utilisez pour communiquer avec le serveur. Cela suppose que les DNS paramètres sont déjà configurés. Sinon, il est possible d’utiliser uniquement l’adresse IP du serveur, mais cela n’est pas recommandé.

docker run --volumes-from  --rm kylemanna/openvpn ovpn_genconfig -u udp://:1194

Générez l’autorité de certification EasyRSA PKI. Vous serez invité à entrer une phrase secrète pour la clé privée de l’autorité de certification. Choisissez-en un bon et souvenez-vous en; sans mot de passe, il sera impossible d’émettre et de signer des certificats clients:

docker run --volumes-from  --rm -it kylemanna/openvpn ovpn_initpki
  • Remarque: la sécurité du conteneur ++ est importante. * Il contient toutes les clés privées pour emprunter l’identité du serveur et tous les certificats clients. Gardez cela à l’esprit et contrôlez l’accès, le cas échéant. Les scripts OpenVPN par défaut utilisent une phrase secrète pour la clé de l’autorité de certification afin d’accroître la sécurité et d’empêcher l’émission de faux certificats.

Voir la * Conclusion * ci-dessous pour plus de détails sur la sauvegarde du magasin de certificats.

Étape 3 - Lancez le serveur OpenVPN

Pour démarrer automatiquement le conteneur Docker qui exécute le processus de serveur OpenVPN (voir Docker Host Integration pour plus d’informations), créez un https://www.digitalocean.com/community/tutorials / the-upstart-event-system-Qu’est-ce-que-est-et-comment-l’utiliser-it [Upstart] Le fichier d’initialisation utilisant + nano + ou + vim +:

sudo vim /etc/init/docker-openvpn.conf

Contenu à placer dans + / etc / init / docker-openvpn.conf +:

description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
 exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script

Démarrez le processus à l’aide du mécanisme d’initialisation Upstart

sudo start docker-openvpn

Vérifiez que le conteneur a démarré et ne s’est pas immédiatement écrasé en consultant la colonne + STATUS:

test0@tutorial0:~$ docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
c3ca41324e1d        kylemanna/openvpn:latest   "ovpn_run"          2 seconds ago       Up 2 seconds        0.0.0.0:1194->1194/udp   focused_mestorf

Étape 4 - Générer des certificats clients et des fichiers de configuration

Dans cette section, nous allons créer un certificat client à l’aide de l’autorité de certification PKI créée à la dernière étape.

Assurez-vous de remplacer ++ selon les besoins (cela ne doit pas nécessairement être un nom de domaine complet). Le nom du client est utilisé pour identifier la machine sur laquelle le client OpenVPN est exécuté (par exemple, «ordinateur portable à domicile», «ordinateur portable de travail», «nexus5», etc.).

L’outil + easyrsa + demandera le mot de passe de l’autorité de certification. C’est le mot de passe que nous avons défini ci-dessus lors de la commande + ovpn_initpki +. Créez le certificat client:

docker run --volumes-from  --rm -it kylemanna/openvpn easyrsa build-client-full  nopass

Une fois chaque client créé, le serveur est prêt à accepter les connexions.

Les clients ont besoin des certificats et d’un fichier de configuration pour se connecter. Les scripts intégrés automatisent cette tâche et permettent à l’utilisateur d’écrire une configuration dans un fichier unique pouvant ensuite être transféré sur le client. Encore une fois, remplacez ++ selon le cas:

docker run --volumes-from  --rm kylemanna/openvpn ovpn_getclient  > .ovpn

Le fichier + .ovpn + résultant contient les clés privées et les certificats nécessaires pour se connecter au VPN. * Conservez ces fichiers en lieu sûr et non trafiqué. * Vous devrez transporter en toute sécurité les fichiers + *. Ovpn + vers les clients qui les utiliseront. Évitez autant que possible d’utiliser des services publics tels que la messagerie ou le stockage en nuage lors du transfert des fichiers pour des raisons de sécurité.

Les méthodes de transfert recommandées sont les cartes ssh / scp, HTTPS, USB et microSD, le cas échéant.

Étape 5 - Configurer les clients OpenVPN

Vous trouverez ci-après des commandes ou des opérations exécutées sur les clients qui se connecteront au serveur OpenVPN configuré ci-dessus.

Distributions Ubuntu et Debian via OpenVPN natif

Sur Ubuntu 12.04 / 14.04 et clients Debian Wheezy / jessie (et similaires):

Installez OpenVPN:

sudo apt-get install openvpn

Copiez le fichier de configuration du client à partir du serveur et définissez les autorisations sécurisées:

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

Configurez les scripts init pour lancer automatiquement toutes les configurations correspondant à + ​​/ etc / openvpn / *. Conf +:

echo AUTOSTART=all | sudo tee -a /etc/default/openvpn

Redémarrez le processus serveur du client OpenVPN:

sudo /etc/init.d/openvpn restart

Arch Linux via OpenVPN natif

Installez OpenVPN:

pacman -Sy openvpn

Copiez le fichier de configuration du client à partir du serveur et définissez les autorisations sécurisées:

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

Démarrez le processus serveur du client OpenVPN:

systemctl start openvpn@

Facultatif: configurez systemd pour qu’il lance + / etc / openvpn / .conf + au démarrage:

systemctl enable openvpn@

MacOS X via TunnelBlick

Téléchargez et installez TunnelBlick.

Copiez + .ovpn + du serveur vers le Mac.

Importez la configuration en double-cliquant sur le fichier + *. Ovpn + précédemment copié. TunnelBlick sera appelé et importera la configuration.

Ouvrez TunnelBlick, sélectionnez la configuration, puis sélectionnez * connect *.

Android via OpenVPN Connect

Installez l’application OpenVPN Connect à partir du magasin Google Play.

Copiez + .ovpn + du serveur vers le périphérique Android de manière sécurisée. Les cartes USB ou microSD sont plus sûres. Placez le fichier sur votre carte SD pour faciliter son ouverture.

Importer la configuration: * Menu * → * Importer * → * Importer un profil depuis une carte SD *

Sélectionnez * Connect *.

Étape 6 - Vérification du fonctionnement

Il existe plusieurs moyens de vérifier que le trafic est en cours d’acheminement via le VPN.

Navigateur Web

Visitez un site Web pour déterminer l’adresse IP externe. L’adresse IP externe doit être celle du serveur OpenVPN.

Essayez Google «what is my ip» ou https://icanhazip.com [icanhazip.com].

Ligne de commande

En ligne de commande, + wget + ou + curl + sont utiles. Exemple avec + curl +:

curl icanhazip.com

Exemple avec + wget +:

wget -qO - icanhazip.com

La réponse attendue devrait être l’adresse IP du serveur OpenVPN.

Une autre option consiste à effectuer une recherche DNS spéciale sur un serveur DNS spécialement configuré à cette fin, en utilisant + host + ou + dig +. Exemple utilisant + host +:

host -t A myip.opendns.com resolver1.opendns.com

Exemple avec + dig +:

dig +short myip.opendns.com @resolver1.opendns.com

La réponse attendue devrait être l’adresse IP du serveur OpenVPN.

Extra choses à vérifier

Passez en revue la configuration de votre interface réseau. Sur les systèmes d’exploitation Unix, cela est aussi simple que d’exécuter + ifconfig + dans un terminal et de rechercher l’interface + tunX + d’OpenVPN lorsqu’il est connecté.

Consultez les journaux. Sur les systèmes Unix, vérifiez + / var / log + sur les anciennes distributions ou + journalctl + sur les distributions systemd.

Conclusion

L’image Docker conçue pour fonctionner est open source et peut produire bien plus que ce qui est décrit ici.

Le référentiel source docker-openvpn est disponible pour la révision du code ainsi que pour la modification. Les demandes d’extraction de fonctionnalités générales ou de corrections de bugs sont les bienvenues.

Des rubriques avancées telles que * sauvegarde * et * adresses IP de clients statiques * sont traitées dans le dossier docker-openvpn/docs.

Signalez les bogues au docker-openvpn question tracker.