WireGuard est un protocole VPN de nouvelle génération sous licence GPLv2 (ou MIT, BSD, Apache 2.0 ou GPL suivant le contexte) créé par Jason A. Donenfeld. Le site officiel étant accessible via ce lien : https://www.wireguard.com/.
WireGuard se veut ĂȘtre plus simple, rapide et sĂ©curisĂ© que les protocoles VPN communs que sont OpenVPN et IPsec.
C'est un VPN de niveau 3 du modÚle OSI. C'est-à -dire que c'est la couche Réseau (IP, ICMP, ARP et DHCP principalement) qui est redirigée dans le tunnel VPN. Le client VPN pourra atteindre le réseau distant mais ne sera pas vu comme appartenant directement à ce réseau comme on l'aurait avec un VPN de niveau 2 (par exemple avec OpenVPN et l'utilisation de sa carte TAP).
WireGuard est intégré à partir de la version 5.6 du noyau Linux. Toutes distributions ayant une version égale ou supérieur est donc compatible pour l'utilisation de WireGuard. Si ce n'est pas le cas, à partir du noyau en version 3.10, il est possible de compiler WireGuard avec les informations disponibles ici : https://www.wireguard.com/compilation/.
Une recherche sur Internet pour vĂ©rifier que sa distribution favorite est compatible avec WireGuard est tout de mĂȘme conseillĂ©e.
Pour les autres environnements il est possible d'aller vérifier sur le site WireGuard qu'un portage existe : https://www.wireguard.com/install/. A titre informatif les autres OS principaux sont compatibles à partir de :
Ces informations de compatibilités sont celles annoncées pour la date du 28/06/2021.
WireGuard fonctionne uniquement avec le protocole UDP (ce qui est recommandé pour un VPN afin d'éviter les problÚmes que provoque l'encapsulation TCP dans du TCP).
Aucun port standard n'a été affecté à WireGuard par l'IANA (liste des ports assignés) mais les documentations utilisent généralement le port 51820.
Utiliser un port aussi élevé est souvent bloqué par les pare-feux professionnels, il vaut mieux utiliser un port plus bas réservé pour un protocole UDP. Dans ce cas seuls des pare-feu de niveau 7 pourront encore poser problÚme.
Le nouveau concept central autour du protocole WireGuard est celui du routage cryptographique. Le routage cryptographique associe des adresses IP ou des sous-réseaux à des clefs publiques.
Les clefs cryptographiques fonctionnent à peu prÚs comme celles que l'on retrouve avec le protocole SSH : une paire de clef, l'une dite privé et l'autre publique, sont utilisées afin d'utiliser des mécanismes de chiffrement asymétrique.
Admettons la configuration suivante :
| IP source | IP WireGuard | Clef privée | Clef publique | |
|---|---|---|---|---|
| Serveur | 1.2.3.4/32 | 10.0.0.254/24 | ABC | XYZ |
| Client | 6.7.8.9/32 | 10.0.0.1/24 | 123 | 789 |
Du cÎté du serveur une association entre l'IP WireGuard du client, 10.0.0.1/24, sera faite avec sa clef publique, 789. Le traitement des paquets du cÎté du serveur seront traités comme ceci :
A noter que l'exemple est trĂšs simpliste, en condition rĂ©elle une clef privĂ©e peut ĂȘtre associĂ©e Ă diffĂ©rentes IP ou rĂ©seaux pour l'interface WireGuard. De mĂȘme plusieurs clients sont en gĂ©nĂ©ral rattachĂ©s Ă un serveur, la non duplication des routes ou adresses est essentielle pour ne pas causer des problĂšmes de routage ainsi que des difficultĂ©s pour retrouver la clef publique du client.
Cette section installation et configuration va globalement se focaliser sur Linux car WireGuard a été conçu pour ce dernier. Les compatibilités avec les autres OS étant des portages du code de base il vous faudra chercher les spécificités liées à votre OS si les indications suivantes ne sont pas suffisantes.
Les projets créés pour piloter un WireGuard avec des outils et interfaces plus conviviales et abstractives seront aussi omises de cet article.
Comme indiqué dans la section Quels sont les prérequis ? il vous faudra un OS Linux avec un noyau de version supérieure ou égale à 5.6.
Les installations les plus communes sont listées sur le site de WireGuard : https://www.wireguard.com/install/.
Par exemple pour un Ubuntu l'installation se réalisera avec la simple commande suivante :
sudo apt install wireguard
Les mĂ©canismes d'authentification de WireGuard se basant sur l'usage de clefs publique et privĂ© il vous faut les gĂ©nĂ©rer avant de passer Ă la configuration du serveur. Les outils WireGuard proposent de se charger de leur gĂ©nĂ©ration, la clef privĂ©e peut ĂȘtre gĂ©nĂ©rĂ©e avec la commande suivante :
wg genkey
Il est préférable d'enregistrer le résultat directement dans un fichier avec une redirection de ce type :
wg genkey > clef_privee
La clef privĂ©e ne devant pas ĂȘtre accessible par d'autres utilisateurs il est fortement recommandĂ© d'appliquer un droit de lecture/Ă©criture seulement pour l'utilisateur propriĂ©taire (
chmod 0600 clef_privee).
La clef publique est générée à l'aide de la clef privée avec la commande suivante (attention à la double redirection à modifier si le nom des fichiers est différent de votre cÎté) :
wg pubkey < clef_privee > clef_public
Nous pouvons raccourcir ces générations de clefs via la seule commande suivante :
wg genkey | tee clef_privee | wg pubkey > clef_public && chmod 0600 clef_privee
wg-quick est un utilitaire fourni avec WireGuard qui permet de rapidement configurer une interface WireGuard en se basant sur le contenu d'un fichier de configuration. Les fichiers de configurations sont d'abord recherchés dans /etc/wireguard/ et sont nommés <INTERFACE>.conf. Habituellement nous retrouvons comme nom wg0 avec son fichier de configuration /etc/wireguard/wg0.conf, la suite des commandes se basera sur cette configuration.
L'utilisation de la commande
wg-quickne nécessite pas forcément de placer les fichiers de configurations dans /etc/wireguard/.
Le nom des interfaces sous Linux ne doivent pas dépasser 15 caractÚres. Le nom de l'interface sera valide avec la forme suivante [a-zA-Z0-9_=+.-]{1,15}.
Voici un exemple de fichier de configuration annotée pour expliquer les différents champs :
# Configuration de l'interface WireGuard du serveur pour une utilisation avec wg-quick.
[Interface]
# Définition de l'adresse IP (IPv4 ou IPv6) d'écoute pour l'interface WireGuard.
# L'adresse doit ĂȘtre de la forme IP/MASQUE (exemple : 172.18.10.254/24).
# Il est possible d'ajouter plus d'une adresse sur l'interface WireGuard.
Address = ADDRESS1
#Address = ADDRESS2
# (Optionnel) Ajouter les serveurs DNS affectés à l'interface WireGuard.
# Plusieurs DNS peuvent ĂȘtre dĂ©finis en les sĂ©parant par des virgules.
#DNS = DNS1, DNS2
# (Optionnel) Lors de l'arrĂȘt de l'interface WireGuard sa configuration sera enregistrĂ©e en Ă©crasant le fichier de configuration.
#SaveConfig = true
# (Optionnel) Commandes Ă exĂ©cuter avant/aprĂšs le dĂ©marrage ou l'arrĂȘt de l'interface WireGuard.
# %i sera remplacé par le nom de l'interface WireGuard.
# Ces options sont en générales utilisées pour définir des options particuliÚres de DNS, pare-feu ou NAT.
#PreUp =
#PostUp =
#PreDown =
#PostDown =
# (Optionnel) Si l'ajout des routes de l'interface WireGuard doit ĂȘtre rĂ©alisĂ©e dans une table particuliĂšre il est possible de la dĂ©finir ici.
# Le paramÚtre "off" désactive la création des routes, par défaut c'est "auto" qui est utilisé.
#Table = auto
# (Optionnel) Ajoute un marquage des paquets sortant.
# Si défini à 0 ou "off" ce mécanisme sera désactivé.
# Il est possible de définir la valeur en hexadécimale en la préfixant de "0x".
#FwMark = off
# (Optionnel) Port d'écoute du serveur WireGuard.
# Si non défini ce sera un port aléatoire disponible qui sera utilisé.
#ListenPort = 51820
# (Optionnel) Définition manuelle du MTU de l'interface WireGuard.
# Avec la surencapsultation de WireGuard le MTU doit ĂȘtre au maximum Ă©gale au MTU normal de l'interface locale moins 60 octets pour de l'IPv4 et moins 80 pour de l'IPv6.
#MTU = 1420
# Clef privée de l'interface WireGuard.
# Exemple : yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
PrivateKey = PRIVATE_KEY
# Configuration des pairs pouvant se connecter au serveur.
# Création d'autant de [Peer] qu'il y a de pairs identifiés avec une clef publique à connecter.
[Peer]
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagĂ©e entre le serveur et le pair, cette clef doit ĂȘtre issue de wg genpsk.
# Cette option a pour but d'ajouter une couche supplémentaire de chiffrement symétrique pour une résistance théorique post-quantique.
#PresharedKey = PRESHAREDKEY_PEER_1
# Liste des IPs ou réseaux associés au pair séparés par des virgules.
# Doit ĂȘtre de la forme IP/MASQUE (172.18.10.254/24) ou RESEAU/MASQUE (172.18.10.0/24).
# L'utilisation du rĂ©seau 0.0.0.0/0 ou ::/0 indique que tout le trafic doit ĂȘtre redirigĂ© vers le pair. Dans ce cas un seul pair peut ĂȘtre dĂ©fini.
AllowedIPs = ALLOWED_IP_1_PEER_1, ALLOWED_IP_2_PEER_1
# (Optionnel) Permet d'envoyer des paquets vides Ă l'hĂŽte au bout de x secondes (entre 1 et 65535).
# Cette option est à activer si les pare-feux ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
#PersistentKeepalive = off
# (Optionnel) Défini l'adresse IP du pair.
# Ce paramĂštre sera automatiquement mis Ă jour par WireGuard dans tous les cas.
# Le paramĂštre est de la forme IP:PORT ou NOM:PORT.
#Endpoint = ENDPOINT_PEER_1
#[Peer]
#PublicKey = PUBLIC_KEY_PEER_2
#PresharedKey = PRESHAREDKEY_PEER_2
#AllowedIPs = ALLOWED_IP_1_PEER_2, ALLOWED_IP_2_PEER_2
#PersistentKeepalive = off
#Endpoint = ENDPOINT_PEER_2
Une fois la configuration prĂȘte il ne reste plus qu'Ă dĂ©marrer WireGuard avec la commande suivante s'il faut prĂ©ciser un fichier de configuration :
wg-quick up /etc/wireguard/wg0.conf
Il est aussi possible de préciser simplement le nom de l'interface à démarrer (sous-entend qu'un fichier .conf soit présent dans /etc/wireguard/) :
wg-quick up wg0
Pour arrĂȘter l'interface WireGuard il suffit de remplacer wg-quick up par wg-quick down :
wg-quick down wg0
wg-quick dĂ©ploie aussi le nĂ©cessaire afin de l'utiliser via systemd et la commande systemctl. Il est donc possible de dĂ©marrer, arrĂȘter ainsi que de dĂ©marrer automatiquement un tunnel WireGuard.
Pour fonctionner il faut impérativement renseigner les fichiers de configurations dans /etc/wireguard/.
Pour démarrer un tunnel il faudra utiliser la commande suivante (en remplaçant le nom de l'interface par la votre) :
systemctl start wg-quick@wg0
Vous pouvez vérifier l'état de fonctionnement du service avec :
systemctl status wg-quick@wg0
Pour que le service démarre au démarrage du systÚme ce sera la commande suivante à renseigner :
systemctl enable wg-quick@wg0
Pour arrĂȘter le service ce sera la commande suivante :
systemctl stop wg-quick@wg0
Pour supprimer le démarrage automatique ce sera :
systemctl disable wg-quick@wg0
La configuration manuelle d'une interface WireGuard est parfaitement possible et les étapes suivantes seront à réaliser (en plus de l'installation et génération des clefs) :
Suite Ă ces actions d'autres configurations pourraient ĂȘtre mise en place :
Le fichier de configuration WireGuard ressemble fortement Ă celui de wg-quick avec seulement certaines options qui ne sont pas disponibles :
# Configuration de l'interface WireGuard du serveur.
[Interface]
# (Optionnel) Ajoute un marquage des paquets sortant.
# Si défini à 0 ou "off" ce mécanisme sera désactivé.
# Il est possible de définir la valeur en hexadécimale en la préfixant de "0x".
#FwMark = off
# (Optionnel) Port d'écoute du serveur WireGuard.
# Si non défini ce sera un port aléatoire disponible qui sera utilisé.
#ListenPort = 51820
# Clef privée de l'interface WireGuard.
# Exemple : yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
PrivateKey = PRIVATE_KEY
# Configuration des pairs pouvant se connecter au serveur.
# Création d'autant de [Peer] qu'il y a de pairs identifiés avec une clef publique à connecter.
[Peer]
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagĂ©e entre le serveur et le pair, cette clef doit ĂȘtre issue de wg genpsk.
# Cette option a pour but d'ajouter une couche supplémentaire de chiffrement symétrique pour une résistance théorique post-quantique.
#PresharedKey = PRESHAREDKEY_PEER_1
# Liste des IPs ou réseaux associés au pair séparés par des virgules.
# Doit ĂȘtre de la forme IP/MASQUE (172.18.10.254/24) ou RESEAU/MASQUE (172.18.10.0/24).
# L'utilisation du rĂ©seau 0.0.0.0/0 ou ::/0 indique que tout le trafic doit ĂȘtre redirigĂ© vers le pair. Dans ce cas un seul pair peut ĂȘtre dĂ©fini.
AllowedIPs = ALLOWED_IP_1_PEER_1, ALLOWED_IP_2_PEER_1
# (Optionnel) Permet d'envoyer des paquets vides Ă l'hĂŽte au bout de x secondes (entre 1 et 65535).
# Cette option est à activer si les pare-feux ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
#PersistentKeepalive = off
# (Optionnel) Défini l'adresse IP du pair.
# Ce paramĂštre sera automatiquement mis Ă jour par WireGuard dans tous les cas.
# Le paramĂštre est de la forme IP:PORT ou NOM:PORT.
#Endpoint = ENDPOINT_PEER_1
#[Peer]
#PublicKey = PUBLIC_KEY_PEER_2
#PresharedKey = PRESHAREDKEY_PEER_2
#AllowedIPs = ALLOWED_IP_1_PEER_2, ALLOWED_IP_2_PEER_2
#PersistentKeepalive = off
#Endpoint = ENDPOINT_PEER_2
L'utilisation du fichier de configuration n'est pas obligatoire, la configuration peut ĂȘtre poussĂ©e via des options et arguments de la commande
wg. Vous pouvez lire le manuel pour plus d'informations : man 8 wg.
Une fois le fichier de configuration créé et en place les commandes suivantes peuvent ĂȘtre exĂ©cutĂ©es pour crĂ©er et activer le tunnel WireGuard. A noter que des modifications seront peut-ĂȘtre nĂ©cessaire car le nom de l'interface créée sera wg0 avec un fichier de configuration /etc/wireguard/wg0.conf :
ip link add dev wg0 type wireguard
ip address add dev wg0 172.18.10.254/24
wg setconf wg0 /etc/wireguard/wg0.conf
ip link set up dev wg0
ip route add ALLOWED_IP_1_PEER_1 dev wg0
ip route add ALLOWED_IP_2_PEER_1 dev wg0
Notez bien que toutes les routes renseignĂ©es dans le fichier de configuration au niveau des diffĂ©rents pairs doivent ĂȘtre routĂ©es sur votre interface WireGuard, cela peut ĂȘtre rĂ©alisĂ© en rĂ©pĂ©tant plusieurs fois la derniĂšre commande.
Si vous définissez manuellement le MTU de l'interface WireGuard tùchez de soustraire 60 octets de votre MTU normal pour de l'IPv4 ou de soustraire 80 octets pour de l'IPv6.
L'utilisation d'un tunnel provoque une surencapsulation qui réduit le MTU, si ce dernier était égale ou supérieur au MTU normal alors un paquet utile sera découpé en deux paquets.
Pour rappel si l'activation du routage des paquets entrant est souhaité (fonctionner comme un routeur) il faudra lancer les commandes suivantes :
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.ip_forward=1
Pour rendre cette configuration permanente vous pouvez placer les paramĂštres suivants dans /etc/sysctl.conf et recharger la configuration avec sysctl -p /etc/sysctl.conf :
net.ipv4.ip_forward=1
net.ipv6.ip_forward=1
WireGuard, avec la commande wg, permet de récupérer plusieurs informations sur l'état actuel des interfaces. Si la commande wg est lancée seule alors c'est un équivalent de wg show all qui détaillera les informations de toutes les interfaces WireGuard.
L'affichage des informations de configuration d'une interface particuliĂšre a pour commande :
wg showconf wg0
L'affichage des informations d'un interface particuliÚre rajoutera les informations d'heure de derniÚre connexion du pair, mais aussi sa consommation de données :
wg show wg0
Pour toutes informations complémentaires sur les options non citées le manuel est disponible ici : man 8 wg.
WireGuard ne différenciant pas un client d'un serveur cette section est identique à celle de la configuration du serveur.
L'installation du client est identique à celle du serveur, par conséquent les prérequis de la section Quels sont les prérequis ? s'appliquent aussi. Il vous faudra un OS Linux avec un noyau de version supérieure ou égale à 5.6.
Les installations les plus communes sont listées sur le site de WireGuard : https://www.wireguard.com/install/.
Par exemple pour un Ubuntu l'installation se réalisera avec la simple commande suivante :
sudo apt install wireguard
WireGuard ne différenciant pas un client d'un serveur cette section est identique à celle de la configuration du serveur.
Les mĂ©canismes d'authentification de WireGuard se basant sur l'usage de clefs publique et privĂ© il vous faut les gĂ©nĂ©rer avant de passer Ă la configuration du serveur. Les outils WireGuard proposent de se charger de leur gĂ©nĂ©ration, la clef privĂ©e peut ĂȘtre gĂ©nĂ©rĂ©e avec la commande suivante :
wg genkey
Il est préférable d'enregistrer le résultat directement dans un fichier avec une redirection de ce type :
wg genkey > clef_privee
La clef privĂ©e ne devant pas ĂȘtre accessible par d'autres utilisateurs il est fortement recommandĂ© d'appliquer un droit de lecture/Ă©criture seulement pour l'utilisateur propriĂ©taire (
chmod 0600 clef_privee).
La clef publique est générée à l'aide de la clef privée avec la commande suivante (attention à la double redirection à modifier si le nom des fichiers est différent de votre cÎté) :
wg pubkey < clef_privee > clef_public
Nous pouvons raccourcir ces générations de clefs via la seule commande suivante :
wg genkey | tee clef_privee | wg pubkey > clef_public && chmod 0600 clef_privee
WireGuard ne diffĂ©renciant pas un client d'un serveur cette section est identique Ă celle de la configuration du serveur, le fichier d'exemple a tout de mĂȘme Ă©tĂ© modifiĂ© dans ses annotations pour avoir une configuration plus spĂ©cifique pour les clients (le paramĂštre Endpoint des pairs est obligatoire par exemple).
wg-quick est un utilitaire fourni avec WireGuard qui permet de rapidement configurer une interface WireGuard en se basant sur le contenu d'un fichier de configuration. Les fichiers de configurations sont d'abord recherchés dans /etc/wireguard/ et sont nommés <INTERFACE>.conf. Habituellement nous retrouvons comme nom wg0 avec son fichier de configuration /etc/wireguard/wg0.conf, la suite des commandes se basera sur cette configuration.
L'utilisation de la commande
wg-quickne nécessite pas forcément de placer les fichiers de configurations dans /etc/wireguard/.
Le nom des interfaces sous Linux ne doivent pas dépasser 15 caractÚres. Le nom de l'interface sera valide avec la forme suivante [a-zA-Z0-9_=+.-]{1,15}.
Voici un exemple de fichier de configuration annotée pour expliquer les différents champs :
# Configuration de l'interface WireGuard du serveur pour une utilisation avec wg-quick.
[Interface]
# Définition de l'adresse IP (IPv4 ou IPv6) d'écoute pour l'interface WireGuard.
# L'adresse doit ĂȘtre de la forme IP/MASQUE (exemple : 172.18.10.254/24).
# Il est possible d'ajouter plus d'une adresse sur l'interface WireGuard mais c'est rarement utile pour une configuration cliente.
Address = ADDRESS1
#Address = ADDRESS2
# (Optionnel) Ajouter les serveurs DNS affectés à l'interface WireGuard.
# Plusieurs DNS peuvent ĂȘtre dĂ©finis en les sĂ©parant par des virgules.
#DNS = DNS1, DNS2
# (Optionnel) Lors de l'arrĂȘt de l'interface WireGuard sa configuration sera enregistrĂ©e en Ă©crasant le fichier de configuration.
#SaveConfig = true
# (Optionnel) Commandes Ă exĂ©cuter avant/aprĂšs le dĂ©marrage ou l'arrĂȘt de l'interface WireGuard.
# %i sera remplacé par le nom de l'interface WireGuard.
# Ces options sont en générales utilisées pour définir des options particuliÚres de DNS, pare-feu ou NAT.
#PreUp =
#PostUp =
#PreDown =
#PostDown =
# (Optionnel) Si l'ajout des routes de l'interface WireGuard doit ĂȘtre rĂ©alisĂ©e dans une table particuliĂšre il est possible de la dĂ©finir ici.
# Le paramÚtre "off" désactive la création des routes, par défaut c'est "auto" qui est utilisé.
#Table = auto
# (Optionnel) Ajoute un marquage des paquets sortant.
# Si défini à 0 ou "off" ce mécanisme sera désactivé.
# Il est possible de définir la valeur en hexadécimale en la préfixant de "0x".
#FwMark = off
# (Optionnel) Port d'écoute du serveur WireGuard.
# Si non défini ce sera un port aléatoire disponible qui sera utilisé.
# Pour une configuration cliente l'utilisation d'un port aléatoire convient parfaitement.
#ListenPort = 51820
# (Optionnel) Définition manuelle du MTU de l'interface WireGuard.
# Avec la surencapsultation de WireGuard le MTU doit ĂȘtre au maximum Ă©gale au MTU normal de l'interface locale moins 60 octets pour de l'IPv4 et moins 80 pour de l'IPv6.
#MTU = 1420
# Clef privée de l'interface WireGuard.
# Exemple : yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
PrivateKey = PRIVATE_KEY
# Configuration des pairs auxquels le client se connectera.
# Le pair correspond à un serveur WireGuard, en général un seul est défini.
# Création d'autant de [Peer] qu'il y a de pairs identifiés avec une clef publique à connecter.
[Peer]
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagĂ©e entre le serveur et le pair, cette clef doit ĂȘtre issue de wg genpsk.
# Cette option a pour but d'ajouter une couche supplémentaire de chiffrement symétrique pour une résistance théorique post-quantique.
#PresharedKey = PRESHAREDKEY_PEER_1
# Liste des IPs ou réseaux associés au pair séparés par des virgules.
# Doit ĂȘtre de la forme IP/MASQUE (172.18.10.254/24) ou RESEAU/MASQUE (172.18.10.0/24).
# L'utilisation du rĂ©seau 0.0.0.0/0 ou ::/0 indique que tout le trafic doit ĂȘtre redirigĂ© vers le pair. Dans ce cas un seul pair peut ĂȘtre dĂ©fini.
# C'est cette option qui définira les routes devant passer par le tunnel WireGuard.
AllowedIPs = ALLOWED_IP_1_PEER_1, ALLOWED_IP_2_PEER_1
# (Optionnel) Permet d'envoyer des paquets vides Ă l'hĂŽte au bout de x secondes (entre 1 et 65535).
# Cette option est à activer si les pare-feux ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
#PersistentKeepalive = off
# Défini l'adresse IP du pair.
# Le paramÚtre est de la forme IP:PORT ou NOM:PORT et défini le serveur WireGuard vers lequel se connecter.
Endpoint = ENDPOINT_PEER_1
#[Peer]
#PublicKey = PUBLIC_KEY_PEER_2
#PresharedKey = PRESHAREDKEY_PEER_2
#AllowedIPs = ALLOWED_IP_1_PEER_2, ALLOWED_IP_2_PEER_2
#PersistentKeepalive = off
#Endpoint = ENDPOINT_PEER_2
Une fois la configuration prĂȘte il ne reste plus qu'Ă dĂ©marrer WireGuard avec la commande suivante s'il faut prĂ©ciser un fichier de configuration :
wg-quick up /etc/wireguard/wg0.conf
Il est aussi possible de préciser simplement le nom de l'interface à démarrer (sous-entend qu'un fichier .conf soit présent dans /etc/wireguard/) :
wg-quick up wg0
Pour arrĂȘter l'interface WireGuard il suffit de remplacer wg-quick up par wg-quick down :
wg-quick down wg0
WireGuard ne différenciant pas un client d'un serveur cette section est identique à celle de la configuration du serveur.
wg-quick dĂ©ploie aussi le nĂ©cessaire afin de l'utiliser via systemd et la commande systemctl. Il est donc possible de dĂ©marrer, arrĂȘter ainsi que de dĂ©marrer automatiquement un tunnel WireGuard.
Pour fonctionner il faut impérativement renseigner les fichiers de configurations dans /etc/wireguard/.
Pour démarrer un tunnel il faudra utiliser la commande suivante (en remplaçant le nom de l'interface par la votre) :
systemctl start wg-quick@wg0
Vous pouvez vérifier l'état de fonctionnement du service avec :
systemctl status wg-quick@wg0
Pour que le service démarre au démarrage du systÚme ce sera la commande suivante à renseigner :
systemctl enable wg-quick@wg0
Pour arrĂȘter le service ce sera la commande suivante :
systemctl stop wg-quick@wg0
Pour supprimer le démarrage automatique ce sera :
systemctl disable wg-quick@wg0
WireGuard ne différenciant pas un client d'un serveur cette section est identique à celle de la configuration du serveur à l'exception du paramÚtre Endpoint qui est obligatoire. Le fichier de configuration d'exemple a été adapté à une configuration cliente avec quelques annotations supplémentaires.
La configuration manuelle d'une interface WireGuard est parfaitement possible et les étapes suivantes seront à réaliser (en plus de l'installation et génération des clefs) :
Le fichier de configuration WireGuard ressemble fortement Ă celui de wg-quick avec seulement certaines options qui ne sont pas disponibles :
# Configuration de l'interface WireGuard du serveur.
[Interface]
# (Optionnel) Ajoute un marquage des paquets sortant.
# Si défini à 0 ou "off" ce mécanisme sera désactivé.
# Il est possible de définir la valeur en hexadécimale en la préfixant de "0x".
#FwMark = off
# (Optionnel) Port d'écoute du serveur WireGuard.
# Si non défini ce sera un port aléatoire disponible qui sera utilisé.
# Pour une configuration cliente l'utilisation d'un port aléatoire convient parfaitement.
#ListenPort = 51820
# Clef privée de l'interface WireGuard.
# Exemple : yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
PrivateKey = PRIVATE_KEY
# Configuration des pairs auxquels le client se connectera.
# Le pair correspond à un serveur WireGuard, en général un seul est défini.
# Création d'autant de [Peer] qu'il y a de pairs identifiés avec une clef publique à connecter.
[Peer]
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagĂ©e entre le serveur et le pair, cette clef doit ĂȘtre issue de wg genpsk.
# Cette option a pour but d'ajouter une couche supplémentaire de chiffrement symétrique pour une résistance théorique post-quantique.
#PresharedKey = PRESHAREDKEY_PEER_1
# Liste des IPs ou réseaux associés au pair séparés par des virgules.
# Doit ĂȘtre de la forme IP/MASQUE (172.18.10.254/24) ou RESEAU/MASQUE (172.18.10.0/24).
# C'est cette option qui définira les routes autorisées pour contacter le pair.
AllowedIPs = ALLOWED_IP_1_PEER_1, ALLOWED_IP_2_PEER_1
# (Optionnel) Permet d'envoyer des paquets vides Ă l'hĂŽte au bout de x secondes (entre 1 et 65535).
# Cette option est à activer si les pare-feux ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
#PersistentKeepalive = off
# Défini l'adresse IP du pair.
# Le paramÚtre est de la forme IP:PORT ou NOM:PORT et défini le serveur WireGuard vers lequel se connecter.
Endpoint = ENDPOINT_PEER_1
#[Peer]
#PublicKey = PUBLIC_KEY_PEER_2
#PresharedKey = PRESHAREDKEY_PEER_2
#AllowedIPs = ALLOWED_IP_1_PEER_2, ALLOWED_IP_2_PEER_2
#PersistentKeepalive = off
#Endpoint = ENDPOINT_PEER_2
L'utilisation du fichier de configuration n'est pas obligatoire, la configuration peut-ĂȘtre poussĂ©e via des options et arguments de la commande
wg. Vous pouvez lire le manuel pour plus d'informations : man 8 wg.
Une fois le fichier de configuration créé et en place les commandes suivantes peuvent ĂȘtre exĂ©cutĂ©es pour crĂ©er et activer le tunnel WireGuard. A noter que des modifications seront peut-ĂȘtre nĂ©cessaire car le nom de l'interface créée sera wg0 avec un fichier de configuration /etc/wireguard/wg0.conf :
ip link add dev wg0 type wireguard
ip address add dev wg0 172.18.10.254/24
wg setconf wg0 /etc/wireguard/wg0.conf
ip link set up dev wg0
ip route add ALLOWED_IP_1_PEER_1 dev wg0
ip route add ALLOWED_IP_2_PEER_1 dev wg0
Noter bien que toutes les routes renseignĂ©es dans le fichier de configuration au niveau des diffĂ©rents pairs doivent ĂȘtre routĂ©es sur votre interface WireGuard, cela peut ĂȘtre rĂ©alisĂ© en rĂ©pĂ©tant plusieurs fois la derniĂšre commande.
Si vous définissez manuellement le MTU de l'interface WireGuard tùchez de soustraire 60 octets de votre MTU normal pour de l'IPv4 ou de soustraire 80 octets pour de l'IPv6.
L'utilisation d'un tunnel provoque une surencapsulation qui réduit le MTU, si ce dernier était égale ou supérieur au MTU normal alors un paquet utile sera découpé en deux paquets.
Cet article n'a pas vocation à approfondir totalement la notion d'espace de nom réseau mais de nombreux autres articles existent ou sinon vous pouvez vous penchez sur le man 8 ip-netns.
WireGuard propose une autre méthode pour gérer les accÚs des différents process au tunnel WireGuard : l'utilisation des espaces de noms réseaux (network namespaces). Un espace de nom réseau regroupe des interfaces réseaux et les rÚgles qui les entourent (routage, acl, pare-feu) ainsi que des processus.
Par défaut un espace de nom est créé à chaque démarrage du systÚme et se nomme 1 en référence au process init qui en est à l'origine et qui possÚde le PID 1. Tous les autres process (ou presque) appartiendront à cet espace de nom.
WireGuard tire un avantage de cette fonctionnalitĂ© car une mĂ©moire de l'espace de nom rĂ©seau dans lequel une interface WireGuard a Ă©tĂ© créée est conservĂ©e. Le tunnel WireGuard sera toujours créé Ă partir de l'espace de nom oĂč l'interface a Ă©tĂ© créée mĂȘme si l'interface a Ă©tĂ© migrĂ©e vers un autre espace de nom rĂ©seau.
Un exemple de configuration donné sur le site de WireGuard est de créer un nouvel espace de nom pour y placer les interfaces réseaux physiques, créer un tunnel WireGuard et le placer dans l'espace de nom réseau 1 afin que tous les processus systÚmes utilisent le tunnel WireGuard et pas les interfaces physiques. La configuration suit les étapes suivantes :
Les commandes qui seraient utilisées pour arriver à ce résultat ressembleraient à ceci :
ip netns add lien_physique
ip link set eth0 netns lien_physique
ip -n lien_physique link add wg0 type wireguard
ip -n lien_physique link set wg0 netns 1
wg setconf wg0 /etc/wireguard/wg0.conf
ip addr add 172.18.10.254/24 dev wg0
ip link set up wg0
ip route add default dev wg0
D'autres cas d'utilisations peuvent ĂȘtre envisagĂ©s : crĂ©er l'interface WireGuard dans l'espace de nom 1 puis la dĂ©placer dans un autre espace de nom oĂč un processus particulier doit ĂȘtre le seul Ă utiliser le tunnel. Ce cas d'usage pourrait trĂšs bien correspondre Ă un container docker, ou au besoin d'isoler un processus devant avoir des accĂšs rĂ©seaux particuliers, forcer un processus utilisant des communications non chiffrĂ©es Ă passer au travers du tunnel WireGuard, etc.
Globalement c'est l'inverse de l'exemple précédent et les commandes pour y arriver seraient :
ip netns add wireguard_ns
ip link add wg0 type wireguard
ip link set wg0 netns wireguard_ns
ip netns exec wireguard_ns wg setconf wg0 /etc/wireguard/wg0.conf
ip -n wireguard_ns addr add 172.18.10.254/24 dev wg0
ip -n wireguard_ns link set up wg0
ip -n wireguard_ns route add default dev wg0
Pour l'installation des clients des autres OS il vaut mieux se référer à la page regroupant les différentes installations de WireGuard et suivre les indications qui y sont présentes et qui sont maintenues à jour.
La configuration sur les autres OS que Linux dépend grandement de comment ils ont été implémentés et s'ils disposent de configurations guidées ou non. Globalement la création ou l'importation de fichier de configuration comme ceux de la configuration manuelle d'un client sont toujours proposés.
Pour les clients mobiles, Android et iOS, une fonctionnalité d'import de configuration via un QR code est disponible. Il est trÚs simple de générer un QR code à partir de son fichier de configuration, l'auteur de cet article génÚre à la volée des QR code de configuration WireGuard depuis son serveur WireGuard et affiche le résultat directement dans un terminal SSH.
Pour parvenir à ce résultat il faudra installer la commande qrencode, sous une distribution Debian la commande sera la suivante :
apt install qrencode
Pour générer et afficher le QR code dans le terminal la commande suivante sera à exécuter :
qrencode -t ansiutf8 < /etc/wireguard/client.conf
Rédacteur Lucas MEYER