1
0
Bifurcation 0
miroir de https://github.com/PAPAMICA/Wiki-Tech.io.git synchronisé 2024-07-03 00:28:55 +02:00

docs: update Sécurité/WireGuard

Cette révision appartient à :
Lucas Meyer 2021-07-01 22:13:07 +00:00 révisé par Mickael Asseline
Parent 997950ef3d
révision 4cde0999d0

Voir le fichier

@ -2,7 +2,7 @@
title: 🔐 WireGuard
description: Comprendre et installer ce VPN nouvelle génération
published: false
date: 2021-06-30T21:19:47.549Z
date: 2021-07-01T22:13:03.147Z
tags: linux, réseau, routage, vpn, wireguard
editor: markdown
dateCreated: 2021-06-27T21:09:12.144Z
@ -15,9 +15,9 @@ dateCreated: 2021-06-27T21:09:12.144Z
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.
- La **simplicité** de configuration qui se passe en une seule phase standardisée contrairement à IPsec fonctionnant avec deux phases souvent difficiles à appréhender pour des novices. De plus la non utilisation de certificats, comme on la retrouve avec OpenVPN, simplifie la gestion à plus long terme et ne nécessite pas la création d'une PKI.
- La **sécurité** est assurée avec l'utilisation de primitives cryptographiques modernes mais aussi par la mise à disposition d'une seule combinaison de méthode de chiffrement. De plus le code complet de WireGuard tient sur environ 4 000 lignes ce qui facilite les audits de sécurité et réduit sa surface d'attaque.
- La **rapidité** tient en grande partie des points précédents mais aussi parce que WireGuard fonctionne au niveau du noyau (seulement sous Linux). Les tests présents sur le site officiel (https://www.wireguard.com/performance/) démontrent un très fort avantage de WireGuard sur OpenVPN et un avantage un peu plus ténu sur IPsec, à la fois en débit maximal atteint et en temps de latence. A savoir que d'autres tests sont disponibles sur Internet et tendent à placer WireGuard comme le plus performant même si l'écart n'est pas toujours aussi important.
- La **simplicité** de configuration se passant en une seule phase standardisée contrairement à IPsec où deux phases, souvent difficiles à appréhender pour des novices, sont nécessaires. De plus la non utilisation de certificats, comme on la retrouve avec OpenVPN, simplifie la gestion à plus long terme et ne nécessite pas la création d'une PKI.
- La **sécurité** est assurée avec l'utilisation de primitives cryptographiques modernes mais aussi par la mise à disposition d'une seule combinaison de méthodes de chiffrements. De plus le code complet de WireGuard tient sur environ 4 000 lignes ce qui facilite les audits de sécurité et réduit sa surface d'attaque.
- La **rapidité** tient en grande partie des points précédents mais aussi parce que WireGuard fonctionne au niveau du noyau (seulement sous Linux) et non au niveau de l'espace utilisateur. Les tests présents sur le site officiel (https://www.wireguard.com/performance/) démontrent un très fort avantage de WireGuard sur OpenVPN et un avantage un peu plus ténu sur IPsec, à la fois en débit maximal atteint et en temps de latence. A savoir que d'autres tests sont disponibles sur Internet et tendent à placer WireGuard comme le plus performant même si l'écart n'est pas toujours aussi important, notamment avec 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).
{.is-info}
@ -27,7 +27,7 @@ WireGuard se veut être plus **simple**, **rapide** et **sécurisé** que les pr
## Quels sont les prérequis ?
WireGuard est intégré au noyau Linux à 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/.
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 :
@ -46,6 +46,10 @@ WireGuard fonctionne uniquement avec le **protocole UDP** (ce qui est recommand
Aucun port standard n'a été affecté à WireGuard par l'IANA ([liste des ports assignés](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt)) 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.
{.is-warning}
## Qu'est-ce que le routage cryptographique ?
@ -97,20 +101,20 @@ wg genkey
Il est préférable d'enregistrer le résultat directement dans un fichier avec une redirection de ce type :
``` bash
wg genkey > privatekey
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 privatekey`).
> 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`).
{.is-warning}
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é) :
``` bash
wg pubkey < privatekey > publickey
wg pubkey < clef_privee > clef_public
```
Nous pouvons raccourcir ces générations de clefs via la seule commande suivante :
``` bash
wg genkey | tee privatekey | wg pubkey > publickey && chmod 0600 privatekey
wg genkey | tee clef_privee | wg pubkey > clef_public && chmod 0600 clef_privee
```
@ -125,7 +129,7 @@ wg genkey | tee privatekey | wg pubkey > publickey && chmod 0600 privatekey
{.is-warning}
Voici un exemple de fichier de configuration annoté pour expliquer les différents champs :
Voici un exemple de fichier de configuration annotée pour expliquer les différents champs :
``` bash
# Configuration de l'interface WireGuard du serveur pour une utilisation avec wg-quick.
[Interface]
@ -156,7 +160,7 @@ Address = ADDRESS1
# (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éposant de "0x".
# 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.
@ -172,27 +176,27 @@ Address = ADDRESS1
PrivateKey = PRIVATE_KEY
# Configuration des paires pouvant se connecter au serveur.
# Création d'autant de [Peer] qu'il y a de paires identifiés avec une clef publique à connecter.
# 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 paire.
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagée entre le serveur et le paire, cette clef doit être issue de wg genpsk.
# (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 paire séparés par des virgules.
# 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 paire. Dans ce cas un seul paire peut être défini.
# 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-feu ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
# 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 paire.
# (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
@ -224,7 +228,7 @@ wg-quick down wg0
#### Utiliser wg-quick avec systemd
`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.
`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/*.
{.is-warning}
@ -263,6 +267,7 @@ La configuration manuelle d'une interface WireGuard est parfaitement possible et
1. Assignation d'une adresse IP à l'interface
1. Application de la configuration sur la nouvelle interface
1. Activation de l'interface
1. Configuration de la table de routage
Suite à ces actions d'autres configurations pourraient être mise en place :
- Activation du routage des paquets
@ -275,7 +280,7 @@ Le fichier de configuration WireGuard ressemble fortement à celui de `wg-quick`
[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éposant de "0x".
# 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.
@ -287,27 +292,27 @@ Le fichier de configuration WireGuard ressemble fortement à celui de `wg-quick`
PrivateKey = PRIVATE_KEY
# Configuration des paires pouvant se connecter au serveur.
# Création d'autant de [Peer] qu'il y a de paires identifiés avec une clef publique à connecter.
# 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 paire.
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagée entre le serveur et le paire, cette clef doit être issue de wg genpsk.
# (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 paire séparés par des virgules.
# 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 paire. Dans ce cas un seul paire peut être défini.
# 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-feu ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
# 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 paire.
# (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
@ -321,16 +326,24 @@ AllowedIPs = ALLOWED_IP_1_PEER_1, ALLOWED_IP_2_PEER_1
#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](https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8).
{.is-info}
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.
{.is-info}
> 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 utilisera deux paquets pour le tunnel.
> 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.
{.is-warning}
@ -349,14 +362,14 @@ net.ipv6.ip_forward=1
### Informations sur les clients connectés
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 la configuration de toutes les interfaces WireGuard.
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 paire, mais aussi sa consommation de données :
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
```
@ -396,26 +409,26 @@ wg genkey
Il est préférable d'enregistrer le résultat directement dans un fichier avec une redirection de ce type :
``` bash
wg genkey > privatekey
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 privatekey`).
> 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`).
{.is-warning}
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é) :
``` bash
wg pubkey < privatekey > publickey
wg pubkey < clef_privee > clef_public
```
Nous pouvons raccourcir ces générations de clefs via la seule commande suivante :
``` bash
wg genkey | tee privatekey | wg pubkey > publickey && chmod 0600 privatekey
wg genkey | tee clef_privee | wg pubkey > clef_public && chmod 0600 clef_privee
```
#### Utilisation de wg-quick
> 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 ces annotations pour avoir une configuration plus spécifique pour les clients (le paramètre endpoint des paires est obligatoire par exemple).
> 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).
{.is-info}
`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.
@ -427,13 +440,13 @@ wg genkey | tee privatekey | wg pubkey > publickey && chmod 0600 privatekey
{.is-warning}
Voici un exemple de fichier de configuration annoté pour expliquer les différents champs :
Voici un exemple de fichier de configuration annotée pour expliquer les différents champs :
``` bash
# 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 rarement utile pour une configuration cliente.
# 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
@ -458,7 +471,7 @@ Address = ADDRESS1
# (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éposant de "0x".
# 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.
@ -475,29 +488,29 @@ Address = ADDRESS1
PrivateKey = PRIVATE_KEY
# Configuration des paires auquel le client se connectera.
# Le paire correspond à un serveur WireGuard, en général un seul est défini.
# Création d'autant de [Peer] qu'il y a de paires identifiés avec une clef publique à connecter.
# 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 paire.
# Clef publique du pair.
# Exemple : xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
PublicKey = PUBLIC_KEY_PEER_1
# (Optionnel) Clef partagée entre le serveur et le paire, cette clef doit être issue de wg genpsk.
# (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 paire séparés par des virgules.
# 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 paire. Dans ce cas un seul paire peut être défini.
# C'est cette option qui définiera les routes devant passées par le tunnel WireGuard
# 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-feu ou les NAT ne maintiennent pas la session UDP pour cause d'inactivité trop longue.
# 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 paire.
# 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
@ -531,7 +544,7 @@ wg-quick down wg0
> WireGuard ne différenciant pas un client d'un serveur cette section est identique à celle de la configuration du serveur.
{.is-info}
`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.
`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/*.
{.is-warning}
@ -564,15 +577,158 @@ systemctl disable wg-quick@wg0
#### Configuration manuelle
> WireGuard ne différenciant pas un client d'un serveur cette section est identique à celle de la configuration du serveur.
> 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.
{.is-info}
La configuration manuelle d'une interface WireGuard est parfaitement possible et les étapes suivantes seront à réaliser (en plus de l'[installation](https://wiki-tech.io/fr/S%C3%A9curit%C3%A9/WireGuard#installer-wireguard-1) et [génération des clefs](https://wiki-tech.io/fr/S%C3%A9curit%C3%A9/WireGuard#cr%C3%A9er-une-paire-de-clefs-1)) :
1. Création d'un fichier de configuration WireGuard
1. Création d'une nouvelle interface
1. Assignation d'une adresse IP à l'interface
1. Application de la configuration sur la nouvelle interface
1. Activation de l'interface
1. Configuration de la table de routage
Le fichier de configuration WireGuard ressemble fortement à celui de `wg-quick` avec seulement certaines options qui ne sont pas disponibles :
``` bash
# 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](https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8).
{.is-info}
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.
{.is-info}
> 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.
{.is-warning}
##### Configuration avancée : utilisation des espaces de noms réseaux
> 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](https://www.linux.org/docs/man8/ip-netns.html).
{.is-warning}
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.
{.is-info}
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](https://www.wireguard.com/netns/) 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 :
1. Création d'un nouvel espace de nom réseau
1. Migration des interfaces physiques dans le nouvel espace de nom réseau
1. Création d'une interface WireGuard dans le nouvel espace de nom réseau
1. Déplacement de l'interface WireGuard dans l'espace de nom *1*
1. Configuration de l'interface WireGuard (IP + tunnel WireGuard)
1. Activation de l'interface WireGuard
1. Ajout d'une règle de routage par défaut vers l'interface WireGuard
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
```
### Configuration du client sur les autres plateformes
Pour l'installation des clients des autres OS il vaut mieux se référer à la page regroupant les différentes [installations de WireGuard](https://www.wireguard.com/install/) 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](https://wiki-tech.io/fr/S%C3%A9curit%C3%A9/WireGuard#configuration-manuelle-1) sont toujours proposés.
#### Générer le QR code de configuration
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 :
``` bash
qrencode -t ansiutf8 < /etc/wireguard/client.conf
```
---