WireGuard
Introduction
L'utilisation d'un VPN permet d'accéder à distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une manière propre de sécuriser l'accès à la console SSH, plutôt que d'exposer le port sur internet. C'est pouvoir se connecter à son réseau où que l'on soit, de manière sécurisée, et de faire dialoguer des machines qui sont sur des réseaux différents.
Ici nous utiliserons WireGuard, un serveur VPN sécurisé et très performant, à l'aide des conteneurs :
- wg-easy pour le serveur, qui propose une interface web très simple pour contrôler les connexions et télécharger les fichiers de conf (notamment par QR code pour les téléphones)
- WireGuard pour les clients Linux
Il existe aussi des clients Windows, macOS, iOS et Android.
Le principe est le suivant :
- Sur internet, n'importe qui peut contacter n'importe quel box internet et donc essayer de contacter n'importe quel serveur exposé.
- Votre serveur est sur votre réseau local. Il est accessible depuis le réseau local mais pas depuis internet, mis à part les services exposés (comme nous l'avons fait avec Dockge). Pour accéder aux ressources non exposées, vous devez être connecté sur le même réseau que votre serveur et donc être chez vous. De plus, vous devez laisser ouverts les ports utilisés par vos services à travers le pare-feu de votre serveur.
- Nous souhaitons ici au contraire, depuis n'importe où, pouvoir accéder de manière sécurisée aux services non exposés sur internet du serveur, comme la console SSH qui permet de se connecter à la machine par exemple.
- Nous souhaitons aussi accéder aux services d'autres serveurs, et par exemple relier de manière sécurisée deux instances de Dockge pour tout contrôler depuis la même interface.
Pour cela nous allons créer un réseau privé virtuel, ou VPN, c'est-à-dire un tunnel sécurisé auquel personne n'a accès à part les machines que vous relierez entre elles. Elles feront partie d'un nouveau réseau et pourront dialoguer entre elles comme dans un réseau local.
D'autre part, vous pourrez ajouter votre téléphone, un ordinateur portable ou n'importe quel appareil au réseau pour pouvoir utiliser vos ressources depuis vos appareils quotidiens, où que vous soyez.
Dans cette illustration, la machine 1 est sur deux réseaux :
- son réseau local (tous les appareils liés à la box, avec une adresse IP du type
192.168.x.xdonc ici la machine 1 et la machine 2) - le réseau du VPN (tous les appareils reliés au VPN, avec une seconde adresse IP du type
10.8.x.xdonc ici la machine 1 et 4)
On peut aussi faire en sorte que les machines reliées au réseau virtuel partagent les accès à leur réseau local. Ici nous ne le ferons pas, pour des raisons de sécurité, et de complexité en termes de sous-réseau (si les deux machines distantes ont des machines locales qui utilisent la même adresse IP locale, par exemple 192.168.1.1, cela posera des conflits).
Ainsi, sur le réseau virtuel, seules les machines directement reliées pourront dialoguer entre elles depuis ce réseau. Elles ne pourront pas dialoguer avec une machine située sur un autre réseau local et non reliée au VPN.
Côté serveur
- Vérifiez que le port
51820 UDPest libre sur votre serveur et correctement redirigé depuis votre box (51820 UDP -> Serveur). - Vérifiez que le port
51821 TCPest libre pour l'interface web.
Structure des dossiers
- /
- srv
- docker
- wg-easy
- etc_wireguard
- compose.yaml
- .env
- wg-easy
- docker
- srv
Déployer la stack
Ouvrez Dockge, cliquez sur Compose, et nommez la stack wg-easy.
Copiez la configuration suivante :
---
services:
wg-easy:
environment:
- INSECURE=true # désactive le HTTPS propre à l'interface web ; sans risque en LAN seul ou derrière SWAG, à retirer sinon
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
networks:
wg:
ipv4_address: 10.42.42.42
ipv6_address: fdcc:ad94:bacf:61a3::2a
volumes:
- ./etc_wireguard:/etc/wireguard
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv6.conf.all.disable_ipv6=0
- net.ipv6.conf.all.forwarding=1
- net.ipv6.conf.default.forwarding=1
networks:
wg:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 10.42.42.0/24
- subnet: fdcc:ad94:bacf:61a3::/64
- Vous pouvez personnaliser les ports de WireGuard et de l'interface web.
- Ajoutez un label Watchtower pour les mises à jour automatiques :
---
services:
wg-easy:
# ...
labels:
- com.centurylinklabs.watchtower.enable=true
Déployez la stack et accédez à l'interface web locale sur http://ipduserveur:51821.
Créer votre compte
Une fois connecté, suivez les instructions de l'interface web pour :
- Créer votre compte administrateur et son mot de passe.
- Renseigner le champ host (votre IP publique ou votre nom de domaine).
Configurer le tunnel
Allez ensuite dans Administrator → Admin Panel → Config :
- Remplacez
Allowed IPs,0.0.0.0/0par défaut (tunnel complet), par10.8.0.0/24pour du split tunneling. - Retirez éventuellement l'entrée IPv6 de
Allowed IPssi vous ne voulez pas router le trafic IPv6 des clients dans le tunnel. Cela ne change rien à la configuration IPv6 du conteneur ci-dessus, juste à ce que les clients y font transiter.
Terminé !
Récupérer les fichiers de configuration
Pour configurer les clients :
Accéder à l'interface web
Allez sur http://ipduserveur:51821.
Créer un nouveau client
Modifier le client
Ajoutez 10.8.0.0/24 dans Server Allowed IPs.
(Facultatif) Régler le Persistent Keep Alive
Mettez-le à 25 s'il s'agit d'un client connecté en permanence.
Enregistrer et renommer le fichier
Enregistrez, téléchargez, et renommez le fichier en wg0.conf (ou wg1.conf, etc.)
Terminé !
Sur le serveur client
Structure des dossiers
- /
- srv
- docker
- wireguard
- config
- wg_confs
- compose.yaml
- config
- wireguard
- docker
- srv
Créer le dossier
sudo mkdir -p /srv/docker/wireguard/config/wg_confs
Créer le fichier wg0.conf
sudo nano /srv/docker/wireguard/config/wg_confs/wg0.conf
Collez la configuration téléchargée, puis enregistrez avec Ctrl+O, Enter, et quittez avec Ctrl+X.
sudo cp ~/wg0.conf /srv/docker/wireguard/config/wg_confs
Créer le fichier compose
Créez le fichier compose.yaml dans /srv/docker/wireguard :
---
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wireguard
network_mode: host
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- TZ=Europe/Paris
volumes:
- /srv/docker/wireguard/config:/config
- /lib/modules:/lib/modules
restart: unless-stopped
Démarrer le conteneur
cd /srv/docker/wireguard
sudo docker compose up -d
Terminé !
Autres appareils
- Mobile : installez WireGuard et scannez le QR code depuis l'interface web (
http://ipduserveur:51821) - Ordinateur : installez le client WireGuard et importez le fichier de configuration téléchargé.
wg0.conf pour utiliser l'IP locale du serveur :
Endpoint = ip-locale-du-serveur:51820Et voici le schéma final de l'installation :