--- title: 🔐 WireGuard description: Comprendre et installer ce VPN nouvelle gĂ©nĂ©ration published: true date: 2021-07-01T22:13:45.367Z tags: linux, rĂ©seau, routage, vpn, wireguard editor: markdown dateCreated: 2021-06-27T21:09:12.144Z --- ![Logo WireGuard](https://www.wireguard.com/img/wireguard.svg) # PrĂ©sentation 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 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} # Comment fonctionne WireGuard ? ## Quels sont les prĂ©requis ? 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 : - Windows 7 / Windows Server 2012 - macOS 10.14 Mojave - Android 5.0 - iOS 12.0 / iPadOS 12.0 > Ces informations de compatibilitĂ©s sont celles annoncĂ©es pour la date du 28/06/2021. {.is-warning} ## Quels flux sont utilisĂ©s ? 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](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 ? 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 : - Tous paquets entrants seront dĂ©chiffrĂ©s, Ă  l'aide de la clef privĂ©e du serveur *ABC*, et si l'utilisation de la clef publique *789* ainsi que l'IP WireGuard correspond Ă  *10.0.0.1/24* alors les paquets seront acceptĂ©s et seront routĂ©s normalement. - Tous paquets sortants ayant pour destination *10.0.0.1/24* seront chiffrĂ©es Ă  l'aide de la clef publique associĂ©e Ă  l'IP, ici *789*, et envoyĂ©e vers la destination via son IP source, ici *6.7.8.9/32*. > 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. {.is-info} # Installation et configuration > 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. {.is-warning} ## Serveur ### Installer WireGuard Comme indiquĂ© dans la section [*Quels sont les prĂ©requis ?*](https://wiki-tech.io/fr/S%C3%A9curit%C3%A9/WireGuard#quels-sont-les-pr%C3%A9requis) 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 : ``` bash sudo apt install wireguard ``` ### CrĂ©er une paire de clefs 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 : ``` bash 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 > 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`). {.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 < clef_privee > clef_public ``` Nous pouvons raccourcir ces gĂ©nĂ©rations de clefs via la seule commande suivante : ``` bash wg genkey | tee clef_privee | wg pubkey > clef_public && chmod 0600 clef_privee ``` ### Configuration simplifiĂ©e avec wg-quick `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 **\.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/. {.is-info} > 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}**. {.is-warning} 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. 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 ``` #### 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. > Pour fonctionner il faut impĂ©rativement renseigner les fichiers de configurations dans */etc/wireguard/*. {.is-warning} 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 ``` ### Configuration manuelle 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) 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. 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 Suite Ă  ces actions d'autres configurations pourraient ĂȘtre mise en place : - Activation du routage des paquets - Configuration d'un NAT - Gestion fine 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Ă©. #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](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 sera dĂ©coupĂ© en deux paquets. {.is-warning} 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 ``` ### 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 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](https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8). {.is-info} ## Client ### Configuration du client sous Linux #### Installer WireGuard > WireGuard ne diffĂ©renciant pas un client d'un serveur cette section est identique Ă  celle de la configuration du serveur. {.is-info} L'installation du client est identique Ă  celle du serveur, par consĂ©quent les prĂ©requis de la section [*Quels sont les prĂ©requis ?*](https://wiki-tech.io/fr/S%C3%A9curit%C3%A9/WireGuard#quels-sont-les-pr%C3%A9requis) 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 : ``` bash sudo apt install wireguard ``` #### CrĂ©er une paire de clefs > WireGuard ne diffĂ©renciant pas un client d'un serveur cette section est identique Ă  celle de la configuration du serveur. {.is-info} 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 : ``` bash 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 > 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`). {.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 < clef_privee > clef_public ``` Nous pouvons raccourcir ces gĂ©nĂ©rations de clefs via la seule commande suivante : ``` bash 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 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 **\.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/. {.is-info} > 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}**. {.is-warning} 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 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 ``` ##### Utiliser wg-quick avec systemd > 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. > Pour fonctionner il faut impĂ©rativement renseigner les fichiers de configurations dans */etc/wireguard/*. {.is-warning} 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 ``` #### Configuration manuelle > 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 ``` --- *RĂ©dacteur Lucas MEYER*