💡 TL;DR
- WireGuard est un VPN moderne, léger et rapide qui remplace avantageusement OpenVPN dans ton homelab
- Tu le déploies en 3 minutes avec Docker Compose et l’image
linuxserver/wireguard- Un fichier de config de 10 lignes suffit, contre des centaines pour OpenVPN
- Cryptographie moderne (Curve25519, ChaCha20), performances supérieures, batterie préservée sur mobile
- Docker Compose complet, tableau comparatif WireGuard vs OpenVPN et checklist sécurité inclus ci-dessous
Table des matières
Table des matières
Pourquoi un VPN dans ton homelab ?
Tu as monté ton homelab. Nextcloud, Vaultwarden, Homer, tout tourne sur ton serveur derrière ta box Internet. Sauf que quand tu sors de chez toi, plus rien. Tu veux consulter ton gestionnaire de mots de passe depuis un café, synchroniser tes fichiers depuis le train, ou juste accéder à ton tableau de bord homelab sans ouvrir des ports à tout internet.
La solution classique, c’est d’ouvrir un port sur ta box et d’exposer tes services directement. Mauvaise idée. Tu te retrouves avec des scanners automatiques qui cognent à ta porte toutes les 30 secondes, des bots qui testent des credentials, et une surface d’attaque qui grandit chaque fois que tu ajoutes un service. Si tu as déjà lu mon guide Fail2Ban Docker, tu sais que les tentatives de brute-force sont incessantes.
Un VPN résout ce problème de façon élégante. Tu crées un tunnel chiffré entre ton appareil (téléphone, laptop, tablette) et ton serveur. Une fois connecté, tu es “virtuellement” chez toi. Tes services restent derrière ton firewall, invisibles du web. Seuls les appareils authentifiés peuvent entrer. C’est la différence entre laisser ta porte d’entrée grande ouverte et avoir un interphone avec badge.
Et quand tu parles de VPN simple, rapide et moderne, tu parles de WireGuard.
WireGuard, c’est quoi exactement ?
WireGuard est un protocole VPN open-source créé en 2016 par Jason A. Donenfeld. Il a été intégré au kernel Linux en 2020 et est désormais considéré comme l’état de l’art en matière de VPN. Contrairement à OpenVPN ou IPsec, WireGuard repose sur une philosophie radicale : moins de code, moins de configuration, plus de sécurité.
Le code fait environ 4 000 lignes. OpenVPN en fait plus de 400 000 avec OpenSSL. Moins de code signifie moins de bugs, moins de vulnérabilités, et une auditabilité réaliste. WireGuard utilise des primitives cryptographiques modernes et éprouvées : Curve25519 pour l’échange de clés, ChaCha20 pour le chiffrement, Poly1305 pour l’authentification, et BLAKE2s pour le hachage. Pas de choix d’algorithme à la configuration, pas de cipher suites obsolètes à désactiver.
Côté réseau, WireGuard est un VPN de couche 3 (IP) plutôt que couche 2 ou couche applicative. Chaque pair (peer) possède une clé publique qui l’identifie. Pas de certificats X.509, pas d’infrastructure PKI, pas de handshake TLS compliqué. Tu génères une paire de clés, tu échanges les clés publiques entre serveur et client, et c’est prêt.
Pour l’auto-hébergement, WireGuard est particulièrement pertinent parce qu’il consomme peu de ressources. Sur un Raspberry Pi ou un VPS low-cost, il tourne sans accroc. La batterie de ton téléphone en profite aussi : la latence de handshake réduite et l’absence de keepalive agressif font que WireGuard est plus sobre que OpenVPN sur mobile.
Dans la pratique, pour un homelab Dockerisé, tu vas déployer WireGuard via un conteneur qui gère le serveur et génère les configurations clients automatiquement. Pas besoin d’installer un serveur Debian complet avec wg-quick et des scripts shell. Un fichier docker-compose.yml bien conçu suffit pour ton setup wireguard docker.
WireGuard Docker vs OpenVPN : le comparatif technique
| Critère | WireGuard | OpenVPN |
|---|---|---|
| Taille du code | ~4 000 lignes (kernel) | ~400 000+ lignes (avec OpenSSL) |
| Cryptographie | Curve25519, ChaCha20, Poly1305 | Configurable (souvent AES-256-CBC/GCM) |
| Performance | 3-4× plus rapide | Bonne, mais surcharge protocolaire |
| Latence handshake | Quasi instantané | TLS handshake multi-RTT |
| Configuration | Clé publique/privée, 10 lignes | Certificats X.509, fichiers de 200+ lignes |
| Mobilité (roaming) | Gérée nativement | Reconnexion lente au changement de réseau |
| Consommation batterie | Faible (mobile) | Élevée (keepalive fréquents) |
| Auditabilité | Possible et réalisée | Quasi impossible à cause de la taille |
| Support NAT/firewall | UDP hole punching intégré | TCP/UDP, plus complexe à travers NAT |
| Maturité | Stable, intégré kernel Linux | Très mature, très éprouvé |
| Complexité déploiement | Très faible | Moyenne à élevée |
Verdict : pour un homelab personnel, WireGuard est le choix par défaut. OpenVPN reste pertinent dans des contextes d’entreprise où la conformité FIPS ou l’intégration avec des PKI existantes est obligatoire. Pour toi et tes appareils, WireGuard est plus rapide à déployer, plus rapide à l’exécution, et plus simple à auditer.
Prérequis
Avant de lancer ton conteneur WireGuard, vérifie ces quelques points :
- Un serveur Docker fonctionnel (si ce n’est pas encore fait, mon guide Docker Compose pour débutants t’explique comment monter ta stack)
- Un port UDP ouvert sur ta box/routeur, redirigé vers ton serveur (par défaut 51820/UDP)
- Les modules kernel WireGuard présents (inclus dans les kernels Linux modernes, vérifier avec
modprobe wireguard) - Un nom de domaine (optionnel mais recommandé pour éviter de taper une IP dynamique)
- Docker et Docker Compose installés sur le serveur
- Un minimum de 512 Mo de RAM et quelques Mo d’espace disque
Conseil : si tu utilises un VPS cloud, vérifie que ton hébergeur autorise le trafic UDP entrant. Certains free tiers ou environnements restrictifs bloquent les ports UDP non standards.
Docker Compose complet pour ton VPN WireGuard
Voici le fichier docker-compose.yml prêt à l’emploi. Il utilise l’image linuxserver/wireguard, maintenue activement, avec la génération automatique des configurations clients. C’est le cœur de ton déploiement wireguard docker.
version: "3.8"
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- SERVERURL=vpn.tondomaine.com # ou ton IP publique
- SERVERPORT=51820
- PEERS=phone,laptop,tablette # noms des clients
- PEERDNS=1.1.1.1,9.9.9.9 # DNS Cloudflare + Quad9
- INTERNAL_SUBNET=10.13.13.0
- ALLOWEDIPS=0.0.0.0/0 # tunnel tout le trafic
- PERSISTENTKEEPALIVE=25
- LOG_CONFS=true # génère les QR codes et fichiers de conf
volumes:
- ./wireguard/config:/config
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp"
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
Points importants :
cap_add: NET_ADMINest obligatoire pour que le conteneur puisse créer l’interface réseau tunnel.SYS_MODULEet le volume/lib/modulespermettent au conteneur d’accéder aux modules kernel WireGuard.SERVERURLdoit être ton IP publique ou un nom de domaine pointant vers ton serveur.PEERSdéfinit le nombre et les noms des clients. Change les noms ou ajoute-en autant que tu veux.ALLOWEDIPS=0.0.0.0/0route tout le trafic internet via le VPN. Si tu veux seulement accéder au réseau local, remplace par10.13.13.0/24,192.168.1.0/24(adapte selon ton LAN).PERSISTENTKEEPALIVE=25envoie un paquet toutes les 25 secondes pour maintenir le tunnel ouvert derrière un NAT strict.
Lance la stack :
cd /chemin/vers/wireguard
docker compose up -d
Le premier démarrage génère les clés du serveur et les configurations pour chaque peer. Les fichiers .conf et les QR codes sont disponibles dans ./wireguard/config/.
Si tu débutes avec Docker Compose, ce fichier s’intègre parfaitement dans une stack plus large. Tu peux l’ajouter à ton docker-compose.yml principal ou le garder isolé. Pour organiser proprement tes services, jette un œil à mon guide Docker Compose pour débutants.
Configuration pas à pas
Étape 1 : Créer le dossier et le fichier Compose
mkdir -p ~/docker/wireguard
cd ~/docker/wireguard
Copie le docker-compose.yml ci-dessus dans ce dossier.
Étape 2 : Adapter les variables
Modifie au minimum :
SERVERURL: ton nom de domaine ou IP publiqueTZ: ton fuseau horaire (Europe/Paris,Europe/Brussels, etc.)PEERS: les noms des appareils que tu veux connecterPEERDNS: les DNS que tu veux utiliser (Cloudflare1.1.1.1et Quad99.9.9.9sont des choix sains)
Étape 3 : Ouvrir le port sur ta box
Redirige le port UDP 51820 de ta box/routeur vers l’IP locale de ton serveur Docker. La procédure varie selon les modèles (Freebox, Livebox, Bbox, etc.), mais elle se trouve généralement dans les paramètres “Redirection de ports” ou “NAT/PAT”.
Étape 4 : Lancer le conteneur
docker compose up -d
docker logs -f wireguard
Les premiers logs montrent la génération des clés et des configs. Attends la fin du setup avant de passer à l’étape suivante.
Étape 5 : Vérifier le serveur
docker exec -it wireguard wg show
Tu dois voir l’interface wg0 avec la clé publique du serveur et la liste des peers configurés (sans handshake pour l’instant, c’est normal).
Générer les clients
Les configurations clients sont générées automatiquement au premier démarrage. Tu les trouves dans le volume monté :
ls ~/docker/wireguard/config/peer_*/
Chaque dossier peer_NOM contient :
peer_NOM.conf: fichier de configuration WireGuardpeer_NOM.png: QR code scannable avec l’app mobile WireGuard
Sur mobile (iOS/Android)
- Installe l’application WireGuard depuis l’App Store ou Google Play
- Appuie sur le
+en bas à droite - Choisis “Créer depuis le QR code”
- Scanne le PNG affiché sur ton écran (ou transfère-le sur ton téléphone)
- Active le tunnel
Sur ordinateur (Windows/macOS/Linux)
- Installe le client WireGuard officiel
- Importe le fichier
.conf - Active le tunnel
Pour ajouter un nouveau client
Tu peux modifier la variable PEERS en ajoutant un nouveau nom, puis relancer :
docker compose down
# édite le docker-compose.yml pour ajouter le nouveau peer
docker compose up -d
Le conteneur génère automatiquement la nouvelle configuration sans toucher aux peers existants.
Sécuriser ton tunnel VPN
Un VPN mal configuré est un risque. Voici la checklist des points à valider :
- Changer le port par défaut : 51820 est connu des scanners. Si tu veux réduire le bruit, utilise un port non standard (> 50000) et adapte la redirection.
- Restreindre ALLOWEDIPS : si tu n’as pas besoin de router tout ton trafic internet par le VPN, limite aux IPs de ton homelab. Ça réduit la charge et évite de surconsommer la bande passante.
- Mettre à jour l’image régulièrement :
docker compose pull && docker compose up -dpour récupérer les patches kernel et les mises à jour de l’image. - Activer l’authentification à deux facteurs sur tous les services accessibles via le VPN. Le VPN sécurise l’accès réseau, pas l’application elle-même.
- Surveiller les connexions : utilise un outil de monitoring pour t’assurer que ton serveur WireGuard reste accessible. Uptime Kuma peut monitorer un port UDP ou un healthcheck HTTP si tu exposes un service derrière.
- Limiter les peers : chaque peer est un vecteur d’attaque potentiel. Supprime les configs des appareils que tu n’utilises plus.
- Bloquer les IPs malveillantes : couple WireGuard avec un firewall (UFW, iptables) et un outil comme Fail2Ban pour bloquer les scanners sur tes autres services.
- Utiliser des DNS filtrants :
PEERDNS=1.1.1.1est bien, mais tu peux aussi utiliser ton propre AdGuard Home pour bloquer les trackers et pubs au niveau DNS. - Ne pas exposer le port de gestion Docker : le port 2375/2376 ne doit jamais être accessible depuis l’extérieur. Le VPN ne rend pas cette exposition acceptable.
Rotation des clés
WireGuard n’a pas de mécanisme automatique de rotation de clés. Il est recommandé de régénérer les paires de clés tous les 6 à 12 mois. Pour cela :
docker compose down
rm -rf ~/docker/wireguard/config/peer_*
docker compose up -d
Puis réimporte les nouveaux fichiers .conf sur tes appareils. C’est un peu fastidieux mais cela garantit que d’anciennes clés compromises ne restent pas actives indéfiniment.
Dépannage courant
Le tunnel ne s’établit pas (handshake échoue)
- Vérifie que le port UDP est bien redirigé sur ta box et non bloqué par un firewall
- Confirme que
SERVERURLcorrespond bien à ton IP publique ou ton domaine - Vérifie que les clés publiques sont bien échangées (
docker exec wireguard wg showdoit lister les peers) - Assure-toi que le client utilise bien le port UDP correspondant
- Teste depuis un autre réseau (4G) pour écarter un problème de firewall local
Pas d’accès Internet quand le tunnel est actif
- Vérifie le paramètre
ALLOWEDIPS.0.0.0.0/0route tout le trafic. Si tu veux seulement accéder au LAN, remplace par10.13.13.0/24,192.168.1.0/24. - Vérifie l’IP forwarding sur le serveur hôte :
Si c’estsudo sysctl net.ipv4.ip_forward0, active-le :echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf sudo sysctl --system - Vérifie que le conteneur a bien les capabilities
NET_ADMINetSYS_MODULE
Le client mobile se déconnecte constamment
Augmente PERSISTENTKEEPALIVE (par exemple à 25) ou baisse-le selon ta consommation de batterie. Si tu es derrière un NAT strict (opérateur mobile), ce keepalive est essentiel pour maintenir le mapping NAT actif.
”Unable to access interface: Operation not permitted”
Le conteneur n’a pas les capabilities nécessaires. Vérifie que cap_add contient bien NET_ADMIN et SYS_MODULE, et que Docker est exécuté sur un kernel avec les modules WireGuard chargés (lsmod | grep wireguard).
Les DNS ne répondent pas
Vérifie que PEERDNS est correctement défini. Si tu utilises un DNS local (comme AdGuard Home ou Pi-hole), assure-toi que son IP est accessible depuis le sous-réseau WireGuard (10.13.13.0/24).
Conclusion
WireGuard est ce que le VPN aurait dû être depuis le début : simple, rapide, sécurisé et sans bullshit. En le containerisant avec Docker, tu ajoutes un élément essentiel à la sécurité de ton homelab sans multiplier la complexité. Plus besoin d’OpenVPN avec ses certificats, ses fichiers de configuration kilométriques et sa consommation énergétique sur mobile.
Avec le docker-compose.yml ci-dessus, tu as un serveur WireGuard fonctionnel en quelques minutes. Chaque nouveau client est une ligne dans PEERS et un QR code à scanner. C’est la simplicité même pour déployer un tunnel vpn docker sécurisé.
Une fois ton VPN en place, tu peux commencer à exposer tes services de manière plus intelligente. Si tu veux un reverse proxy simple et efficace pour tes applications web, Caddy Docker gère automatiquement les certificats HTTPS. Si tu préfères une interface graphique point-and-click, Nginx Proxy Manager est une excellente alternative. Et n’oublie pas de monitorer l’accessibilité de ton tunnel avec Uptime Kuma. Bon tunneling.