Créer un VPN WireGuard sous Debian : guide complet

Créer un VPN sous Debian permet d’accéder à son réseau privé depuis l’extérieur, de se connecter à ses services internes ou de faire transiter sa connexion par son propre serveur.

Pour ce type d’usage, WireGuard est aujourd’hui l’une des solutions les plus simples à déployer. Sa configuration reste courte, ses performances sont excellentes, et son modèle à clés publiques/privées évite la lourdeur d’une infrastructure de certificats complète.

Pourquoi utiliser WireGuard pour créer un VPN sous Debian ?

WireGuard fonctionne avec une paire de clés pour chaque machine. Le serveur possède sa clé privée. Chaque client possède aussi sa clé privée. Ensuite, chaque pair connaît uniquement les clés publiques nécessaires à la connexion.

Résultat : la configuration reste lisible. Un client correspond à une clé publique et à une adresse VPN. Pour ajouter ou retirer un accès, on ajoute ou supprime un bloc de configuration. C’est net, rapide, et beaucoup moins pénible qu’un tiroir plein de certificats.

BesoinWireGuard sous Debian
Accès à un serveur privéTrès adapté
Connexion depuis mobileTrès simple avec QR code
Accès à un réseau local distantPossible avec routage adapté
VPN personnel full tunnelOui
VPN split tunnelOui
MaintenanceLégère
Kinsta: Premium Managed WordPress hosting

Objectif de ce guide

Nous allons installer un serveur VPN WireGuard sous Debian, puis créer une configuration client utilisable sur Windows, macOS, Linux, iOS ou Android.

Le tunnel utilisera ce plan d’adressage :

  • interface VPN : wg0 ;
  • adresse VPN du serveur : 10.8.0.1 ;
  • adresse du premier client : 10.8.0.2 ;
  • port WireGuard : 51820/udp ;
  • réseau VPN : 10.8.0.0/24.

Le guide montre d’abord une configuration full tunnel. Dans ce mode, tout le trafic Internet du client passe par le serveur VPN. Une variante split tunnel est aussi proposée plus bas.

Principe de fonctionnement d’un réseau privé virtuel VPN

Pré-requis

Avant de commencer, il vous faut :

  • un serveur Debian accessible en SSH ;
  • un accès root ou un utilisateur avec sudo ;
  • une adresse IPv4 publique ou une redirection de port vers le serveur ;
  • le port UDP 51820 ouvert côté pare-feu, box ou hébergeur ;
  • un client WireGuard sur ordinateur ou mobile.

Si votre serveur se trouve derrière une connexion avec IP dynamique, commencez par configurer une adresse DDNS. Le guide créer une adresse DDNS pour accéder à son serveur à distance complète bien cette installation.

Si le serveur est hébergé chez vous, redirigez le port UDP 51820 de votre box vers l’adresse IP locale de la machine Debian. Sans cette redirection, le client ne pourra pas joindre le serveur VPN depuis Internet.

Installer WireGuard sur Debian

Connectez-vous au serveur en SSH, puis mettez les paquets à jour :

sudo apt update
sudo apt upgrade

Installez ensuite WireGuard, nftables et qrencode :

sudo apt install wireguard wireguard-tools nftables qrencode

wireguard-tools fournit les commandes wg et wg-quick. nftables gérera le filtrage réseau et le NAT. qrencode servira à générer un QR code pour importer la configuration sur mobile.

Kinsta: Premium Managed WordPress hosting

Activer le routage IPv4

Pour qu’un client VPN puisse passer par le serveur, Debian doit transférer les paquets IPv4.

Créez un fichier de configuration dédié :

sudo nano /etc/sysctl.d/99-wireguard.conf

Ajoutez :

net.ipv4.ip_forward=1

Appliquez la configuration :

sudo sysctl --system

Vérifiez que le routage est actif :

sysctl net.ipv4.ip_forwardLangage du code : CSS (css)

Vous devez obtenir :

net.ipv4.ip_forward = 1

Identifier l’interface réseau publique

Avant de créer les règles NAT, identifiez l’interface réseau utilisée par Debian pour sortir vers Internet.

ip route show defaultLangage du code : JavaScript (javascript)

Exemple :

default via 203.0.113.1 dev eth0 proto staticLangage du code : CSS (css)

Ici, l’interface publique est eth0. Selon l’hébergeur ou la machine, vous pouvez avoir ens3, enp1s0, eno1 ou un autre nom d’interface.

Dans les exemples suivants, remplacez eth0 par l’interface réelle de votre serveur.

