Installer Wireguard avec Docker
Au sommaire :
- 1-Qu'est-ce que Wireguard ?
- 2-Prérequis
- 3-Déploiement du conteneur
- 4-Connexion avec un smartphone
- 5-Connexion avec un poste client
1-Qu'est-ce que Wireguard ?
Wireguard est un nouveau protocole de communication qui a la particularité d'être plus rapide que OpenVPN et IPsec.
Il est intégré au noyau Linux depuis mars 2020 (version 5.6) et fonctionne dans l'espace noyau (kernel space) contrairement à OpenVPN et IPSec qui fonctionnent dans l'espace utilisateur (user space).
«Puis-je encore exprimer mon amour pour lui et espérer qu'il fusionnera bientôt? Le code n'est peut-être pas parfait, mais je l'ai parcouru et comparé aux horreurs d'OpenVPN et d'IPSec, c'est une œuvre d'art », a déclaré Linus Torvald à propos de WireGuard.
Je vous conseille de lire cet excellent article du site Clubic à son sujet.
Wireguard est clairement l'une de mes applications favorites. Depuis que je le fais tourner dans un conteneur LXC, je peux accéder à mes services de n'importe où dans le monde avec une très faible latence.
J'ai déjà consacrer un tutoriel à ce sujet pour ceux que ça intéresse.
2-Prérequis
Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.
Voici le guide pour ceux qui veulent repartir de zéro.
Si vous voulez gagner du temps, utilisez un template cloud-init.
Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.
Enfin, il vous faudra également soit :
- Un smartphone (Android ou Iphone) pour la partie 4
- Un client sous Ubuntu pour la partie 5
3-Déploiement du conteneur
Commencez par créer un dossier "docker" à la racine du dossier utilisateur"
mkdir -p ~/docker
Créez un fichier nommé "compose.yml"
touch ~/docker/compose.yml
Ouvrez le fichier "compose.yml" et copiez cette configuration.
version: "3.7"
networks:
default:
driver: bridge
services:
wireguard:
image: lscr.io/linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
PUID: ${PUID}
PGID: ${PGID}
TZ: ${TZ}
SERVERURL: domaine name or ip_address #optional
SERVERPORT: 51820 #optional
PEERS: 1 #optional
PEERDNS: auto
INTERNAL_SUBNET: 192.168.0.254/24 #optional
volumes:
- ${APPDATA}/wireguard:/config
- /lib/modules:/lib/modules
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
- version : 3.7 (il y a plus récent mais c'est pour l'exemple)
- network : en bridge (l'adresse IP sera celle de la machine virtuelle ou du conteneur LXC)
- services : c'est là qu'il faudra ajouter les configurations de vos conteneurs
- image : nom du registry suivi du nom de l'application (lscr.io/linuxserver/emulatorjs)
- container_name : le nom du conteneur, sinon Docker en choisira un de manière aléatoire (mieux vaut le nommer vous même)
- cap_add : ajoute des capacités supplémentaires au conteneur. "net_admin" permet d’interagir avec la pile réseau et "sys_module" permet d'accéder aux modules noyau du système hôte
- environment : il y a les variables de base (PUID, PGID, TZ), SERVERURL (nom de domaine ou adresse IP publique de votre box internet), SERVERPORT (numéro de port du conteneur), PEERS (nombre d'utilisateurs, 1 par défaut), PEERDNS (sur auto, récupérera le DNS du système hôte) et INTERNAL_SUBNET (pour permettre d'accéder à votre réseau local, 192.168.0.254/24 pour ma part)
- volumes : variable ${APPDATA) (/home/user_name/appdata) suivi du nom de l'application (/wireguard) et le dossier "modules" qui permet au conteneur d'accéder aux modules noyau de la machine virtuelle
- ports : port UDP 51820 qu'il vous faudra ouvrir dans l'interface web de votre box internet
- sysctls : sysctl permet de modifier plusieurs centaines de paramètres du noyau Linux. Il faut activer le paramètre "net.ipv4.conf.all.src_valid_mark" pour que le routage sois correct (peu d'informations sur internet)
- restart : unless-stopped par défaut. Le daemon de Docker redémarrera automatiquement le conteneur sauf si vous l’arrêtez, il faudra le démarrer manuellement
Enregistrez le fichier "compose.yml" et déployez le conteneur.
docker compose up -d
Je le répète mais pensez bien à ouvrir le port UDP 51820 de votre box internet.
Si vous avez une Livebox comme moi, vous aurez une adresse IP dynamique donc vous l'avez dans l'os.
La solution est de :
- Créer un nom de domaine (OVH par exemple),
- Créer un sous nom de domaine pour Wireguard avec un compte Dynhost
- Ajouter le compte Dynhost dans les paramètres de la Livebox pour que l'adresse IP publique sois mise à jour
4-Connexion avec un smartphone
Exécutez la commande suivante qui vous permettra de récupérer le QR Code et de le scanner via votre smartphone Iphone ou Android (l'application est disponible sur le Play Store et le Apple Store).
docker exec -it wireguard /app/show-peer 1
5-Connexion avec un poste client
Allez dans le dossier de l'application. Vu que je stocke mes applications dans le dossier "appdata", ça se présente ainsi.
cd /appdata/wireguard/peer1
Copiez le fichier sur votre poste avec la commande "scp" (copie de fichiers à travers le protocole SSH).
scp -p peer1.conf user_name@ip_address:\home\user_name
Installez le client Wireguard sur votre poste.
sudo apt install wireguard -y
Et copiez le fichier dans "/etc/wireguard".
sudo cp peer1.conf /etc/wireguard
Enfin, exécutez la commande "wg-quick" pour vous connecté au VPN.
- up est pour vous connecté (down pour vous déconnecté)
- wg0 est l'interface réseau du VPN (wireguard0)
wg-quick up wg0
Sources :