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-quick
ne 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-quick
ne 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