Créer les clés WireGuard du serveur

Créez le dossier de configuration avec des permissions strictes :

sudo install -d -m 700 /etc/wireguard

Générez la clé privée du serveur :

sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server_private.key'Langage du code : JavaScript (javascript)

Générez sa clé publique :

sudo sh -c 'wg pubkey < /etc/wireguard/server_private.key > /etc/wireguard/server_public.key'Langage du code : HTML, XML (xml)

Affichez la clé publique du serveur :

sudo cat /etc/wireguard/server_public.key

La clé privée doit rester secrète. La clé publique peut être copiée dans les configurations des clients.

Distingo propose un taux d'intérêt de 4,5 % pendant 3 mois, plus 80 euros, jusqu'au 30 octobre 2026

Créer les clés du premier client

Chaque client WireGuard doit avoir sa propre paire de clés. Ne réutilisez pas la même configuration sur plusieurs appareils.

Pour générer les clés du premier client sur le serveur :

sudo sh -c 'umask 077; wg genkey > /etc/wireguard/client1_private.key'
sudo sh -c 'wg pubkey < /etc/wireguard/client1_private.key > /etc/wireguard/client1_public.key'Langage du code : JavaScript (javascript)

Affichez la clé publique du client :

sudo cat /etc/wireguard/client1_public.key

Configurer le serveur WireGuard

Créez le fichier /etc/wireguard/wg0.conf :

sudo nano /etc/wireguard/wg0.conf

Ajoutez cette configuration :

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = CLE_PRIVEE_DU_SERVEUR

[Peer]
PublicKey = CLE_PUBLIQUE_DU_CLIENT_1
AllowedIPs = 10.8.0.2/32Langage du code : PHP (php)

Insérez automatiquement la clé privée du serveur :

sudo sed -i "s|CLE_PRIVEE_DU_SERVEUR|$(sudo cat /etc/wireguard/server_private.key)|" /etc/wireguard/wg0.confLangage du code : JavaScript (javascript)

Insérez la clé publique du client :

sudo sed -i "s|CLE_PUBLIQUE_DU_CLIENT_1|$(sudo cat /etc/wireguard/client1_public.key)|" /etc/wireguard/wg0.confLangage du code : JavaScript (javascript)

Verrouillez les permissions :

sudo chmod 600 /etc/wireguard/wg0.conf

La directive AllowedIPs = 10.8.0.2/32 indique que ce client précis utilise l’adresse VPN 10.8.0.2. Chaque client supplémentaire recevra sa propre adresse.

Configurer nftables pour WireGuard

Sur une installation Debian moderne, nftables permet de gérer proprement le filtrage réseau et le NAT.

Ouvrez le fichier principal :

sudo nano /etc/nftables.conf

Voici une base simple pour un serveur VPN. Elle autorise SSH, WireGuard, le trafic établi, puis applique le NAT pour les clients VPN.

#!/usr/sbin/nft -f

flush ruleset

define public_if = eth0
define vpn_if = wg0
define vpn_net = 10.8.0.0/24
define ssh_port = 22
define wg_port = 51820

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;

    iif lo accept
    ct state established,related accept

    tcp dport $ssh_port accept
    udp dport $wg_port accept

    iifname $vpn_if accept

    counter drop
  }

  chain forward {
    type filter hook forward priority filter; policy drop;

    ct state established,related accept
    iifname $vpn_if oifname $public_if accept
    iifname $vpn_if accept

    counter drop
  }

  chain output {
    type filter hook output priority filter; policy accept;
  }
}

table ip nat {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;

    ip saddr $vpn_net oifname $public_if masquerade
  }
}Langage du code : PHP (php)

Remplacez eth0 par votre interface publique réelle.

Testez la configuration avant de l’appliquer :

sudo nft -c -f /etc/nftables.conf

Si aucune erreur ne s’affiche, activez nftables :

sudo systemctl enable --now nftables

Chargez les règles :

sudo nft -f /etc/nftables.conf

Vérifiez le résultat :

sudo nft list rulesetLangage du code : PHP (php)

Si vous avez déjà un pare-feu en production, adaptez cette configuration au lieu de la remplacer brutalement. Gardez toujours une session SSH ouverte pendant les changements. Se couper l’accès à son propre serveur reste une tradition très respectée, mais rarement agréable.

Kinsta: Premium Managed WordPress hosting

Démarrer WireGuard avec systemd

Démarrez l’interface VPN :

sudo systemctl enable --now wg-quick@wg0Langage du code : CSS (css)

Vérifiez l’état du service :

