Découverte de Wireguard

Découverte de Wireguard

Publié le 16/02/20262415 mots – 13 min de lecture
wireguardsecuritydev +1

J'ai découvert WireGuard en cherchant une alternative à OpenVPN, que j'utilisais exclusivement jusqu'alors. Je recherchais en effet une solution VPN légère, afin de me connecter à des machines distantes via un réseau privé. Mon objectif était de mettre en place un outil simple, sans avoir à déployer OpenVPN, souvent assez lourd à configurer et surdimensionné pour mon usage.

En me renseignant davantage, je me suis rendu compte que WireGuard est aujourd'hui largement adopté. De nombreux fournisseurs de VPN, tels que NordVPN, ExpressVPN ou ProtonVPN, ont intégré ces dernières années la prise en charge de WireGuard dans leurs solutions, afin de bénéficier des performances qu'il offre.

N'étant pas un expert des VPN, j'ai donc découvert cet outil open source et trouvé intéressant de lui consacrer un court article pour en présenter les bases. Pour les néophytes comme moi, commençons par quelques explications !

Qu'est ce que Wireguard ?

WireGuard est un protocole VPN. Il fait partie des VPN de niveau 3 (Layer 3 VPN) et opère au niveau de la couche 3 du modèle OSI. Concrètement, il s'agit d'un VPN qui chiffre et transporte des paquets IP entre des sites distants, en utilisant des adresses IP privées, comme si ces sites étaient directement connectés via un réseau local.

C'est une solution open-source qui vise à être plus simple à configurer et plus facile à utiliser que les VPN traditionnels comme OpenVPN ou IPsec. WireGuard a été conçu pour privilégier la sécurité et l'efficacité cryptographique. Contrairement aux VPN traditionnels, il limite volontairement la complexité des algorithmes cryptographiques (appelés primitives) utilisés. Il repose ainsi sur des briques simples, robustes et rapides.

Cette approche permet de maintenir une base de code réduite (environ 4 000 lignes), ce qui diminue la surface d'attaque et les risques de vulnérabilités.

Une autre caractéristique souvent mise en avant est la haute performance offerte par WireGuard. Celle-ci s'explique notamment par l'utilisation d'algorithmes modernes, mais aussi par son intégration dans le noyau Linux. Il fonctionne en effet au même niveau que les composants réseau du système, ce qui améliore significativement ses performances.

Un peu d'histoire

En 2015, Jason A. Donenfeld commence à développer WireGuard, frustré par la complexité d'OpenVPN et d'IPsec. La première version est publiée en 2016. Entre 2019 et 2020, WireGuard est intégré au noyau Linux (à partir de la version 5.6).

Depuis, WireGuard est largement adopté dans de nombreuses solutions VPN, y compris des offres propriétaires. Les éditeurs de ces solutions ont intégré ce protocole, contribuant ainsi à sa diffusion et à son adoption à grande échelle.

Architecture et cas d’usage

WireGuard se distingue par son approche peer-to-peer (P2P) :

Chaque machine est un peer : elle peut envoyer et recevoir du trafic directement avec n’importe quel autre peer autorisé. Chaque peer possède sa clé publique et sa clé privée, et la configuration consiste à déclarer les peers autorisés. Un serveur central n'est donc pas obligatoire pour chiffrer de bout en bout la communication entre deux peer.

Cas d’usage typiques

  • Accès sécurisé à distance : chaque utilisateur ou machine se connecte uniquement aux ressources nécessaires.
  • Interconnexion de sites ou serveurs : réseaux multi-sites ou clusters de machines communiquant directement.
  • Collaboration décentralisée : partage sécurisé de fichiers ou services entre plusieurs machines.

Algorithmes utilisés

Différentes primitives sont utilisées pour garantir un chiffrement moderne et robuste. Dans cet article nous n'allons pas rentrer dans le détail de ces différents algorithmes, cependant voici tout de même une petite liste des primitives utilisées selon les usages :

  • Échange de clés : Curve25519 (courbe elliptique rapide et sécurisée).
  • Chiffrement : ChaCha20 (stream cipher, idéal pour les CPU sans AES-NI).
  • Authentification : Poly1305 (pour l’intégrité des messages).
  • Hachage : BLAKE2s (pour dériver les clés).
  • Handshake : Basé sur le framework Noise (pattern Noise_IKpsk2), avec :
    • Authentification mutuelle via des paires de clés statiques.
    • Option pour une pré-shared key (PSK) supplémentaire.

