VPN avec WireGuard
Introduction
Wireguard® a été développé comme une alternative plus facile à comprendre aux solutions complexes telles qu’IPSec ou OpenVPN. Wireguard est développé en tant que projet Open Source, avec une base de code actuellement encore plus légère et très performante. Pour le chiffrement, il utilise le système de cryptographie asymétrique “Curve25519”, qui est basé sur des courbes elliptiques. Comme la solution de terminal à distance SSH, Wireguard utilise des clés publiques et privées. Wireguard a été officiellement intégré dans le code source du noyau Linux en janvier 2020 et est directement disponible dans les versions du noyau plus récentes. Il existe des clients Wireguard pour tous les systèmes d’exploitation de bureau et mobiles courants.
Sur un système Linux, Wireguard est intégré en tant que module du noyau et fournit ensuite une interface réseau. Wireguard fonctionne généralement comme un tunnel de couche 3. Il peut transporter des paquets IPv4 et IPv6. Comme moyen de transport, UDP sur IPv4 ou IPv6 est utilisé.
L’interface réseau reçoit ensuite une clé publique et une clé privée, ainsi que la clé publique de la contrepartie. Chaque interface reçoit une adresse IPv4 et/ou IPv6. Wireguard utilise ce qu’on appelle le cryptokey-routing. Les paquets reçus d’une IP source ne seront acceptés que s’ils peuvent être identifiés avec la clé publique enregistrée pour la contrepartie.
Configuration du serveur sur un système Linux
Voici comment configurer un serveur Cloud hosting.fr en tant que passerelle VPN basé sur Debian Linux pour Wireguard. La configuration sur d’autres systèmes Linux peut être similaire.
Nous utilisons l’outil wg-quick pour une configuration simple et rapide du tunnel. Le fichier de configuration pour wg-quick a une syntaxe étendue par rapport à la configuration normale de Wireguard, où, par exemple, les adresses IP peuvent également être indiquées, ce qui signifie qu’elles n’ont pas besoin d’être configurées ailleurs dans le système d’exploitation.
Installation de Wireguard sous Debian
Veuillez exécuter les commandes suivantes pour installer Wireguard sous Debian :
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt update
apt install wireguard
Configuration du serveur
Il faut ensuite générer la clé privée et la clé publique pour le serveur. Cela peut être fait facilement avec les commandes suivantes :
cd /etc/wireguard
umask 077
wg genkey | tee server-private.key | wg pubkey > server-public.key
Maintenant, créez le fichier de configuration /etc/wireguard/wg0.conf pour la nouvelle interface réseau Wireguard wg0 avec le contenu suivant :
[Interface]
Address = 10.42.0.1/24, fd8f:d4dc:9de9::1/64
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
Pour démarrer le tunnel, vous pouvez utiliser la commande :
systemctl start wg-quick@wg0
Après l’exécution de la commande :
systemctl start wg-quick@wg0
Accès Internet pour les clients via le tunnel VPN et NAT avec le serveur comme passerelle
Bien sûr, le tunnel VPN peut être utilisé uniquement pour la communication entre le client et le serveur, ainsi qu’entre les clients. Cependant, souvent, vous souhaiterez également acheminer tout le trafic Internet des clients via le VPN. Cela est particulièrement intéressant pour les appareils mobiles professionnels qui se trouvent souvent dans des réseaux Wi-Fi non sécurisés, par exemple dans des hôtels ou chez des clients. Pour ce faire, vous pouvez configurer une “Translation d’Adresse Réseau” (NAT) sur le serveur afin que les appareils dans le VPN puissent utiliser les adresses IP du serveur.
Modifiez maintenant le fichier /etc/sysctl.conf et ajoutez les lignes suivantes :
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
ou, s’il est déjà commenté, retirez le # pour activer l’option. Pour que la configuration prenne effet, vous devez exécuter la commande :
sudo sysctl -p /etc/sysctl.conf
Pour configurer une Translation d’Adresse Réseau (NAT), veuillez procéder comme suit. À partir de Debian Buster, nftables est utilisé par défaut à la place de iptables pour configurer le pare-feu. Si nftables n’est pas installé, vous devez d’abord l’installer avec :
sudo -s
apt install nftables
systemctl enable nftables.service
Puis, veuillez créer les règles NAT appropriées en ajoutant les lignes suivantes dans le fichier /etc/nftables.conf :
table ip nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip saddr 10.42.0.0/24 oif "ens3" snat to IPV4_IP_DES_SERVERS
}
}
table ip6 nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip6 saddr fd8f:d4dc:9de9::/64 oif "ens3" snat to IPV6_IP_DES_SERVERS
}
}
Remplacez IPV4_IP_DES_SERVERS par l’adresse IPv4 publique de votre serveur et IPV6_IP_DES_SERVERS par l’adresse IPv6 publique du serveur. Le nom de l’interface ens3 peut nécessiter d’être ajusté pour correspondre au nom de l’interface sur laquelle les IP publiques sont configurées. Vous pouvez le découvrir en utilisant ifconfig. Pour activer les nouvelles règles, exécutez les commandes suivantes :
sudo -s
systemctl enable nftables
nft -f /etc/nftables.conf
En utilisant les valeurs 0.0.0.0/0 et ::/0 pour le paramètre AllowedIPs sur le client, l’adresse IP du serveur sera automatiquement définie comme passerelle par défaut sur le client. Si vous ne souhaitez pas que le serveur soit utilisé comme passerelle par défaut du client, vous pouvez ici spécifier des sous-réseaux plus petits, par exemple 10.42.0.0/24 et fd8f:d4dc:9de9::0/64, pour lesquels des routes seront automatiquement établies.
Ajouter un client au serveur
Des adresses IP appropriées sont sélectionnées pour chaque client, par exemple :
10.42.0.2/24fd8f:d4dc:9de9::2/64
(Chaque IP ne peut bien sûr être utilisée qu’une seule fois par client.)
Sur le serveur, les lignes suivantes doivent être ajoutées au fichier /etc/wireguard/wg0.conf pour permettre l’accès au client :
[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.42.0.2/32, fd8f:d4dc:9de9::2/128
Remplacez CLIENT_PUBLIC_KEY par la clé publique du client.
Maintenant, la configuration modifiée doit être chargée sur le serveur. Cela peut se faire avec la commande suivante :
wg addconf wg0 <(wg-quick strip wg0)
Configuration des clients
Génération des clés
Les clés pour le client Wireguard peuvent être générées avec les trois commandes suivantes :
umask 077
wg genkey | tee client-private.key | wg pubkey > client-public.key
Cela peut se faire soit sur le serveur, soit sur le client. La clé privée du client est uniquement nécessaire sur celui-ci. Il est donc généralement plus sûr de la générer directement sur le client. Une fois que les clés ont été générées et inscrites dans le fichier de configuration de Wireguard, le fichier contenant la clé privée peut être supprimé.
Linux
Voici la configuration d’un client Linux sous Debian. Veuillez installer Wireguard comme décrit dans l’installation du serveur. Générez les clés sur le client avec les commandes comme décrit ci-dessus. Devenez root en exécutant sudo -s et en saisissant votre mot de passe.
Veuillez créer le fichier de configuration /etc/wireguard/wg0.conf pour le client :
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.42.0.2/24, fd8f:d4dc:9de9::2/64
ListenPort = 51820
DNS = 208.67.222.222,208.67.220.220
[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = demoserver.mustermann-domain.fr:51820
PersistentKeepalive = 25
Remplacez SERVER_PUBLIC_KEY par la clé publique du serveur, qui a été générée, et CLIENT_PRIVATE_KEY par la clé privée, qui a été générée sur le client. Remplacez demoserver.mustermann-domain.fr par le nom d’hôte du serveur.
Le tunnel sur le client peut maintenant être démarré à l’aide de systemd :
systemctl start wg-quick@wg0
Pour démarrer le client au démarrage du système, vous pouvez exécuter la commande suivante :
systemctl enable wg-quick@wg0
Android et iOS
Le fichier de configuration pour Android et iOS peut ressembler à ceci :
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.42.0.3/24, fd8f:d4dc:9de9::3/48
ListenPort = 51820
DNS = 208.67.222.222,208.67.220.220
[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/24, ::/0
Endpoint = demoserver.mustermann-domain.fr:51820
PersistentKeepalive = 25
La configuration pour le client Android et iOS est identique à celle du client de bureau Linux. Veuillez insérer vos clés générées et les adresses IP appropriées. Enregistrez le fichier par exemple sous le nom “wg0.conf”. Si vous souhaitez importer le fichier dans le client Android, le nom du fichier de configuration doit respecter les règles des noms d’interfaces réseau du noyau Linux. Cela signifie que le nom de fichier doit se terminer par “.conf” et ne peut contenir que jusqu’à 16 caractères avant le point, sans “/” et sans espaces.
Pour un transfert facile sur un smartphone ou une tablette, vous pouvez créer un code QR à partir du fichier de configuration. Sous Linux, cela peut se faire après l’installation de l’outil qrencode, par exemple sous Debian avec :
sudo apt install qrencode
en exécutant la commande suivante :
qrencode -t ansiutf8 < wg0.conf
Android
Veuillez installer l’application Wireguard depuis le Play Store. Scannez ensuite le code QR avec l’application ou importez le fichier de configuration en choisissant l’une des options suivantes :

Après l’importation de la configuration via le code QR ou en tant que fichier, la nouvelle interface apparaît et peut être activée via le curseur :

En cliquant sur l’interface, vous obtenez des informations détaillées sur la connexion :

iOS
Veuillez installer l’application depuis l’App Store. Scannez ensuite le code QR avec l’application ou importez le fichier de configuration. Cliquez pour cela sur “Ajouter un tunnel” ou sur le “+” et sélectionnez l’option “Créer à partir du code QR” :

Vous pouvez ensuite attribuer un nom au tunnel. Après importation, vous pouvez activer le tunnel via un curseur. Si vous cliquez ensuite sur le tunnel, vous pouvez également obtenir des informations supplémentaires à son sujet :

Références
- Site officiel de Wireguard
- Paper de Wireguard, Jason A. Donenfeld
- Documentation sur wg-quick, Jason A. Donenfeld
- Référence rapide - nftables en 10 minutes, netfilter.org