Mettre en place un serveur VPN WireGuard sur Proxmox
Déploiement d'un conteneur LXC Debian avec WireGuard afin d'accéder à distance et de manière sécurisée au réseau local et aux services hébergés sur Proxmox.
Sommaire
- Prérequis
- Architecture du VPN
- Création du conteneur LXC
- Installation de WireGuard
- Activation du routage IP
- Génération des clés du serveur
- Configuration du serveur WireGuard
- Démarrage de WireGuard
- Configuration du routeur
- Configuration du premier PC
- Ajout de PC supplémentaires
- Suppression d'un client
- Application des modifications sans couper le VPN
- Vérifications
- Commandes d'administration
- Troubleshooting
- Sécurité
Prérequis
- Serveur Proxmox VE fonctionnel.
- Template Debian 13 disponible pour les conteneurs LXC.
- Réseau local :
192.168.1.0/24
- Passerelle du réseau :
192.168.1.254
- Adresse IPv4 publique accessible depuis Internet.
- Possibilité de créer une règle NAT/PAT UDP sur le routeur.
- Un PC distant avec le client WireGuard.
Le VPN utilise :
UDP 51820
L'objectif est de pouvoir accéder aux services internes sans publier directement leurs interfaces d'administration sur Internet.
Architecture du VPN
Le serveur WireGuard est installé dans un conteneur LXC dédié.
Architecture retenue :
Internet
|
v
Routeur / Bbox
UDP 51820
|
v
CT WireGuard
192.168.1.212
10.10.10.1
|
v
Réseau local
192.168.1.0/24
|
+-- Proxmox
+-- AdGuard Home
+-- Serveur Web
+-- Serveur Mail
+-- Grafana
+-- autres services
Le réseau VPN utilisé est :
10.10.10.0/24
Le serveur WireGuard utilise :
10.10.10.1
Plan d'adressage conseillé :
10.10.10.1 Serveur WireGuard
10.10.10.2 PC principal
10.10.10.3 PC portable
10.10.10.4 PC supplémentaire
10.10.10.5 Téléphone
10.10.10.6 Tablette
Chaque appareil doit posséder une adresse IP WireGuard et une paire de clés uniques.
Création du conteneur LXC
- Dans Proxmox, cliquer sur :
Create CT
- Créer un conteneur Debian dédié :
Hostname : WireGuard
OS : Debian 13
CPU : 1 vCPU
RAM : 512 Mo
Swap : 256 Mo
Disque : 4 Go
Réseau : vmbr0
IPv4 : 192.168.1.212/24
Gateway : 192.168.1.254
-
Démarrer le conteneur.
-
Vérifier le réseau :
ip addr
ip route
Dans le conteneur LXC, l'interface peut apparaître sous une forme similaire à :
eth0@if17
Pour les commandes réseau et la configuration WireGuard, utiliser uniquement :
eth0
- Vérifier l'accès à Internet :
ping -c 4 1.1.1.1
ping -c 4 deb.debian.org
Installation de WireGuard
- Mettre Debian à jour :
apt update
apt upgrade -y
- Installer WireGuard ainsi que les outils nécessaires :
apt install wireguard iptables qrencode -y
- Vérifier l'installation :
wg --version
Activation du routage IP
Le conteneur doit pouvoir router le trafic entre le réseau WireGuard et le réseau local.
Créer :
nano /etc/sysctl.d/99-wireguard.conf
Ajouter :
net.ipv4.ip_forward=1
Appliquer :
sysctl --system
Vérifier :
sysctl net.ipv4.ip_forward
Résultat attendu :
net.ipv4.ip_forward = 1
Génération des clés du serveur
- Créer le répertoire WireGuard :
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
- Générer la paire de clés :
umask 077
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
- Afficher la clé publique :
cat /etc/wireguard/server_public.key
La clé privée est stockée dans :
/etc/wireguard/server_private.key
Elle ne doit jamais être communiquée.
Configuration du serveur WireGuard
- Afficher la clé privée :
cat /etc/wireguard/server_private.key
- Créer le fichier de configuration :
nano /etc/wireguard/wg0.conf
- Ajouter :
[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = CLE_PRIVEE_SERVEUR
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
Remplacer :
CLE_PRIVEE_SERVEUR
par la clé privée précédemment générée.
- Protéger le fichier :
chmod 600 /etc/wireguard/wg0.conf
Démarrage de WireGuard
- Activer WireGuard au démarrage :
systemctl enable wg-quick@wg0
- Démarrer le VPN :
systemctl start wg-quick@wg0
- Vérifier le service :
systemctl status wg-quick@wg0 --no-pager
- Vérifier WireGuard :
wg
- Vérifier l'interface :
ip addr show wg0
L'interface doit posséder :
10.10.10.1/24
Configuration du routeur
Créer une seule règle NAT/PAT sur la Bbox :
Protocole : UDP
Port externe : 51820
Destination : 192.168.1.212
Port interne : 51820
Le chemin d'une connexion distante devient alors :
PC distant
|
v
Internet
|
v
IP publique:51820/UDP
|
v
Bbox
|
v
192.168.1.212:51820
|
v
WireGuard
Il n'est pas nécessaire de créer une nouvelle redirection de port pour chaque appareil VPN.
Configuration du premier PC
Génération des clés
Chaque client WireGuard possède sa propre paire de clés.
Sur Windows :
WireGuard
> Ajouter un tunnel
> Ajouter un tunnel vide
WireGuard génère automatiquement une clé privée et une clé publique.
Conserver la clé privée sur le PC.
Copier uniquement la clé publique.
Déclaration du PC sur le serveur
Sur le CT WireGuard :
nano /etc/wireguard/wg0.conf
Ajouter :
# PC principal
[Peer]
PublicKey = CLE_PUBLIQUE_PC
AllowedIPs = 10.10.10.2/32
Appliquer la configuration.
Configuration du PC
Créer le tunnel :
[Interface]
PrivateKey = CLE_PRIVEE_PC
Address = 10.10.10.2/24
[Peer]
PublicKey = CLE_PUBLIQUE_SERVEUR
Endpoint = IP_PUBLIQUE:51820
AllowedIPs = 192.168.1.0/24, 10.10.10.0/24
PersistentKeepalive = 25
Cette configuration utilise un split tunnel.
Seuls les réseaux suivants passent dans le VPN :
192.168.1.0/24
10.10.10.0/24
Le trafic Internet classique du PC continue donc d'utiliser sa connexion Internet locale.
Ajout de PC supplémentaires
Chaque nouvel appareil doit avoir :
- sa propre clé privée ;
- sa propre clé publique ;
- sa propre adresse IP WireGuard.
Exemple :
Serveur 10.10.10.1
PC principal 10.10.10.2
PC portable 10.10.10.3
PC 3 10.10.10.4
Ajouter le deuxième PC
-
Installer WireGuard sur le nouveau PC.
-
Créer un tunnel vide.
-
Récupérer la clé publique générée.
-
Sur le serveur :
nano /etc/wireguard/wg0.conf
Ajouter :
# PC portable
[Peer]
PublicKey = CLE_PUBLIQUE_PC2
AllowedIPs = 10.10.10.3/32
- Sur le nouveau PC :
[Interface]
PrivateKey = CLE_PRIVEE_PC2
Address = 10.10.10.3/24
[Peer]
PublicKey = CLE_PUBLIQUE_SERVEUR
Endpoint = IP_PUBLIQUE:51820
AllowedIPs = 192.168.1.0/24, 10.10.10.0/24
PersistentKeepalive = 25
Pour un troisième PC, utiliser par exemple :
10.10.10.4
et ajouter :
# PC 3
[Peer]
PublicKey = CLE_PUBLIQUE_PC3
AllowedIPs = 10.10.10.4/32
Ne jamais réutiliser la même clé privée ou la même IP WireGuard pour plusieurs appareils.
Suppression d'un client
Si un ordinateur est perdu, volé ou ne doit plus avoir accès au réseau, supprimer son Peer.
Ouvrir :
nano /etc/wireguard/wg0.conf
Supprimer par exemple :
# PC portable
[Peer]
PublicKey = CLE_PUBLIQUE_PC2
AllowedIPs = 10.10.10.3/32
Appliquer ensuite la nouvelle configuration.
La clé de cet appareil n'est alors plus autorisée par le serveur.
Il n'est pas nécessaire de modifier les autres clients.
Application des modifications sans couper le VPN
Un redémarrage complet peut être effectué avec :
systemctl restart wg-quick@wg0
Cependant, cette commande démonte puis recrée l'interface WireGuard.
Si la connexion SSH utilisée pour administrer le serveur passe elle-même par WireGuard, le terminal peut afficher :
client_loop: send disconnect: Connection reset
La connexion SSH a alors été coupée pendant le redémarrage du tunnel.
Pour appliquer la configuration sans démonter complètement l'interface :
wg syncconf wg0 <(wg-quick strip wg0)
Vérifier ensuite :
wg
Vérifications
Vérifier le serveur
Sur le CT :
systemctl status wg-quick@wg0 --no-pager
Puis :
wg
Et :
ip addr show wg0
Vérifier les peers
La commande suivante permet d'afficher les clients déclarés :
wg
Pour un client connecté, contrôler notamment :
latest handshake
transfer
Tester depuis l'extérieur
Pour vérifier réellement le VPN, utiliser un réseau différent du réseau local, par exemple un partage de connexion 4G/5G.
Activer WireGuard sur le PC.
Tester le serveur WireGuard :
ping 10.10.10.1
Tester ensuite le réseau local :
ping 192.168.1.212
Puis tester les autres équipements du LAN :
ping IP_PROXMOX
L'interface ward
### Vérifier que WireGuard écoute sur UDP 51820
```bash
ss -lunp | grep 51820
Redémarrer WireGuard
systemctl restart wg-quick@wg0
Recharger la configuration sans démonter wg0
wg syncconf wg0 <(wg-quick strip wg0)
Afficher les logs du service
journalctl -u wg-quick@wg0
Troubleshooting
Connection reset après un redémarrage de WireGuard
Symptôme :
client_loop: send disconnect: Connection reset
Cela peut arriver lorsqu'une session SSH passe elle-même par le tunnel WireGuard et que celui-ci est redémarré avec :
systemctl restart wg-quick@wg0
Se reconnecter au serveur après le redémarrage.
Pour les modifications suivantes, utiliser :
wg syncconf wg0 <(wg-quick strip wg0)
Le client n'établit aucun handshake
Sur le serveur :
wg
Si aucun latest handshake n'apparaît pour le client, vérifier :
- la clé publique du client dans
wg0.conf; - la clé publique du serveur sur le client ;
- l'adresse IP publique renseignée dans
Endpoint; - le port
51820; - l'utilisation du protocole UDP ;
- la redirection NAT/PAT de la Bbox.
La redirection attendue est :
UDP 51820 -> 192.168.1.212:51820
Le VPN se connecte mais le LAN n'est pas accessible
Vérifier le routage IP :
sysctl net.ipv4.ip_forward
Résultat attendu :
net.ipv4.ip_forward = 1
Vérifier également :
iptables -t nat -L -n -v
La configuration utilise une règle MASQUERADE entre :
10.10.10.0/24
et :
eth0
L'interface apparaît comme eth0@if17
Dans un conteneur LXC, ip addr peut afficher :
eth0@if17
Dans les commandes iptables et la configuration WireGuard, utiliser :
eth0
et non :
eth0@if17
Deux PC ne fonctionnent pas correctement simultanément
Vérifier qu'ils ne possèdent pas la même IP WireGuard.
Configuration correcte :
PC 1 : 10.10.10.2
PC 2 : 10.10.10.3
PC 3 : 10.10.10.4
Chaque PC doit également utiliser sa propre paire de clés.
Sécurité
Le VPN permet d'éviter de publier directement plusieurs interfaces d'administration sur Internet.
Il est notamment préférable de conserver derrière le VPN :
Proxmox
SSH
Grafana
AdGuard Home
interfaces d'administration internes
Le seul port nécessaire au VPN sur la Bbox est :
UDP 51820
Les clés privées WireGuard ne doivent jamais être partagées.
Chaque appareil doit avoir sa propre clé afin de permettre sa révocation individuellement.
En cas de perte d'un appareil, supprimer immédiatement son bloc [Peer] du serveur puis appliquer la nouvelle configuration :
wg syncconf wg0 <(wg-quick strip wg0)
Le VPN fournit ainsi un point d'entrée unique vers l'infrastructure Proxmox tout en évitant l'exposition directe des services d'administration.