Mise en place d'un réseau VPN avec WireGuard
WireGuard repose sur un modèle peer-to-peer, et non sur une architecture classique client/serveur.
Cependant, pour simplifier la lecture de cet article, nous utiliserons les termes suivants :
- Serveur : le peer configuré pour accepter les connexions entrantes (serveur debian)
- Client : le peer qui initie la connexion vers le serveur. (machine windows)
Topologie du réseau
La topologie de notre réseau VPN sera définie ainsi :
- Plage d'adresses du réseau VPN :
10.8.8.0/24 - Adresse IP du serveur (interface WireGuard) :
10.8.8.254/24 - Adresses IP des clients : en
/32, de la manière suivante :- Client 1 :
10.8.8.1/32 - Client 2 :
10.8.8.2/32 - etc.
- Client 1 :
IP Forwarding permanent
Pour que le serveur Linux puisse router les paquets entre le réseau VPN et le réseau local (accès Internet), l'IP forwarding doit être activé de manière permanente.
Pour que cela fonctionne, il suffit de décommenter les deux lignes suivantes dans le fichier /etc/systctl.conf :
1net.ipv4.ip_forward=12net.ipv6.conf.all.forwarding=1
IP MASQUERADE permanent
Pour que le serveur route correctement les paquets et rende le réseau local accessible aux clients VPN, activez l'IP Masquerade. Cela correspond à l'activation du NAT (Network Address Translation).
Avant d'activer l'IP Masquerade, il faut d'abord identifier le nom de l'interface connectée au réseau local. Pour cela, exécutez la commande suivante : ip a.
Notez le nom de l'interface connectée à Internet (ex. ens3 pour cet exemple).
Installer et configurer ufw
1apt install ufw2ufw allow 22/tcp3ufw allow 51820/udp
- 22/tcp : port par défaut du serveur SSH.
- 51820/udp : port par défaut d'écoute de WireGuard (si vous le changez, adaptez les commandes suivantes).
Éditez le fichier des règles UFW /etc/ufw/before.rules et ajouter les règles suivantes à la fin :
1# NAT table rules IP MASQUERADE 2*nat 3:POSTROUTING ACCEPT [0:0] 4-F POSTROUTING 5-A POSTROUTING -m comment --comment "WireGuard NAT" -s 10.8.8.0/24 -o ens3 -j MASQUERADE 6COMMIT 7 8# Autoriser le forwarding pour le réseau distant de confiance (+ le réseau VPN) 9*filter10-A ufw-before-forward -s 10.8.8.0/24 -j ACCEPT11-A ufw-before-forward -d 10.8.8.0/24 -j ACCEPT12COMMIT
- Démarrer UFW avec la commande :
ufw enable. - Vérifier que la règle NAT est active :
iptables -t nat -L POSTROUTING -n -v.
La ligne
-F POSTROUTINGvide toutes les règles NAT avant de les recréer lors du démarrage d'UFW. Si vous avez d'autres règles NAT personnalisées, retirez-la. Dans ce cas, la désactivation/réactivation d'UFW dupliquera la règle. Il faut alors la supprimer avant de redémarrer UFW. Commencez par identifier son numéro :1iptables -t nat -L POSTROUTING -n -v --line-numbersPuis supprimez-la :
iptables -t nat -D POSTROUTING {numéro}avant de redémarrer UFW.
Installation de WireGuard sur le serveur
1apt install wireguard
Générez la paire de clés publique/privée. La clé publique devra être connue des clients.
1wg genkey | tee /etc/wireguard/wg-private.key | wg pubkey | tee /etc/wireguard/wg-public.key
La clé publique s'affiche dans la console.
Pour créer le fichier de configuration WireGuard, vous aurez besoin de la clé privée.
Utilisez cat /etc/wireguard/wg-private.key pour l'afficher.
Créer le fichier de configuration WireGuard /etc/wireguard/wg0.con et ajouter le contenu suivant :
1[Interface]2Address = 10.8.8.254/243MTU = 12804SaveConfig = true5ListenPort = 4436PrivateKey = <clé privée du serveur>
Address: IP de l'interface WireGuard au sein du tunnel VPN (sous réseau différent du LAN distant)SaveConfig = true: La configuration est mise en mémoire (et protégée) le temps que l'interface est activeListenPort = 443: Port d'écoute de WireGuard, par défaut 51820. Il est préférable de le changer.PrivateKey: Valeur de la clé privée du serveur (présente dans le fichier/etc/wireguard/wg-private.key)
Nous ajouterons plus tard les déclarations des peers clients dans ce fichier. Sauvegardez et fermez-le pour le moment.
Limiter l'accès aux fichiers de configurations à root :
1chmod 600 /etc/wireguard/ -R
Démarrer l'interface réseau du VPN :
1wg-quick up wg0
- Vérifiez avec
ip aque l'interface wg0 apparaît. - Affichez sa configuration avec la commande
wg show wg0.
Activer le service systemd pour que le VPN démarre automatiquement au démarrage du serveur :
1systemctl enable wg-quick@wg0
Configuration du client WireGuard sur Windows
- Installer et lancer l'application WireGuard. https://www.wireguard.com/install/
- Cliquez sur "Ajouter un tunnel" puis "Nouveau tunnel vide"
Au niveau de l'interface sous PrivateKey ajouter les éléments suivants (attention : garder votre PrivateKey générée) :
1[Interface] 2PrivateKey = Clé privée généré par wireguard 3Address = 10.8.8.1/24 4DNS = 1.1.1.1,9.9.9.9 5MTU = 1280 6 7[Peer] 8PublicKey = Clé publique du serveur 9AllowedIPs = 0.0.0.0/010Endpoint = IP_PUBLIQUE_DU_SERVEUR:44311PersistentKeepalive = 25
Pour la section interface :
PrivateKey: Clé privée générée par WireGuard.Address: Adresse IP de l'interface WireGuard dans le tunnel VPN. Chaque client VPN doit avoir sa propre IP.DNS: DNS utilisé par le client VPN.MTU: (Maximum Transmission Unit) Taille maximale en octets d'un paquet de données qui peut être transmis sur le tunnel VPN sans nécessiter de fragmentation. (il faut la même valeur que sur le serveur).
Pour la section peer :
PublicKey: Clé publique du serveur. (affichable avec la commandewg showsur le serveur).AllowedIPs: Écoute sur l'interface 0.0.0.0/0, pour que tout le trafic passe par le VPN.Endpoint: Adresse publique/port du serveur, pour que notre client s'y connecte.
La case "Bloquer tout le trafic hors tunnel" (kill switch) empêche l'émission de paquets sur le réseau en cas de déconnexion du VPN.
Il faut maintenant ajouter le Peer sur le serveur pour que le client puisse s'y connecter.
Ajouter le client dans la configuration du serveur
Commencer par récupérer la clé publique sur le client que vous venez de créer.
Ensuite, arrêter l'interface WireGuard sur le serveur :
1wg-quick down wg0
Ajouter la section [Peer] suivante dans le fichier de configuration /etc/wireguard/wg0.conf du serveur :
1PublicKey = Clé publique du client2AllowedIPs = 10.8.8.1/32
PublicKey: Clé publique du client VPN.AllowedIPs: Adresse IP attribuée au client sur la plage IP du VPN. Il faudra une adresse IP différente pour chaque client.
Enfin, redémarrer l'interface WireGuard sur le serveur :
1wg-quick up wg0
Connectez le client.
Dépannage
En cas de problème, ce sera visible dans l'onglet "Journal" du client VPN. Les hôtes échangent régulièrement des paquets keepalive pour vérifier la connexion, d'où les messages "Receiving keepalive packet from peer 1".
Si vous voyez un message comme celui-ci, vérifiez que les clés publiques déclarées des deux côtés sont correctes :
1Handshake for peer 1 (<ip>:51820) did not complete after 5 seconds, retrying (try 2)
Depuis le client, il est possible de pinguer l'adresse IP de l'interface WireGuard
1ping 10.8.8.254
Commandes utiles
wg show: Affiche les informations de l'interface VPN et les informations des clients.wg-quick up wg0: Démarre l'interface réseau du VPN.wg-quick down wg0: Arrête l'interface réseau du VPN.iptables -t nat -L POSTROUTING -n -v: Affiche les règles NAT actives.