Wireguard
Wireguard est un logiciel libre permettant de créer un VPN(Virtual Private Network). Sa mise en place est très simple surtout dans le cadre de l'utilisation avec Docker. On peut trouver un article sur ce logiciel sur linuxfr.org et un tuto est disponible ici
Création d'un VPN
Prérequis
- Avoir au moins 2 ordinateurs
- L'un d'entre eux doit disposer d'une adresse ip fixe et vous devez être capable d'ouvrir un port sur celui ci
- Installer Docker
- L'image Docker de Wireguard
Mise en place du serveur
Bien que la page de dockerhub fournisse des informations, vous trouverez plus de détails sur le github de l'image et notamment une configuration par défaut utilisable avec docker-compose, ainsi que le descriptif de chaque option. Celles auxquelles il faudra prêter attention sont :
- SERVERURL qui est l'adresse à laquelle sera joignable le serveur, pour éviter les problèmes il est donc nécessaire qu'elle soit fixe.
- SERVERPORT qui est le port auquel le ou les clients viendront se connecter, il faut donc qu'il soit accessible depuis l'extérieur.
- PEERS qui est le nombre de client que l'ont veut autoriser.
Une fois ces paramètres réglés, le conteneur peut être démarré avec docker-compose et le serveur wireguard sera opérationnel.
Connexion du ou des clients
En regardant dans le dossier de configuration du serveur, vous y verrez un dossier peer1, qui contient un fichier peer1.conf. Il s'agit là du fichier de configuration à fournir au client numéro 1 pour pouvoir se connecter au VPN. Il doit reprendre une partie des paramètres vu plus haut, comme l'adresse du serveur (variable Endpoint), le port, l'adresse ip utilisé sur le VPN etc ... Il suffit alors de copier ce fichier sur le client, de spécifier correctement les volumes pour que ce fichier arrive dans le dossier /config du conteneur et de lancer docker-compose.
Dans la configuration par défaut, la variable ALLOWEDIPS à la valeur : 0.0.0.0/0, ce qui signifie qu'absolument tout le trafique réseau sera redirigé à travers le VPN. C'est généralement ce qu'on veut, mais cela peut poser quelques problèmes si le client accède à d'autres services sur son réseau local physique.
Problèmes rencontrés
Connexion SSH
Un de mes objectif était de pouvoir créer le réseau suivant :
ordi externe => Serveur VPN => Cient VPN => conteneur SSH
Qui échoua lamentablement dans un premier temps, j'ai donc simplifier le problème en ne gardant que les 2 éléments centraux :
Serveur VPN => Client VPN
Après avoir installé openssh-server dans chacun des conteneurs j'ai tenté une connexion ssh de l'un vers l'autre et surprise ! Du client vers le serveur cela fonctionnait, mais pas dans l'autre sens ... Après avoir passer des heures à éplucher toutes les possibilités (problème de route, problème de règles iptables, etc ...) je suis tombé par hasard sur cette page dans laquelle il est fait mention d'un problème lié au MTU
L'ajout de cette simple ligne dans la configuration de l'interface coté serveur :
MTU=1200
à réglé mon problème !
Si vous êtes face à ce même problème, pensez que si vous utilisez docker pour gérer vos différents services, il est fort probable que vous soyez obligé de régler le MTU des réseaux Docker à la même valeur, voir Docker_réseau#Changer_le_MTU