Installer et configurer WireGuard VPN sur Debian 12/13 (Bookworm & Trixie)
- Mise à jour le 21 août 2025
Introduction
- WireGuard est une solution VPN moderne et performante, reconnue pour ses qualités :
- Excellentes performances
- Grande sécurité (avec une surface d’attaque minimale et une conception cryptographiquement solide)
- Simplicité d'utilisation et facilité de configuration
J’ai déjà travaillé avec WireGuard VPN durant le cycle de Debian 11. Avec la sortie de Debian 12 Bookworm et désormais de Debian 13 Trixie, c’est le moment idéal pour revisiter et améliorer ce tutoriel initial.
Ce guide pas-à-pas vous expliquera comment configurer un serveur Debian GNU/Linux en tant que passerelle WireGuard VPN, afin de permettre à des clients Windows distants de se connecter de manière sécurisée à un réseau local (LAN).
Schéma Réseau
- Serveur WireGuard :
- Système : Debian GNU/Linux 12 (Bookworm) ou 13 (Trixie)
- Rôle : serveur WireGuard + passerelle
- Client Windows :
- Système : Windows 11

Serveur Debian (Partie I)
Installation
- Installer WireGuard :
root@host:~# apt update && apt install wireguard
Configuration réseau
- Créer le fichier
/etc/network/interfaces.d/wg0
:
# indiquer que wg0 doit être créé au démarrage du système et lors d'un ifup -a
auto wg0
# décrire wg0 comme une interface IPv4 avec une adresse statique
iface wg0 inet static
# adresse IP statique
address 10.0.2.1/24
# avant ifup, créer l’interface avec cette commande ip link
pre-up ip link add $IFACE type wireguard
# avant ifup, appliquer la configuration WireGuard définie précédemment
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
# après ifdown, supprimer l’interface wg0
post-down ip link del $IFACE
Génération des clés
- Placez-vous dans le répertoire
/etc/wireguard/
et modifiez leumask
pour que les prochaines clés créées soient accessibles en lecture et écriture uniquement par le propriétaire :
root@host:~# cd /etc/wireguard/
root@host:~# umask 077
- Générez la clé privée :
root@host:~# wg genkey > wg-private.key
- Générez la ou les clés publiques qui seront utilisées par notre hôte Windows :
root@host:~# wg pubkey < wg-private.key > w11-client01.key
Configuration
- Copiez le contenu du fichier
wg-private.key
:
root@host:~# cat wg-private.key
2GIURzIDBgI1Y+1Ei+i2C5kEOR53mH172MaidaVpD3M=
- Créez un fichier
/etc/wireguard/wg0.conf
et remplacez la valeur de PrivateKey par celle obtenue ci-dessus :
# définir le service WireGuard
[Interface]
# contenu du fichier wg-private.key généré précédemment
PrivateKey = 2GIURzIDBgI1Y+1Ei+i2C5kEOR53mH172MaidaVpD3M=
# port UDP utilisé par le service ; 51820 est un choix courant pour WireGuard
ListenPort = 51820
- Redémarrez le système pour appliquer les changements réseau :
root@host:~# reboot
Windows (Client)
- Téléchargez la dernière version du logiciel depuis le site officiel https://wireguard.com/, puis installez-la.

- Ouvrez le client WireGuard VPN :

- Ajoutez un nouveau profil :

