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).
root@host:~# apt update && apt install wireguard
# 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
root@host:~# cd /etc/wireguard/
root@host:~# umask 077
root@host:~# wg genkey > wg-private.key
root@host:~# wg pubkey < wg-private.key > w11-client01.key
root@host:~# cat wg-private.key
2GIURzIDBgI1Y+1Ei+i2C5kEOR53mH172MaidaVpD3M=
# 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
root@host:~# reboot
root@host:~# cat /etc/wireguard/w11-client01.key
hlKy6azGCB0uVbCdkW8Htx23k57iWzOFJRLAYHTx5wU=
[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
Le serveur nécessite maintenant une configuration supplémentaire pour autoriser la connexion.
root@host:~# ifup wg0
root@host:~# wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 0.0.0.0/0
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
# 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
À 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.
net.ipv4.ip_forward = 1
root@host:~# sysctl -p /etc/sysctl.conf
root@host:~# cat /proc/sys/net/ipv4/ip_forward
1
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.
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
Voici comment activer la translation d'adresses (NAT) à l’aide de règles nftables temporaires.
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
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
#!/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"
}
}
root@host:~# systemctl enable nftables.service
root@host:~# nft -f /etc/nftables.conf
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.
root@host:~# modprobe -r wireguard && modprobe wireguard dyndbg
root@host:~# ifdown wg0; ifup wg0
root@host:~# journalctl -f --grep wireguard
root@host:~# modprobe -r wireguard && modprobe wireguard
root@host:~# ifdown wg0; ifup wg0
Contact :