Ici il s'agit juste d'exposer les différentes méthodes crypthographiques utilisées au niveau de Wireguard. Rentrer dans le détail nécessiterai un article à part entière (peut être dans le futur 😇)

Bon assez de blabla pour le moment, si on passait à une petite démo pour voir comment ca marche concrètement ?

Exemple de tunnel VPN entre deux machines

Afin d'illustrer la partie un peu plus théorique ci-dessus, nous allons voir comment mettre en place dans cette section un tunnel VPN entre deux machines. On va donc considérer les deux machines suivantes :

MachineNom logiqueRôleIP WireGuard
MacBookwg-macbookClient (Peer 1)10.10.0.10
Machine Debianwg-debian-1Hub (Peer 2)10.10.0.1

Notre objectif ici sera de ping la machine Debian depuis notre Macbook. A noter que la machine Debian dispose d'une IP publique notée (XXX.XXX.XXX.XXX) et d'un firewall qui bloque la majorité des entrées/sorties. On ouvre cependant le port 51820/udp qui permettra de réaliser la connexion Wireguard.

Pour que le client puisse initier la connexion, la machine Debian doit posséder une IP publique statique (ou un nom de domaine via un service DDNS). Si votre IP change régulièrement, le tunnel risque de se briser dès que votre fournisseur d'accès renouvellera l'adresse.

On va ainsi tenter de réaliser cette topologie réseau :

wireguard-exemple-net-typo

Maintenant que nous avons identifié les différents éléments que nous souhaitons dans notre VPN et notre réseau privé, nous pouvons déclarer la configration nécessaire à notre cas d'usage.

Installation de Wireguard sur le server

Notre machine debian a besoin de Wireguard installé. Pour l'installation rien de plus simple, il suffit de suivre les étapes suivantes :

sudo apt-get update && sudo apt-get install wireguard

Création de la clé privée et de la clé publique de notre serveur :

wg genkey | sudo tee /etc/wireguard/wg-private.key | wg pubkey | sudo tee /etc/wireguard/wg-public.key

La commande ci-dessus va générer une clé privée qui sera placé dans le répertoire /etc/wireguard/, de cette clé privée on peut générer avec Wireguard publique correspondant et la placer dans ce même répertoire. C'est clés seront utilisées ensuite dans la configuration de notre interface.

La sécurité de votre tunnel repose entièrement sur la confidentialité de ces clés. Il est crucial de restreindre l'accès au répertoire de configuration pour que seul l'utilisateur root puisse les lire :

sudo chmod 600 /etc/wireguard/wg-private.key

Besoin de forwarding IP ?

Par défaut, pour des raisons de sécurité, un système Linux ne transmet pas les paquets réseau qu'il reçoit s'ils ne lui sont pas directement adressés. Dans notre architecture, la machine Debian agit comme un routeur (ou Hub) : elle reçoit des paquets du MacBook destinés à d'autres ressources (ou vice-versa).

Si vous n'activez pas le Forwarding IP, votre serveur recevra bien les données du tunnel WireGuard, mais il les détruira immédiatement au lieu de les rediriger vers l'interface appropriée.

Changement rapide non persisté :

sudo sysctl -w net.ipv4.ip_forward=1

Configuration permanente Pour que ce réglage survive à un redémarrage du serveur, modifiez la configuration du noyau : Ouvrez le fichier de configuration :

sudo nano /etc/sysctl.conf

Recherchez la ligne suivante et décommentez la :

net.ipv4.ip_forward=1

Activez ensuite les changements :

sudo sysctl -p

Création de l'interface wg0 sur le serveur

Pour créer l'interface wg0 qui nous sera notre interface réseau associée wireguard on créé un fichier dans le dossier /etc/wireguard qui aura le nom de notre intrerfcace réseau (ici wg0).

sudo nano /etc/wireguard/wg0.conf

Dans ce fichier on ajoute la configuration suivante :