sudo systemctl status wg-quick@wg0Langage du code : CSS (css)

Vérifiez que l’interface wg0 existe :

ip address show wg0

Affichez l’état WireGuard :

sudo wg show

Le serveur écoute maintenant sur le port UDP 51820.

Créer la configuration du premier client

Créez un fichier de configuration client :

sudo nano /etc/wireguard/client1.conf

Ajoutez cette configuration. Remplacez vpn.example.com par l’adresse IP publique ou le nom DNS du serveur.

[Interface]
PrivateKey = CLE_PRIVEE_DU_CLIENT_1
Address = 10.8.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = CLE_PUBLIQUE_DU_SERVEUR
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Insérez automatiquement les clés :

sudo sed -i "s|CLE_PRIVEE_DU_CLIENT_1|$(sudo cat /etc/wireguard/client1_private.key)|" /etc/wireguard/client1.conf
sudo sed -i "s|CLE_PUBLIQUE_DU_SERVEUR|$(sudo cat /etc/wireguard/server_public.key)|" /etc/wireguard/client1.confLangage du code : JavaScript (javascript)

Verrouillez les permissions :

sudo chmod 600 /etc/wireguard/client1.conf

La ligne AllowedIPs = 0.0.0.0/0 active le full tunnel. Tout le trafic IPv4 du client passe alors par le VPN.

Importer le VPN sur mobile avec un QR code

Sur iOS ou Android, installez l’application WireGuard officielle. Ensuite, affichez un QR code depuis le serveur :

sudo qrencode -t ansiutf8 < /etc/wireguard/client1.confLangage du code : JavaScript (javascript)

Scannez ce QR code avec l’application WireGuard, puis activez le tunnel.

Pour Windows, macOS ou Linux, copiez le fichier client1.conf et importez-le dans l’application WireGuard.

Depuis votre poste local, vous pouvez utiliser scp :

scp user@vpn.example.com:/etc/wireguard/client1.conf ./client1.confLangage du code : JavaScript (javascript)

Adaptez l’utilisateur et le nom DNS selon votre serveur.

Tester la connexion VPN

Une fois le tunnel activé côté client, vérifiez l’état côté serveur :

sudo wg show

La présence d’un latest handshake indique que le client et le serveur communiquent correctement.

Depuis le client, testez l’adresse VPN du serveur :

ping 10.8.0.1Langage du code : CSS (css)

En full tunnel, vérifiez ensuite l’adresse IP publique utilisée par le client :

curl -4 https://ifconfig.meLangage du code : JavaScript (javascript)

Elle doit correspondre à l’adresse publique du serveur VPN.

Utiliser un split tunnel au lieu d’un full tunnel

Le full tunnel fait passer toute la connexion par le VPN. C’est pratique pour sortir via le serveur, mais ce n’est pas toujours nécessaire.

Pour limiter le VPN au réseau WireGuard, remplacez côté client :

AllowedIPs = 0.0.0.0/0

par :

AllowedIPs = 10.8.0.0/24

Si le serveur VPN doit aussi donner accès à un réseau local distant, par exemple 192.168.1.0/24, utilisez :

AllowedIPs = 10.8.0.0/24, 192.168.1.0/24

Dans ce cas, vous devrez aussi autoriser le routage entre l’interface WireGuard et l’interface LAN du serveur.

Ajouter un deuxième client WireGuard

Pour ajouter un deuxième client, générez une nouvelle paire de clés :

sudo sh -c 'umask 077; wg genkey > /etc/wireguard/client2_private.key'
sudo sh -c 'wg pubkey < /etc/wireguard/client2_private.key > /etc/wireguard/client2_public.key'Langage du code : JavaScript (javascript)

Ajoutez ensuite un nouveau bloc [Peer] dans /etc/wireguard/wg0.conf :

[Peer]
PublicKey = CLE_PUBLIQUE_DU_CLIENT_2
AllowedIPs = 10.8.0.3/32

Rechargez la configuration :

sudo systemctl restart wg-quick@wg0Langage du code : CSS (css)

Le deuxième client devra utiliser l’adresse 10.8.0.3/32 dans sa configuration.

Révoquer l’accès d’un client

Pour retirer l’accès d’un appareil, supprimez son bloc [Peer] dans /etc/wireguard/wg0.conf, puis rechargez WireGuard :

sudo systemctl restart wg-quick@wg0Langage du code : CSS (css)

L’accès existe tant que la clé publique du client figure dans la configuration du serveur. Une fois le bloc supprimé, l’appareil ne peut plus établir de tunnel.

