rss logo

Comment configurer WireGuard VPN sur Debian 12 Bookworm

WireGuard Logo

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'avais déjà travaillé avec WireGuard VPN à l’époque de Debian 11, et la sortie de Debian 12 Bookworm offre l’occasion idéale de mettre à jour et d’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)
    • Rôle : serveur WireGuard + passerelle
  • Client Windows :
    • Système : Windows 11
Schéma de l’architecture VPN WireGuard avec un serveur Debian 12 et un client Windows connecté via un tunnel sécurisé
Architecture réseau WireGuard

Serveur Debian (Partie I)

Logo Debian

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 le umask 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)

Logo Microsoft
  • Téléchargez la dernière version du logiciel depuis le site officiel https://wireguard.com/, puis installez-la.
Capture d’écran du site officiel de WireGuard mettant en évidence le bouton de téléchargement pour l’installateur Windows
  • Ouvrez le client WireGuard VPN :
Recherche et lancement de l’application WireGuard depuis le menu Démarrer de Windows
  • Ajoutez un nouveau profil :
Interface WireGuard sous Windows montrant comment ajouter manuellement une configuration de tunnel vide
  • 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 WireGuard Windows montrant la configuration manuelle d’un tunnel avec clé privée, clé publique du pair et point de terminaison
[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 :
Application WireGuard sous Windows affichant le bouton 'Activer' pour lancer le tunnel VPN

Le serveur nécessite maintenant une configuration supplémentaire pour autoriser la connexion.

Serveur Debian (Partie II)

Logo Debian

WireGuard

  • Activez WireGuard :
root@host:~# ifup wg0
  • Récupérez la clé publique depuis le client Windows 11 :
Tunnel WireGuard actif sur Windows affichant la clé publique et les détails de la configuration du pair
  • 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 :
Invite de commande Windows effectuant un ping avec succès vers l’interface WireGuard Debian à l’adresse IP 10.0.2.1
  • 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

  • Éditez le fichier /etc/sysctl.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.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 :
Terminal Windows affichant un ping réussi vers la passerelle LAN interne à l’adresse 192.168.0.254 via le tunnel VPN

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

Références

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

contact mail address