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.

VPN : mais pourquoi tout le monde ne parle que de Wireguard ?
Si vous suivez de prêt ou de loin le petit monde du VPN, vous n’êtes sûrement pas étranger à ce nom : WireGuard. Il est en effet le dernier protocole à la mode chez les amateurs de tunnels chiffrés. Mais pourquoi une telle popularité ? Comment expliquer que tous les éditeurs adoptent ce petit nouvea…

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.

Installer Wireguard avec LXC
Guide d’installation de Wireguard dans un conteneur LXC

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.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Si vous voulez gagner du temps, utilisez un template cloud-init.

Initialiser vos machines virtuelles avec Cloud-init sur Proxmox VE
Guide d’installation de Cloud-Init qui va vous permettre d’automatiser vos déploiements

Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.

Installer Docker
Guide d’installation de Docker.

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
Paramétrer un DNS dynamique pour son nom de domaine
Apprenez à paramétrer un enregistrement DNS dynamique (DynHost) pour votre nom de domaine OVHcloud

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
How to configure a WireGuard iOS client - Server Side Up
This is a continuation of my free “mini-course” called Gain Flexibility & Increase Privacy with WireGuard VPN. Start there if you are new to WireGuard. What you’ll achieve We will have our iPhone client connecting to our WireGuard VPN server This is what it looks like: Prerequisites You need a worki…

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 :

Docker