Dépannage : le VPN ne se connecte pas

Commencez par vérifier le service WireGuard :

sudo systemctl status wg-quick@wg0Langage du code : CSS (css)

Consultez les logs récents :

sudo journalctl -u wg-quick@wg0 --since "30 minutes ago"Langage du code : CSS (css)

Vérifiez que WireGuard écoute sur le bon port :

sudo ss -lunp | grep 51820

Vérifiez les règles nftables :

sudo nft list rulesetLangage du code : PHP (php)

Enfin, regardez l’état WireGuard :

sudo wg show

Si aucun latest handshake n’apparaît, le client n’atteint probablement pas le serveur. Vérifiez dans cet ordre :

  • l’adresse Endpoint côté client ;
  • le port UDP 51820 ;
  • la redirection de port sur la box ;
  • le pare-feu de l’hébergeur ;
  • la clé publique du client dans wg0.conf ;
  • la clé publique du serveur dans la configuration client.

Dépannage : le VPN se connecte, mais Internet ne fonctionne pas

Si le handshake fonctionne mais que le client n’accède pas à Internet, le problème vient souvent du forwarding, du NAT ou du DNS.

Vérifiez le forwarding IPv4 :

sysctl net.ipv4.ip_forwardLangage du code : CSS (css)

Vérifiez l’interface publique :

ip route show defaultLangage du code : JavaScript (javascript)

Vérifiez les règles NAT :

sudo nft list table ip natLangage du code : PHP (php)

Testez ensuite une adresse IP depuis le client :

ping 1.1.1.1Langage du code : CSS (css)

Puis testez un nom de domaine :

ping skyminds.netLangage du code : CSS (css)

Si l’adresse IP répond mais pas le nom de domaine, le tunnel fonctionne, mais la résolution DNS échoue. Dans ce cas, modifiez la ligne DNS dans la configuration client.

Bonnes pratiques pour maintenir le VPN

  • Créez une configuration différente pour chaque appareil.
  • Ne partagez jamais une clé privée.
  • Supprimez le bloc [Peer] d’un appareil perdu ou remplacé.
  • Gardez Debian et WireGuard à jour.
  • Limitez les ports ouverts au strict nécessaire.
  • Surveillez les logs avec journalctl.
  • Testez toujours vos règles pare-feu avant de les charger.
  • Gardez une session SSH ouverte pendant les changements réseau.

Pour renforcer votre administration serveur, vous pouvez aussi consulter le guide Debian, SSH et commandes bash. Et si votre serveur dépend d’une adresse IP dynamique, le guide sur la création d’une adresse DDNS vous évitera quelques cheveux blancs.

FAQ

WireGuard fonctionne-t-il sur Windows, macOS, Linux, iOS et Android ?

Oui. WireGuard dispose de clients officiels pour les principaux systèmes. Sur mobile, l’import par QR code rend la configuration très rapide.

Quel port faut-il ouvrir pour WireGuard ?

Le port courant est 51820/udp. Vous pouvez utiliser un autre port, mais il faudra le modifier dans la configuration serveur, le pare-feu, la redirection de port et les fichiers clients.

Puis-je installer WireGuard derrière une box Internet ?

Oui, si vous disposez d’une vraie adresse IP publique et si vous redirigez le port UDP WireGuard vers le serveur Debian. Si votre fournisseur utilise du CGNAT, la redirection de port classique ne suffira pas.

Pourquoi mon client affiche un handshake, mais pas d’accès Internet ?

Le handshake prouve que le client et le serveur se parlent. Pour accéder à Internet via le VPN, il faut aussi activer le forwarding IPv4 et configurer correctement le NAT.

Faut-il choisir full tunnel ou split tunnel ?

Choisissez le full tunnel si tout le trafic doit passer par le VPN. Choisissez le split tunnel si vous voulez seulement accéder à un réseau privé, sans modifier votre navigation Internet habituelle.

Conclusion

WireGuard permet de créer un VPN propre et rapide sous Debian avec peu de fichiers, peu de commandes et une maintenance raisonnable.

La clé du succès tient en trois points : des clés bien séparées, un routage clair et un pare-feu cohérent. Quand ces trois éléments sont corrects, le tunnel fonctionne sans histoire.

Ensuite, vous pouvez ajouter de nouveaux clients, passer en split tunnel, donner accès à un réseau local distant ou intégrer ce VPN dans une architecture plus large. WireGuard ne fait pas de bruit. Il fait son travail. C’est déjà beaucoup.

Sources et documentation

Laisser un commentaire