Aller au contenu

Serveur WireGuard de A à Z

Objectif : un serveur VPN permettant à un ou plusieurs postes clients de rejoindre un réseau via un tunnel chiffré. Contexte théorique dans VPN — WireGuard.

Installation Physique, VM (VMware, Proxmox, Hyper-V…) ou VPS cloud — WireGuard n’a pas d’exigence particulière liée au type d’hébergement, hormis un accès réseau public (IP fixe ou DNS dynamique) pour l’Endpoint.
Système d’exploitation (serveur) Debian/Ubuntu (apt install wireguard, ce tutoriel) — support natif dans le noyau Linux ≥ 5.6 ; sur un noyau plus ancien, un module DKMS (wireguard-dkms) est nécessaire. Transposable à Fedora/RHEL (dnf) ou Arch (pacman, déjà inclus dans le noyau officiel).
Système d’exploitation (client) Applications officielles disponibles pour Windows, macOS, Linux, iOS et Android — la configuration [Interface]/[Peer] de ce tutoriel s’importe telle quelle dans chacune (fichier .conf ou QR code sur mobile).
Prérequis matériels Très légers grâce à l’implémentation en espace noyau : 1 vCPU / 512 Mo à 1 Go de RAM suffisent pour quelques dizaines de clients à usage bureautique. Le débit réel dépend surtout de la bande passante réseau et du CPU disponible pour le chiffrement (ChaCha20), pas du nombre de tunnels.
Fenêtre de terminal
sudo apt install wireguard
Fenêtre de terminal
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
sudo chmod 600 /etc/wireguard/server_private.key

/etc/wireguard/wg0.conf :

[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = <contenu de server_private.key>
PostUp = nft add rule inet filter forward ip saddr 10.10.10.0/24 accept
PostDown = nft delete rule inet filter forward ip saddr 10.10.10.0/24 accept
# Un bloc [Peer] par client
[Peer]
PublicKey = <clé publique du client>
AllowedIPs = 10.10.10.2/32

Activer le forwarding IP (nécessaire pour router le trafic) :

Fenêtre de terminal
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Fenêtre de terminal
sudo systemctl enable --now wg-quick@wg0
sudo wg show

Sur le client, générer sa propre paire de clés, puis :

[Interface]
Address = 10.10.10.2/32
PrivateKey = <clé privée du client>
DNS = 10.10.10.1
[Peer]
PublicKey = <clé publique du serveur>
Endpoint = vpn.exemple.fr:51820
AllowedIPs = 10.10.10.0/24 # ou 0.0.0.0/0 pour router tout le trafic via le VPN
PersistentKeepalive = 25

PersistentKeepalive maintient le mapping NAT ouvert côté client — indispensable si le client est lui-même derrière un NAT/routeur.

Fenêtre de terminal
nft add rule inet filter input udp dport 51820 accept
Fenêtre de terminal
sudo wg show
ping 10.10.10.1 # depuis le client, une fois le tunnel monté