Portfolio 2026-11-01

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

  1. Prérequis
  2. Architecture du VPN
  3. Création du conteneur LXC
  4. Installation de WireGuard
  5. Activation du routage IP
  6. Génération des clés du serveur
  7. Configuration du serveur WireGuard
  8. Démarrage de WireGuard
  9. Configuration du routeur
  10. Configuration du premier PC
  11. Ajout de PC supplémentaires
  12. Suppression d'un client
  13. Application des modifications sans couper le VPN
  14. Vérifications
  15. Commandes d'administration
  16. Troubleshooting
  17. 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

  1. Dans Proxmox, cliquer sur :
Create CT
  1. 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
  1. Démarrer le conteneur.

  2. 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
  1. Vérifier l'accès à Internet :
ping -c 4 1.1.1.1
ping -c 4 deb.debian.org

Installation de WireGuard

  1. Mettre Debian à jour :
apt update
apt upgrade -y
  1. Installer WireGuard ainsi que les outils nécessaires :
apt install wireguard iptables qrencode -y
  1. 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

  1. Créer le répertoire WireGuard :
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
  1. 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
  1. 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

  1. Afficher la clé privée :
cat /etc/wireguard/server_private.key
  1. Créer le fichier de configuration :
nano /etc/wireguard/wg0.conf
  1. 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.

  1. Protéger le fichier :
chmod 600 /etc/wireguard/wg0.conf

Démarrage de WireGuard

  1. Activer WireGuard au démarrage :
systemctl enable wg-quick@wg0
  1. Démarrer le VPN :
systemctl start wg-quick@wg0
  1. Vérifier le service :
systemctl status wg-quick@wg0 --no-pager
  1. Vérifier WireGuard :
wg
  1. 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

  1. Installer WireGuard sur le nouveau PC.

  2. Créer un tunnel vide.

  3. Récupérer la clé publique générée.

  4. Sur le serveur :

nano /etc/wireguard/wg0.conf

Ajouter :

# PC portable
[Peer]
PublicKey = CLE_PUBLIQUE_PC2
AllowedIPs = 10.10.10.3/32
  1. 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.