[Interface]
Address = 10.10.0.1/24 ## Ip correspondant à notre machine Debian
ListenPort = 51820 ## Port d'écoute de Wireguard
PrivateKey = <PRIVATE_KEY> ## La clé privée générée dans la commande précédente

[Peer] # Définition du Peer MacBook
PublicKey = <PUBLIC_KEY_MACBOOK> ## La clé publique donnée par l'application Wireguard
AllowedIPs = 10.10.0.10/32 ## On autorise ici l'IP équivalent strictement à 10.10.0.10 qui est l'IP privée de notre Macbook (masque 32 pour éviter les colisions d'IPs mais aussi pour sécuriser l'IP autorisée)

Création de l'interface wg0 sur le client

Sur Macbook une application disponible dans l'AppStore permet de gérer les interfaces wireguard sans passer par la ligne de commande. C'est assez intuitif. Une plateforme existe pour iOs, Android, macOs, Windows et j'en passe.

Liens de téléchargement de wiregard sur les différentes plateformes

Lors de l'ajout de notre configuration, il suffit d'ajouter dans la configuration :

[Interface]
Address = 10.10.0.10/24 ## Adresse de notre Macbook dans le réseau privé
PrivateKey = <PRIVATE_KEY_MACBOOK> ## Clé privée donnée par l'application Wireguard

[Peer] # MACHINE DEBIAN
PublicKey = <PUBLIC_KEY_MACHINE_DEBIAN> ## Clé publique générée lors de la génération des clés
Endpoint = <IP_PUBLIQUE_MACHINE_DEBIAN>:51820 ## Donner l'IP publique sur internet
AllowedIPs = 10.10.0.0/24
PersistentKeepalive = 25

Application de la configuration

Il existe plusieurs manière d'activer notre interface et le tunnel associé. Une méthode manuelle et une méthode permettant à wireguard de jouer pour nous les commandes à réaliser.

Soit les Commandes manuelles

Créer l’interface réseau wg0 :

sudo ip link add wg0 type wireguard
  • Chargement du fichier de configuration avec wg setconf.
sudo wg setconf wg0 wg0.conf
  • Attribution de l’adresse IP
sudo ip -4 address add 10.10.0.1/24 dev wg0
  • Activation de l’interface WireGuard utilise par défaut un MTU à 1420
sudo ip link set mtu 1420 up dev wg0

Ou Commande Wireguard

sudo wg-quick up wg0

Nous pouvons démarrer l'interface en précisant son nom (wg0, car le fichier se nomme wg0.conf).

Vérification de l'état de l'interface

On peut ensuite vérifier l'état de l'interface en réalisant la commande suivante :

sudo wg show

Nous donne le résultat (les IPs publiques et les clés auront pour valeur celles qui auront été renseignées au préalable).

interface: wg0
  public key: XXXXXXXXXXXXXXXXXXXX
  private key: (hidden)
  listening port: 51820

peer: XXXXXXXXXXXXXXXXXXXX
  allowed ips: 10.10.0.10/32

Pingons !

Bon maintenant que tout est en place, arrive le moment de tester ce que l'on vient de configurer ! Tentons depuis le macbook de ping la machine debian en utilisant l'adresse IP du réseau privé.

wireguard@mackbook % ping 10.10.0.1
wireguard@mackbook % PING 10.10.0.1 (10.10.0.1): 56 data bytes
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=0 ttl=64 time=28.607 ms
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=1 ttl=64 time=36.274 ms
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=2 ttl=64 time=24.916 ms
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=3 ttl=64 time=43.533 ms
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=4 ttl=64 time=85.374 ms
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=5 ttl=64 time=109.035 ms
wireguard@mackbook % 64 bytes from 10.10.0.1: icmp_seq=6 ttl=64 time=26.829 ms

Un ping aussi précis que les frêres Lebrun 🏓

On peut ensuite de nouveau vérifier l'état de l'interface au niveau du serveur debian :

sudo wg show

Nous donne le résultat :

interface: wg0
  public key: XXXXXXXXXXXXXXXXXXXX
  private key: (hidden)
  listening port: 51820

