Network
5 min
Mis en ligne le 11/12/2025

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.

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=1
2net.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 ufw
2ufw allow 22/tcp
3ufw 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*filter
10-A ufw-before-forward -s 10.8.8.0/24 -j ACCEPT
11-A ufw-before-forward -d 10.8.8.0/24 -j ACCEPT
12COMMIT
  • 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 POSTROUTING vide 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-numbers

Puis 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/24
3MTU = 1280
4SaveConfig = true
5ListenPort = 443
6PrivateKey = <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 active
  • ListenPort = 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 a que 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

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/0
10Endpoint = IP_PUBLIQUE_DU_SERVEUR:443
11PersistentKeepalive = 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 commande wg show sur 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 client
2AllowedIPs = 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.

Sources

Ludovic Meurot

Développeur web, PHP Laravel, interessé par l'admin sys et du réseau.