- Depuis Debian, copiez la clé publique :
root@host:~# cat /etc/wireguard/w11-client01.key
hlKy6azGCB0uVbCdkW8Htx23k57iWzOFJRLAYHTx5wU=
- Configurez le profil (Remarque : conservez votre propre clé privée générée par l'application WireGuard pour Windows.) :

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
# CLIENT IP :
Address = 10.0.2.2/24
# ON PEUT AJOUTER LA CONFIGURATION DNS :
# DNS = 192.168.11.1
[Peer]
PublicKey = hlKy6azGCB0uVbCdkW8Htx23k57iWzOFJRLAYHTx5wU=
# ON PEUT ETRE PLUS PRECIS AVEC : AllowedIPs = 10.0.2.0/24, 192.168.0.0/24
AllowedIPs = 0.0.0.0/0
Endpoint = SERVER_PUBLIC_IP:51820
- Cliquez sur Activer pour établir la connexion VPN :

Le serveur nécessite maintenant une configuration supplémentaire pour autoriser la connexion.
Serveur Debian (Partie II)
WireGuard
- Activez WireGuard :
root@host:~# ifup wg0
- Récupérez la clé publique depuis le client Windows 11 :

- Depuis le serveur Debian, autorisez la clé publique du client avec la commande suivante :
root@host:~# wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 0.0.0.0/0
- Depuis Windows, effectuez un ping de l’IP
wg0
du serveur Debian pour vérifier que la connexion fonctionne :

- Afficher les connexions des pairs actifs :
root@host:~# wg show
interface: wg0
public key: hlKy6azGCB0uVbCdkW8Htx23k57iWzOFJRLAYHTx5wU=
private key: (hidden)
listening port: 51820
peer: 3A5R|UPz7/c1r+sToEDSkxYY8kdou+Y7TwAvb2NIf0c=
endpoint: WINDOWS_IP:52925
allowed ips: 0.0.0.0/0
latest handshake: 6 seconds ago
transfer: 453.44 KiB received, 411.87 KiB sent
- Pour rendre l’autorisation du client persistante, éditez le fichier
/etc/network/interfaces.d/wg0
et ajoutez :
# indiquer que wg0 doit être créé au démarrage du système et lors d’un ifup -a
auto wg0
# décrire wg0 comme une interface IPv4 avec une adresse statique
iface wg0 inet static
# adresse IP statique
address 10.0.2.1/24
# avant ifup, créer l’interface avec cette commande ip link
pre-up ip link add $IFACE type wireguard
# avant ifup, appliquer la configuration WireGuard définie précédemment
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
# après ifdown, supprimer l’interface wg0
post-down ip link del $IFACE
# clients autorisés
up wg set wg0 peer CLIENT01_PUBLIC_KEY allowed-ips 0.0.0.0/0
up wg set wg0 peer CLIENT02_PUBLIC_KEY allowed-ips 0.0.0.0/0
Mode passerelle
À ce stade, avec cette configuration, nous avons accès à notre serveur Debian WireGuard. Nous allons maintenant activer le mode passerelle, ce qui permettra aux clients distants de communiquer avec l’ensemble du réseau 192.168.0.0/24 et d’échanger avec les autres serveurs de ce LAN.
Activer le transfert IP
- Créez le fichier
/etc/sysctl.d/99-ipforward.conf
pour activer le transfert IP au démarrage :
net.ipv4.ip_forward = 1
- Exécutez cette commande pour appliquer le changement :
root@host:~# sysctl -p /etc/sysctl.d/99-ipforward.conf
- Vérifiez que le transfert IP est activé :
root@host:~# cat /proc/sys/net/ipv4/ip_forward
1
Règles NAT avec nftables
Une fois le transfert IP activé, nous allons créer une règle NAT pour permettre le routage depuis le sous-réseau VPN vers le LAN.
- Identifiez le nom de votre interface réseau interne (
ens18
dans ma configuration) :
root@host:~# ip addr sh
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bc:24:12:48:bd:1a brd ff:ff:ff:ff:ff:ff
altname enp0s18
inet 192.168.0.200/24 brd 192.168.0.255 scope global ens18
valid_lft forever preferred_lft forever
inet6 fe80::be24:11ff:fe78:bd1a/64 scope link
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.0.2.1/24 brd 10.0.2.255 scope global wg0
valid_lft forever preferred_lft forever
Règles temporaires
Voici comment activer la translation d'adresses (NAT) à l’aide de règles nftables temporaires.
- Ajoutez les règles de masquage (masquerade) pour rendre votre réseau interne accessible depuis Windows :
root@host:~# nft add table ip NAT
root@host:~# nft add chain ip NAT my_masquerade '{ type nat hook postrouting priority 100; }'
root@host:~# nft add rule NAT my_masquerade ip saddr { 10.0.2.0/24 } oifname ens18 masquerade
- Facultatif : nous pouvons également définir des règles de filtrage :
root@host:~# nft add rule ip filter INPUT udp dport 51820 ct state new,established counter accept
root@host:~# nft add rule ip filter OUTPUT udp sport 51820 ct state established counter accept
Persistent rules
- To make our NAT configuration persistent, edit
/etc/nftables.conf
file:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
udp dport 51820 ct state new,established counter accept
}
chain forward {
type filter hook forward priority 0;
}
chain output {
type filter hook output priority 0;
udp sport 51820 ct state established counter accept
}
}
table ip NAT {
chain my_masquerade {
type nat hook postrouting priority 100; policy accept;
ip saddr { 10.0.2.0/24 } oifname "ens18" masquerade comment "outgoing NAT"
}
}
- Activez le service nftables avec systemctl :
root@host:~# systemctl enable nftables.service
- Appliquez la configuration nftables :
root@host:~# nft -f /etc/nftables.conf
Test depuis Windows
- Effectuez un ping vers n’importe quel hôte interne :

Dépannage
Source : https://serverfault.com.
Remarque : si vous ne définissez pas les pairs comme persistants, vous devrez relancer la commande up wg set wg0 peer
pour chaque pair après avoir exécuté ifdown wg0 ; ifup wg0
.
- Activer le mode debug de WireGuard :
root@host:~# modprobe -r wireguard && modprobe wireguard dyndbg
root@host:~# ifdown wg0; ifup wg0
- Surveiller les journaux WireGuard :
root@host:~# journalctl -f --grep wireguard
- Désactiver le mode debug de WireGuard :
root@host:~# modprobe -r wireguard && modprobe wireguard
root@host:~# ifdown wg0; ifup wg0