peer: XXXXXXXXXXXXXXXXXXXX
  endpoint: XX.XX.XX.XX:49392
  allowed ips: 10.10.0.10/32
  latest handshake: 4 minutes, 24 seconds ago
  transfer: 3.55 MiB received, 9.26 MiB sent

On remarque ici que dans la section du peer, plusieurs nouvelles informations apparaissent en effet lors du ping et donc d'une intéraction entre les deux machines dans le tunnel, le endpoint de la machine distante a été automatiquement résolu par Wireguard. Une section latest atteste du dernier handshake réussi entre les deux machines, tandis que la ligne transfer donne les indications du volumes émis et reçu.

Avantages et Limites

WireGuard présente de nombreux avantages qui expliquent son adoption aujourd'hui. Son code source volontairement réduit facilite l’audit de sécurité et diminue la surface d’attaque, ce qui renforce la confiance vis a vis de ce protocole. Les performances réseau sont très bonne d'après les différents articles que j'ai pu consulter sur le sujet. Cela s'explique notamment grâce à son intégration directe dans le noyau Linux et à l’utilisation d’algorithmes cryptographiques modernes et efficaces.

De plus, la configuration de WireGuard est simple, lisible, ce qui le rend accessible pour un public technique (Ce n'est donc pas commme je l'ai présenté le VPN que je pourrai donner à ma grand-mère les yeux fermés non plus).

WireGuard présente également certaines limites qu’il convient de prendre en compte. Il ne propose pas de gestion des utilisateurs, ce qui peut compliquer son déploiement dans de grandes infrastructures sans outils complémentaires.

Son fonctionnement exclusivement basé sur le protocole UDP peut poser problème dans certains réseaux très restrictifs. Par ailleurs, il ne dispose pas nativement de fonctionnalités avancées telles que l’authentification multifacteur ou une journalisation détaillée, souvent requises dans des contextes réglementés.

La gestion manuelle des clés cryptographiques peut devenir complexe à grande échelle, WireGuard peut offire moins de flexibilité que d'autres protocles.

Aller plus loin : WireGuard à grande échelle

Si la configuration manuelle que nous venons de voir est parfaite pour comprendre les bases ou relier deux serveurs, elle peut devenir un défi logistique dès que votre parc de machines s'agrandit. La gestion manuelle des échanges de clés publiques et la configuration des pare-feux deviennent vite chronophages.

Pour répondre à ce besoin, des solutions de Mesh VPN se sont développées par-dessus le protocole WireGuard :

  • Tailscale : Sans doute la solution la plus populaire. Elle utilise WireGuard pour créer un réseau maillé où chaque machine communique directement avec les autres. Elle gère l'authentification (via Google, Microsoft, GitHub).
  • Netbird : Une alternative open-source très similaire à Tailscale, qui propose une interface d'administration centralisée pour gérer vos pairs et vos règles d'accès en quelques clics.

Ces outils vous offrent la performance brute de WireGuard avec une couche de gestion (control plane) qui simplifie grandement la gestion des clés et les différentes configuration.

Conclusion

Cet article est une mise en bouche et une présentation simplifiée. Le code et les configurations partagés ici servent de base d'apprentissage et ne doivent pas être utilisés tels quels en production. Pour un déploiement professionnel ou exposé sur internet, il convient tout naturellement de mettre en place des mesures de sécurité supplémentaires, telles que : Le durcissement du pare-feu pour restreindre strictement le flux entre les interfaces ou encore l'utilisation de solutions de gestion de clés à l'échelle pour éviter les erreurs humaines.

WireGuard s’impose comme un VPN moderne, performant et sécurisé. Son approche minimaliste permet de simplifier considérablement le déploiement et la maintenance des tunnels VPN tout en garantissant un haut niveau de performance. Adoptée par de nombreuses solutions VPNs, Wireguard continue à se démocratiser. J'ai vraiment apprécié la vitesse à laquelle j'ai pu mettre en place une connexion entre deux peer, et l'éfficacité de l'outil. Bien sur je n'ai fait qu'effleurer certains concepts pour mon utilisation personnelle. Mais quand le besoin est petit cela fait plaisir de voir qu'un tel outil est parfaitement adapté, bien qu'il soit petit il n'en demeure pas moins puissant.

Sources

© 2025 • mattkds.dev