Wireguard

Introduction

WireGuard est un réseau privé virtuel (VPN) léger qui prend en charge les connexions IPv4 et IPv6. Un VPN vous permet de traverser des réseaux non fiables comme si vous étiez sur un réseau privé. Il vous donne la liberté d'accéder à Internet en toute sécurité depuis votre smartphone ou votre ordinateur portable lorsque vous êtes connecté à un réseau non fiable, comme le WiFi d'un hôtel ou d'un café.

Le cryptage de WireGuard s'appuie sur des clés publiques et privées permettant aux pairs d'établir un tunnel crypté entre eux. Chaque version de WireGuard utilise une suite de chiffrement cryptographique spécifique pour garantir la simplicité, la sécurité et la compatibilité avec les pairs.

En comparaison, d'autres logiciels VPN tels qu'OpenVPN et IPSec utilisent Transport Layer Security (TLS) et des certificats pour authentifier et établir des tunnels cryptés entre les systèmes. Différentes versions de TLS incluent la prise en charge de centaines de suites et d'algorithmes cryptographiques différents, et bien que cela permette une grande flexibilité pour prendre en charge différents clients, cela rend également la configuration d'un VPN qui utilise TLS plus longue, complexe et sujette aux erreurs.

Dans ce didacticiel, vous allez configurer WireGuard sur un serveur Ubuntu 20.04, puis configurer une autre machine pour s'y connecter en tant que homologue à l'aide de connexions IPv4 et IPv6 (communément appelées connexions double pile ) . Vous apprendrez également comment acheminer le trafic Internet du homologue via le serveur WireGuard dans une configuration de passerelle, en plus d'utiliser le VPN pour un tunnel peer-to-peer crypté.

Pour les besoins de ce didacticiel, nous allons configurer un autre système Ubuntu 20.04 en tant que homologue (également appelé client) du serveur WireGuard. Les didacticiels suivants de cette série expliqueront comment installer et exécuter WireGuard sur les systèmes et appareils Windows, macOS, Android et iOS.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

Étape 1 — Installation de WireGuard et génération d'une paire de clés

La première étape de ce didacticiel consiste à installer WireGuard sur votre serveur. Pour commencer, mettez à jour l'index des packages de votre serveur WireGuard et installez WireGuard à l'aide des commandes suivantes. Vous serez peut-être invité à fournir le mot de passe de votre utilisateur sudo si c'est la première fois que vous l'utilisez sudodans cette session :

         

          sudo apt update

 

          sudo apt install wireguard

       

Maintenant que WireGuard est installé, l'étape suivante consiste à générer une paire de clés privée et publique pour le serveur. Vous utiliserez les commandes intégrées wg genkey et  wg pubkey pour créer les clés, puis ajouterez la clé privée au fichier de configuration de WireGuard.

Vous devrez également modifier les autorisations sur la clé que vous venez de créer à l'aide de la chmodcommande, puisque par défaut le fichier est lisible par n'importe quel utilisateur de votre serveur.

Créez la clé privée pour WireGuard et modifiez ses autorisations à l'aide des commandes suivantes :

         

          wg genkey | sudo tee /etc/wireguard/private.key

 

          sudo chmod go= /etc/wireguard/private.key

 

La commande sudo chmod go=… supprime toutes les autorisations sur le fichier pour les utilisateurs et les groupes autres que l'utilisateur root pour garantir que lui seul peut accéder à la clé privée.

Vous devriez recevoir une seule ligne de sortie codée base64, qui est la clé privée. Une copie de la sortie est également stockée dans le  fichier /etc/wireguard/private.key pour référence future par la partie de la commande tee. Notez soigneusement la clé privée générée, car vous devrez l'ajouter au fichier de configuration de WireGuard plus loin dans cette section.

L'étape suivante consiste à créer la clé publique correspondante, dérivée de la clé privée. Utilisez la commande suivante pour créer le fichier de clé publique :

       

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

       

Cette commande se compose de trois commandes individuelles qui sont enchaînées à l'aide de l' |opérateur (pipe) :

Lorsque vous exécutez la commande, vous recevrez à nouveau une seule ligne de base64sortie codée, qui est la clé publique de votre serveur WireGuard. Copiez-le quelque part pour référence, car vous devrez distribuer la clé publique à tout homologue qui se connecte au serveur.

Étape 2 — Choisir les adresses IPv4 et IPv6

Dans la section précédente, vous avez installé WireGuard et généré une paire de clés qui sera utilisée pour chiffrer le trafic vers et depuis le serveur. Dans cette section, vous allez créer un fichier de configuration pour le serveur et configurer WireGuard pour qu'il démarre automatiquement au redémarrage de votre serveur. Vous définirez également des adresses IPv4 et IPv6 privées à utiliser avec votre serveur WireGuard et vos pairs.

Si vous envisagez d'utiliser à la fois des adresses IPv4 et IPv6, suivez ces deux sections. Sinon, suivez les instructions de la section appropriée aux besoins du réseau de votre VPN.

Étape 2 (a) – Choisir une plage IPv4

Si vous utilisez votre serveur WireGuard avec des homologues IPv4, le serveur a besoin d'une plage d'adresses IPv4 privées à utiliser pour les clients et pour son interface tunnel. Vous pouvez choisir n'importe quelle plage d'adresses IP parmi les blocs d'adresses réservés suivants (si vous souhaitez en savoir plus sur la façon dont ces blocs sont alloués, visitez la spécification RFC 1918 ) :

Pour les besoins de ce didacticiel, nous utiliserons 10.8.0.0/24comme bloc d'adresses IP de la première plage d'adresses IP réservées. Cette plage autorisera jusqu'à 255 connexions homologues différentes et ne devrait généralement pas avoir d'adresses qui se chevauchent ou entrent en conflit avec d'autres plages IP privées. N'hésitez pas à choisir une plage d'adresses qui fonctionne avec votre configuration réseau si cet exemple de plage n'est pas compatible avec vos réseaux.

Le serveur WireGuard utilisera une seule adresse IP de la plage pour son adresse IPv4 de tunnel privé. Nous utiliserons 10.8.0.1/24, mais n'importe quelle adresse comprise entre 10.8.0.1 et  10.8.0.255 peut être utilisée. Notez l'adresse IP que vous choisissez si vous utilisez quelque chose de différent de 10.8.0.1/24. Vous ajouterez cette adresse IPv4 au fichier de configuration que vous définissez à l'étape 3 — Création d'une configuration de serveur WireGuard .

Étape 2 (b) – Choisir une plage IPv6

Si vous utilisez WireGuard avec IPv6, vous devrez alors générer un préfixe d'adresse unicast IPv6 local unique basé sur l'algorithme de la RFC 4193 . Les adresses que vous utilisez avec WireGuard seront associées à une interface de tunnel virtuel. Vous devrez suivre quelques étapes pour générer un préfixe IPv6 aléatoire et unique dans le bloc fd00::/8 réservé d'adresses IPv6 privées.

Selon la RFC, la méthode recommandée pour obtenir un préfixe IPv6 unique consiste à combiner l'heure de la journée avec une valeur d'identification unique provenant d'un système, comme un numéro de série ou un identifiant d'appareil. Ces valeurs sont ensuite hachées et tronquées, ce qui donne un ensemble de bits qui peuvent être utilisés comme adresse unique dans le bloc fd00::/8 privé d'adresses IP réservé.

Pour commencer à générer une plage IPv6 pour votre serveur WireGuard, collectez un horodatage 64 bits à l'aide de l'utilitaire date avec la commande suivante :

          date +%s%N

Vous recevrez un nombre comme celui-ci, qui correspond au nombre de secondes (le %s dans la commande date) et de nanosecondes (le %N) depuis le 1970-01-01 00:00:00 UTC combinés :

          Output

         1628101352127592197

Enregistrez la valeur quelque part pour l’utiliser plus tard dans cette section. Ensuite, copiez la valeur machine-id de votre serveur à partir du fichier. /var/lib/dbus/machine-id  Cet identifiant est unique à votre système et ne doit pas changer tant que le serveur existe.

         

          cat /var/lib/dbus/machine-id

         

Vous recevrez un résultat semblable à celui-ci :

          /var/lib/dbus/machine-id

         20086c25853947c7aeee2ca1ea849d7d

Vous devez maintenant combiner l'horodatage avec machine-id et hacher la valeur résultante à l'aide de l'algorithme SHA-1. La commande utilisera le format suivant :

          printf <timestamp><machine-id> | sha1sum

Exécutez la commande en remplaçant vos valeurs d'horodatage et d'identité de machine :

         

          printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum

       

Vous recevrez une valeur de hachage comme la suivante :

       

 

          Output

         4f267c51857d6dc93a0bca107bca2f0d86fac3bc  -

Notez que la sortie de la commande sha1sum est en hexadécimal, donc la sortie utilise deux caractères pour représenter un seul octet de données. Par exemple 4f et 26 dans l'exemple de sortie se trouvent les deux premiers octets des données hachées.

L'algorithme de la RFC ne nécessite que les 40 bits les moins significatifs (de fin), ou 5 octets, de la sortie hachée. Utilisez la commande cut pour imprimer les 5 derniers octets codés en hexadécimal du hachage :

 

         

          printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-

 

         

L'argument -c indique à la commande  cut de sélectionner uniquement un jeu de caractères spécifié. L' argument 31- indique à cut d'imprimer tous les caractères de la position 31 jusqu'à la fin de la ligne de saisie.

Vous devriez recevoir un résultat semblable à celui-ci :

       

 

          Output

         0d86fac3bc

Dans cet exemple de sortie, l'ensemble d'octets est :  0d 86 fa c3 bc

Vous pouvez maintenant créer votre préfixe réseau IPv6 unique en ajoutant les 5 octets que vous avez générés avec le préfixe fd, en séparant tous les 2 octets par deux points : pour plus de lisibilité. Étant donné que chaque sous-réseau de votre préfixe unique peut contenir un total de 18 446 744 073 709 551 616 adresses IPv6 possibles, vous pouvez limiter le sous-réseau à une taille standard de /64 pour plus de simplicité.

En utilisant les octets générés précédemment avec la taille /64 du sous-réseau, le préfixe résultant sera le suivant :

 

         

 

          Unique Local IPv6 Address Prefix

         fd0d:86fa:c3bc::/64

Cette plage fd0d:86fa:c3bc::/64 est ce que vous utiliserez pour attribuer des adresses IP individuelles à vos interfaces de tunnel WireGuard sur le serveur et les « peers ». Pour attribuer une IP au serveur, ajoutez un 1 après les derniers caractères ::. L'adresse résultante sera  fd0d:86fa:c3bc::1/64

Les « Peers » peuvent utiliser n'importe quelle adresse de la plage IP, mais vous incrémentez généralement la valeur de un à chaque fois que vous ajoutez un « Peers », par exemple fd0d:86fa:c3bc::2/64 . Notez l'adresse IP et procédez à la configuration du serveur WireGuard dans la section suivante de ce didacticiel.

Étape 3 — Création d'une configuration de serveur WireGuard

Avant de créer la configuration de votre serveur WireGuard, vous aurez besoin des informations suivantes :

  1. 1.Assurez-vous que vous disposez de la clé privée disponible à l'étape 1 — Installation de WireGuard et génération d'une paire de clés . 

  2. 2.Si vous utilisez WireGuard avec IPv4, vous aurez besoin de l'adresse IP que vous avez choisie pour le serveur à l'étape 2(a) — Choix d'une plage IPv4 , qui dans cet exemple est . 

  3. 3.Si vous utilisez WireGuard avec IPv6, vous aurez besoin de l'adresse IP du serveur que vous avez généré à l'étape 2(b) — Choix d'une plage IPv6 . Dans cet exemple, l'adresse IP est fd0d:86fa:c3bc::1/64 

Une fois que vous disposez de la clé privée et des adresses IP requises, créez un nouveau fichier de configuration à l'aide de votre éditeur préféré nano en exécutant la commande suivante :

         

          sudo nano /etc/wireguard/wg0.conf

       

Ajoutez les lignes suivantes au fichier, en remplaçant votre clé privée à la place de la base64_encoded_private_key_goes_herevaleur en surbrillance, ainsi que la ou les adresses IP sur la Addressligne. Vous pouvez également modifier la ListenPortligne si vous souhaitez que WireGuard soit disponible sur un autre port :

 

         

 

/etc/wireguard/wg0.conf

[Interface]

PrivateKey = base64_encoded_private_key_goes_here

Address = 10.8.0.1/24, fd0d:86fa:c3bc::1/64

ListenPort = 51820

SaveConfig = true

La ligne SaveConfig garantit que lorsqu'une interface WireGuard est arrêtée, toutes les modifications seront enregistrées dans le fichier de configuration.

Enregistrez et fermez le fichier /etc/wireguard/wg0.conf. Si vous utilisez nano, vous pouvez le faire avec CTRL+X, puis Y et ENTER pour confirmer. Vous disposez désormais d'une configuration de serveur initiale sur laquelle vous pouvez vous appuyer en fonction de la manière dont vous envisagez d'utiliser votre serveur VPN WireGuard.

Étape 4 — Ajustement de la configuration réseau du serveur WireGuard

Si vous utilisez WireGuard pour connecter un « peer »  au serveur WireGuard afin d'accéder aux services sur le serveur uniquement , vous n'avez pas besoin de remplir cette section.

Si vous souhaitez acheminer le trafic Internet de votre homologue WireGuard via le serveur WireGuard, vous devrez alors configurer le transfert IP en suivant cette section du didacticiel.

Pour configurer le transfert, ouvrez le fichier /etc/sysctl.conf à l'aide de nano ou de votre éditeur préféré :

       

          sudo nano /etc/sysctl.conf

       

Si vous utilisez IPv4 avec WireGuard, ajoutez la ligne suivante en bas du fichier :

net.ipv4.ip_forward=1

Si vous utilisez IPv6 avec WireGuard, ajoutez cette ligne en bas du fichier :

net.ipv6.conf.all.forwarding=1

Si vous utilisez à la fois IPv4 et IPv6, assurez-vous d'inclure les deux lignes. Enregistrez et fermez le fichier lorsque vous avez terminé.

Pour lire le fichier et charger les nouvelles valeurs pour votre session de terminal en cours, exécutez :

         

          sudo sysctl -p

 

net.ipv6.conf.all.forwarding = 1

net.ipv4.ip_forward = 1

Votre serveur WireGuard sera désormais capable de transférer le trafic entrant du périphérique Ethernet VPN virtuel vers d'autres sur le serveur, et de là vers l'Internet public. L'utilisation de cette configuration vous permettra d'acheminer tout le trafic Web de votre WireGuard  Peer via l'adresse IP de votre serveur, et l'adresse IP publique de votre client sera effectivement masquée.

Cependant, avant que le trafic puisse être acheminé correctement via votre serveur, vous devrez configurer certaines règles de pare-feu. Ces règles garantiront que le trafic vers et depuis votre serveur WireGuard et vos « peers » circulent correctement.

Étape 5 — Configuration du pare-feu du serveur WireGuard

Dans cette section, vous allez modifier la configuration du serveur WireGuard pour ajouter des règles de pare-feu qui garantiront que le trafic vers et depuis le serveur et les clients est correctement acheminé. Comme pour la section précédente, ignorez cette étape si vous utilisez uniquement votre VPN WireGuard pour une connexion de machine à machine afin d'accéder aux ressources limitées à votre VPN.

Pour autoriser le trafic VPN WireGuard à travers le pare-feu du serveur, vous devrez activer le masquage, qui est un concept iptables qui fournit une traduction d'adresses réseau (NAT) dynamique à la volée pour acheminer correctement les connexions client.

Recherchez d'abord l'interface réseau publique de votre serveur WireGuard à l'aide de la sous-commande ip route :

       

          ip route list default

         

L'interface publique est la chaîne trouvée dans la sortie de cette commande qui suit le mot « dev ». Par exemple, ce résultat montre l'interface nommée eth0, qui est mise en évidence ci-dessous :

 

          Output

         default via 203.0.113.1 dev eth0 proto static

Notez le nom de votre appareil puisque vous l'ajouterez aux règles  iptables à l'étape suivante.

Pour ajouter des règles de pare-feu à votre serveur WireGuard, ouvrez à nouveau le fichier /etc/wireguard/wg0.conf avec nano ou votre éditeur préféré.

         

          sudo nano /etc/wireguard/wg0.conf

       

En bas du fichier après la ligne SaveConfig = true, collez les lignes suivantes :

 

          /etc/wireguard/wg0.conf

         . . .

PostUp = ufw route allow in on wg0 out on eth0

PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

PreDown = ufw route delete allow in on wg0 out on eth0

PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Les lignes PostUp s'exécuteront lorsque le serveur WireGuard démarrera le tunnel VPN virtuel. Dans l'exemple ici, il en ajoutera trois règles  ufw et iptables:

Les règles PreDown s'exécutent lorsque le serveur WireGuard arrête le tunnel VPN virtuel. Ces règles sont l'inverse des règles  PostUp et fonctionnent pour annuler les règles de transfert et de masquage de l'interface VPN lorsque le VPN est arrêté.

Dans les deux cas, modifiez la configuration pour inclure ou exclure les règles IPv4 et IPv6 appropriées à votre VPN. Par exemple, si vous utilisez uniquement IPv4, vous pouvez exclure les lignes avec les commandes ip6tables.

À l'inverse, si vous utilisez uniquement IPv6, modifiez la configuration pour inclure uniquement les commandes ip6tables. Les lignes ufw doivent exister pour toute combinaison de réseaux IPv4 et IPv6. Enregistrez et fermez le fichier lorsque vous avez terminé.

La dernière partie de la configuration du pare-feu sur votre serveur WireGuard consiste à autoriser le trafic vers et depuis le port WireGuard UDP lui-même. Si vous n'avez pas modifié le port dans le fichier /etc/wireguard/wg0.conf du serveur, le port que vous ouvrirez est 51820. Si vous avez choisi un port différent lors de la modification de la configuration, assurez-vous de le remplacer dans la commande UFW suivante.

Si vous avez oublié d'ouvrir le port SSH en suivant le didacticiel prérequis, ajoutez-le ici également :

         

          sudo ufw allow 51820/udp

 

          sudo ufw allow OpenSSH

         

Remarque : Si vous utilisez un autre pare-feu ou si vous avez personnalisé votre configuration UFW, vous devrez peut-être ajouter des règles de pare-feu supplémentaires. Par exemple, si vous décidez de tunneliser tout votre trafic réseau via la connexion VPN, vous devrez vous assurer que le trafic des ports 53 est autorisé pour les requêtes DNS et les ports comme 80 et 443 pour le trafic HTTP et HTTPS respectivement. Si vous utilisez d’autres protocoles sur le VPN, vous devrez également ajouter des règles pour eux.

Après avoir ajouté ces règles, désactivez et réactivez UFW pour le redémarrer et charger les modifications de tous les fichiers que vous avez modifiés :

 

         

          sudo ufw disable

 

          sudo ufw enable

 

         

Vous pouvez confirmer que les règles sont en place en exécutant la commande ufw status. Exécutez-le et vous devriez recevoir un résultat semblable à celui-ci :

         

          sudo ufw status

         

 

          Output

         Status: active

 

To                         Action      From

--                         ------      ----

51280/udp                  ALLOW       Anywhere                  

22/tcp                     ALLOW       Anywhere                  

51280/udp (v6)             ALLOW       Anywhere (v6)            

22/tcp (v6)                ALLOW       Anywhere (v6)

Votre serveur WireGuard est désormais configuré pour gérer correctement le trafic du VPN, y compris le transfert et le masquage pour les pairs. Une fois les règles de pare-feu en place, vous pouvez démarrer le service WireGuard lui-même pour écouter les connexions homologues.

Étape 6 — Démarrage du serveur WireGuard

WireGuard peut être configuré pour fonctionner comme un service systemd en utilisant son script wg-quick intégré. Bien que vous puissiez utiliser manuellement la commande wg pour créer le tunnel à chaque fois que vous voulez utiliser le VPN, c'est un processus manuel qui devient répétitif et sujet aux erreurs. Au lieu de cela, vous pouvez utiliser systemctl pour gérer le tunnel avec l'aide du script wg-quick.

L'utilisation d'un service systemd signifie que vous pouvez configurer WireGuard pour qu'il démarre au démarrage afin que vous puissiez vous connecter à votre VPN à tout moment tant que le serveur est en cours d'exécution. Pour ce faire, activez le service wg-quick pour le tunnel wg0 que vous avez défini en l'ajoutant à systemctl :

 

         

          sudo systemctl enable wg-quick@wg0.service

 

         

Notez que la commande spécifie le nom du périphérique wg0 du tunnel en tant que partie du nom du service. Ce nom correspond au fichier de configuration /etc/wireguard/.conf. Cette approche du nommage signifie que vous pouvez créer autant de tunnels VPN distincts que vous le souhaitez à l'aide de votre serveur.

Par exemple, vous pourriez avoir un périphérique de tunnel et un nom de prod et son fichier de configuration serait /etc/wireguard/prod.conf. Chaque configuration de tunnel peut contenir différents paramètres IPv4, IPv6 et de pare-feu client. De cette manière, vous pouvez prendre en charge plusieurs connexions de pairs différentes, chacune avec ses propres adresses IP et règles de routage.

Démarrez maintenant le service :

 

         

          sudo systemctl start wg-quick@wg0.service

 

         

Vérifiez que le service WireGuard est actif avec la commande suivante. Vous devriez voir actif (running) dans la sortie :

 

         

          sudo systemctl status wg-quick@wg0.service

 

          Output

         ● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0

     Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)

     Active: active (exited) since Wed 2021-08-25 15:24:14 UTC; 5s ago

       Docs: man:wg-quick(8)

             man:wg(8)

             https://www.wireguard.com/

             https://www.wireguard.com/quickstart/

             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8

             https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

    Process: 3245 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)

   Main PID: 3245 (code=exited, status=0/SUCCESS)

 

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] wg setconf wg0 /dev/fd/63

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -4 address add 10.8.0.1/24 dev wg0

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip -6 address add fd0d:86fa:c3bc::1/64 dev wg0

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip link set mtu 1420 up dev wg0

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ufw route allow in on wg0 out on eth0

Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added

Aug 25 15:24:14 wg0 wg-quick[3279]: Rule added (v6)

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

Aug 25 15:24:14 wg0 wg-quick[3245]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

Aug 25 15:24:14 wg0 systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

La sortie montre les commandes ip qui sont utilisées pour créer le périphérique virtuel wg0 et lui attribuer les adresses IPv4 et IPv6 que vous avez ajoutées au fichier de configuration. Vous pouvez utiliser ces règles pour dépanner le tunnel, ou avec la commande wg elle-même si vous souhaitez essayer de configurer manuellement l'interface VPN.

Une fois le serveur configuré et en marche, l'étape suivante consiste à configurer votre machine cliente en tant que WireGuard Peer et à se connecter au serveur WireGuard.

Étape 7 - Configuration d'un Pair WireGuard

Configurer un pair WireGuard est similaire à la configuration du serveur WireGuard. Une fois le logiciel client installé, vous générerez une paire de clés publique et privée, déciderez d'une adresse IP ou d'adresses pour le pair, définirez un fichier de configuration pour le pair, puis commencer le tunnel en utilisant le script wg-quick.

Vous pouvez ajouter autant de pairs que vous aimez à votre VPN en générant une paire de clés et une configuration en utilisant les étapes suivantes. Si vous ajoutez plusieurs pairs au VPN assurez-vous de suivre leurs adresses IP privées pour prévenir les collisions.

Pour configurer le Pair WireGuard, assurez-vous que le paquet WireGuard est installé en utilisant les commandes apt suivantes.  

Sur le pair WireGuard, exécutez :

         

          sudo apt update

 

          sudo apt install wireguard

 

Création de la paire de clés du pair WireGuard

Ensuite, vous aurez besoin de générer la paire clé sur le pair en utilisant les mêmes étapes que vous avez utilisé sur le serveur. De votre machine locale ou serveur distant qui servira de pair, procéder et créer la clé privée pour le pair en utilisant les commandes suivantes:

 

         

          wg genkey | sudo tee /etc/wireguard/private.key

 

          sudo chmod go= /etc/wireguard/private.key

 

         

Vous recevrez à nouveau une seule ligne de sortie encodée en base64, qui est la clé privée. Une copie de la sortie est également stockée dans le fichier /etc/wireguard/private.key. Notez bien la clé privée qui est générée car vous devrez l'ajouter au fichier de configuration de WireGuard plus tard dans cette section.

Ensuite, utilisez la commande suivante pour créer le fichier de clé publique :

 

         

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

 

         

Vous recevrez à nouveau une seule ligne de sortie encodée en base64, qui est la clé publique de votre WireGuard Peer. Copiez-la quelque part pour référence, car vous devrez distribuer la clé publique au serveur WireGuard afin d'établir une connexion cryptée.

Création du fichier de configuration du Peer WireGuard

Maintenant que vous avez une paire de clés, vous pouvez créer un fichier de configuration pour le pair qui contient toutes les informations dont il a besoin pour établir une connexion au serveur WireGuard.

Vous aurez besoin de quelques informations pour le fichier de configuration :

    - La clé privée encodée en base64 que vous avez générée sur le pair.

    - Les plages d'adresses IPv4 et IPv6 que vous avez définies sur le serveur WireGuard.

    - La clé publique encodée en base64 du serveur WireGuard.

    - L'adresse IP publique et le numéro de port du serveur WireGuard. Habituellement, il s'agit de l'adresse IPv4, mais si votre serveur a une adresse IPv6 et que votre machine cliente a une connexion IPv6 à Internet, vous pouvez l'utiliser à la place de l'adresse IPv4.

Avec toutes ces informations en main, ouvrez un nouveau fichier /etc/wireguard/wg0.conf sur la machine WireGuard Peer en utilisant nano ou votre éditeur préféré :

 

         

          sudo nano /etc/wireguard/wg0.conf

 

         

Ajoutez les lignes suivantes au fichier, en remplaçant les différentes données dans les sections surlignées, selon les besoins :

 

         

 

          /etc/wireguard/wg0.conf

[Interface]

PrivateKey = base64_encoded_peer_private_key_goes_here

Address = 10.8.0.2/24

Address = fd0d:86fa:c3bc::2/64

 

[Peer]

PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=

AllowedIPs = 10.8.0.0/24, fd0d:86fa:c3bc::/64

Endpoint = 203.0.113.1:51820

Remarquez que la première ligne Adresse utilise une adresse IPv4 du sous-réseau 10.8.0.0/24 que vous avez choisi plus tôt. Cette adresse IP peut être n'importe quelle adresse du sous-réseau tant qu'elle est différente de l'adresse IP du serveur. Incrémenter les adresses de 1 à chaque fois que vous ajoutez un pair est généralement la manière la plus simple d'allouer des adresses IP.

De même, remarquez que la deuxième ligne Adresse utilise une adresse IPv6 du sous-réseau que vous avez généré plus tôt, et incrémente l'adresse du serveur d'une unité. Là encore, toutes les adresses IP de la plage sont valables si vous décidez d'utiliser une adresse différente.

L'autre partie notable du fichier est la dernière ligne AllowedIPs. Ces deux plages IPv4 et IPv6 indiquent à l'homologue de n'envoyer du trafic via le VPN que si le système de destination possède une adresse IP dans l'une ou l'autre de ces plages. En utilisant la directive AllowedIPs, vous pouvez restreindre le VPN sur le pair à se connecter uniquement à d'autres pairs et services sur le VPN, ou vous pouvez configurer le paramètre pour tunneler tout le trafic sur le VPN et utiliser le serveur WireGuard comme une passerelle.

Si vous n'utilisez que l'IPv4, omettez l'intervalle fd0d:86fa:c3bc::/64 (y compris la virgule , ). Inversement, si vous n'utilisez que l'IPv6, n'incluez que le préfixe fd0d:86fa:c3bc::/64 et omettez la plage IPv4 10.8.0.0/24.

Dans les deux cas, si vous souhaitez envoyer tout le trafic de votre pair via le VPN et utiliser le serveur WireGuard comme passerelle pour tout le trafic, vous pouvez utiliser 0.0.0.0/0, qui représente l'ensemble de l'espace d'adressage IPv4, et ::/0 pour l'ensemble de l'espace d'adressage IPv6.

(Facultatif) Configuration d'un pair pour acheminer tout le trafic via le tunnel

Si vous avez choisi d'acheminer tout le trafic du pair sur le tunnel en utilisant les routes 0.0.0.0/0 ou ::/0 et que le pair est un système distant, vous devrez suivre les étapes de cette section. Si votre pair est un système local, il est préférable de sauter cette section.

Pour les homologues distants auxquels vous accédez via SSH ou un autre protocole utilisant une adresse IP publique, vous devrez ajouter des règles supplémentaires au fichier wg0.conf de l'homologue. Ces règles garantissent que vous pouvez toujours vous connecter au système depuis l'extérieur du tunnel lorsqu'il est connecté. Sinon, lorsque le tunnel est établi, tout le trafic qui serait normalement géré sur l'interface du réseau public ne sera pas acheminé correctement pour contourner l'interface du tunnel wg0, ce qui conduira à un système distant inaccessible.

Tout d'abord, vous devez déterminer l'adresse IP que le système utilise comme passerelle par défaut. Exécutez la commande ip route suivante :

 

         

          ip route list table main default

 

         

Vous obtiendrez le résultat suivant :

 

         

 

          Output

         default via 203.0.113.1 dev eth0 proto static

Notez l'adresse IP de la passerelle en surbrillance pour une utilisation ultérieure, et le nom de l'appareil. Le nom de votre périphérique peut être différent. Si c'est le cas, remplacez-le par eth0 dans les commandes suivantes.

Trouvez ensuite l'adresse IP publique du système en examinant le périphérique à l'aide de la commande ip address show :

 

         

          ip -brief address show eth0

 

         

Vous obtiendrez le résultat suivant :

 

         

 

          Output

         eth0             UP             203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64

Dans cet exemple, l'adresse IP surlignée (sans le /20) est l'adresse publique assignée au périphérique eth0 que vous devez ajouter à la configuration de WireGuard.

Ouvrez maintenant le fichier /etc/wireguard/wg0.conf du Peer WireGuard avec nano ou votre éditeur préféré.

 

         

          sudo nano /etc/wireguard/wg0.conf

 

         

Avant la ligne [Peer], ajouter les 4 lignes suivantes :

PostUp = ip rule add table 200 from 203.0.113.5

PostUp = ip route add table 200 default via 203.0.113.1

PreDown = ip rule delete table 200 from 203.0.113.5

PreDown = ip route delete table 200 default via 203.0.113.1

 

[Peer]

. . .

Ces lignes créeront une règle de routage personnalisée et ajouteront une route personnalisée pour s'assurer que le trafic public vers le système utilise la passerelle par défaut.

    - PostUp = ip rule add table 200 from - Cette commande crée une règle qui vérifie la présence d'entrées de routage dans la table numérotée 200 lorsque l'adresse IP correspond à l'adresse publique du système.

    - PostUp = ip route add table 200 default via - Cette commande assure que tout le trafic traité par la table 200 utilisera la passerelle pour le routage, au lieu de l'interface WireGuard.

Les lignes PreDown suppriment la règle personnalisée et la route lorsque le tunnel est fermé.

Note : Le numéro de table 200 est arbitraire lors de la construction de ces règles. Vous pouvez utiliser une valeur entre 2 et 252, ou vous pouvez utiliser un nom personnalisé en ajoutant une étiquette au fichier /etc/iproute2/rt_tables et en vous référant ensuite au nom au lieu de la valeur numérique.

Pour plus d'informations sur le fonctionnement des tables de routage sous Linux, consultez la section Tables de routage du Guide d'administration réseau de la couche IP avec Linux.

Si vous acheminez tout le trafic du pair à travers le VPN, assurez-vous que vous avez configuré les règles sysctl et iptables correctes sur le serveur WireGuard à l'étape 4 - Ajustement de la configuration du réseau du serveur WireGuard et à l'étape 5 - Configuration du pare-feu du serveur WireGuard.

(Facultatif) Configuration des résolveurs DNS du pair WireGuard

Si vous utilisez le serveur WireGuard comme passerelle VPN pour tout le trafic de votre pair, vous devrez ajouter une ligne à la section [Interface] qui spécifie les résolveurs DNS. Si vous n'ajoutez pas ce paramètre, vos requêtes DNS pourraient ne pas être sécurisées par le VPN, ou elles pourraient être révélées à votre fournisseur d'accès Internet ou à d'autres tiers.

Si vous n'utilisez WireGuard que pour accéder à des ressources sur le réseau VPN ou dans une configuration peer-to-peer, vous pouvez ignorer cette section.

Pour ajouter des résolveurs DNS à la configuration de votre pair, déterminez d'abord quels serveurs DNS votre serveur WireGuard utilise. Exécutez la commande suivante sur le serveur WireGuard, en remplaçant le nom de votre périphérique ethernet par eth0 s'il est différent de cet exemple :

 

         

          resolvectl dns eth0

 

         

Vous devriez obtenir un résultat comme le suivant :

 

         

 

          Output

         Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

Les adresses IP affichées correspondent aux résolveurs DNS utilisés par le serveur. Vous pouvez choisir d'utiliser l'un d'entre eux ou tous, ou seulement IPv4 ou IPv6 en fonction de vos besoins. Notez les résolveurs que vous utiliserez.

Ensuite, vous devrez ajouter les résolveurs que vous avez choisis au fichier de configuration de WireGuard Peer. De retour sur le WireGuard Peer, ouvrez le fichier /etc/wireguard/wg0.conf en utilisant nano ou votre éditeur préféré :

 

         

          sudo nano /etc/wireguard/wg0.conf

 

         

Avant la ligne [Peer], ajouter ce qui suit :

DNS = 67.207.67.2 2001:4860:4860::8844

 

[Peer]

. . .

Encore une fois, en fonction de vos préférences ou de vos exigences pour IPv4 et IPv6, vous pouvez modifier la liste en fonction de vos besoins.

Une fois que vous êtes connecté au VPN à l'étape suivante, vous pouvez vérifier que vous envoyez des requêtes DNS via le VPN en utilisant un site comme DNS leak test.com.

Vous pouvez également vérifier que votre homologue utilise les résolveurs configurés à l'aide de la commande resolvectl dns que vous avez exécutée sur le serveur. Vous devriez obtenir une sortie comme la suivante, montrant les résolveurs DNS que vous avez configurés pour le tunnel VPN :

 

         

 

           Output

          Global: 67.207.67.2 67.207.67.3

. . .

Avec tous ces paramètres de résolution DNS en place, vous êtes maintenant prêt à ajouter la clé publique du pair au serveur, puis à démarrer le tunnel WireGuard sur le pair.

Étape 8 - Ajout de la clé publique du Peer au serveur WireGuard

Avant de connecter le peer au serveur, il est important d'ajouter la clé publique du peer au serveur WireGuard. Cette étape garantit que vous serez en mesure de vous connecter et d'acheminer le trafic sur le VPN. Sans cette étape, le serveur WireGuard ne permettra pas à l'homologue d'envoyer ou de recevoir du trafic sur le tunnel.

Assurez-vous que vous avez une copie de la clé publique encodée en base64 pour le Peer WireGuard en exécutant :

 

         

          sudo cat /etc/wireguard/public.key

 

         

 

         

 

          Output

         PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Connectez-vous au serveur WireGuard et exécutez la commande suivante :

 

         

          sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd0d:86fa:c3bc::2

 

         

Notez que la partie allowed-ips de la commande prend une liste d'adresses IPv4 et IPv6 séparées par des virgules. Vous pouvez spécifier des adresses IP individuelles si vous souhaitez restreindre l'adresse IP qu'un homologue peut s'attribuer, ou une plage comme dans l'exemple si vos homologues peuvent utiliser n'importe quelle adresse IP dans la plage VPN. Notez également que deux homologues ne peuvent pas avoir le même paramètre d'adresses IP autorisées.

Si vous souhaitez mettre à jour les adresses IP autorisées pour un homologue existant, vous pouvez exécuter la même commande à nouveau, mais en changeant les adresses IP. Les adresses IP multiples sont supportées. Par exemple, pour modifier le Peer WireGuard que vous venez d'ajouter pour ajouter une IP comme 10.8.0.100 aux IP existantes 10.8.0.2 et fd0d:86fa:c3bc::2, vous devez exécuter ce qui suit :

 

         

          sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd0d:86fa:c3bc::2

 

         

Une fois que vous avez exécuté la commande pour ajouter le pair, vérifiez l'état du tunnel sur le serveur à l'aide de la commande wg :

 

         

          sudo wg

 

         

 

         

 

          Output

         interface: wg0

 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=

 private key: (hidden)

 listening port: 51820

 

peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

 allowed ips: 10.8.0.2/32, fd0d:86fa:c3bc::/128

Notez que la ligne peer montre la clé publique du WireGuard Peer, et les adresses IP, ou les plages d'adresses qu'il est autorisé à utiliser pour s'assigner une IP.

Maintenant que vous avez défini les paramètres de connexion du Peer sur le serveur, l'étape suivante consiste à démarrer le tunnel sur le Peer.

Etape 9 - Connexion du Peer WireGuard au tunnel

Maintenant que votre serveur et votre pair sont tous deux configurés pour supporter votre choix d'IPv4, IPv6, le transfert de paquets, et la résolution DNS, il est temps de connecter le pair au tunnel VPN.

Puisque vous ne souhaitez que le VPN soit activé pour certains cas d'utilisation, nous utiliserons la commande wg-quick pour établir la connexion manuellement. Si vous souhaitez automatiser le démarrage du tunnel comme vous l'avez fait sur le serveur, suivez les étapes de la section Étape 6 - Démarrage du serveur WireGuard au lieu d'utiliser la commande wq-quick.

Dans le cas où vous acheminez tout le trafic à travers le VPN et que vous avez configuré la redirection DNS, vous devrez installer l'utilitaire resolvconf sur le WireGuard Peer avant de démarrer le tunnel. Exécutez la commande suivante pour le faire :

 

         

          sudo apt install resolvconf

 

         

Pour démarrer le tunnel, exécutez ce qui suit sur le WireGuard Peer :

 

         

          sudo wg-quick up wg0

 

         

Vous obtiendrez le résultat suivant :

 

         

 

          Output

         [#] ip link add wg0 type wireguard

[#] wg setconf wg0 /dev/fd/63

[#] ip -4 address add 10.8.0.2/24 dev wg0

[#] ip -6 address add fd0d:86fa:c3bc::2/64 dev wg0

[#] ip link set mtu 1420 up dev wg0

[#] resolvconf -a tun.wg0 -m 0 -x

Remarquez les adresses IPv4 et IPv6 en surbrillance que vous avez attribuées à l'homologue.

Si vous définissez les adresses IP autorisées de l'homologue sur 0.0.0.0/0 et ::/0 (ou si vous utilisez d'autres plages que celles que vous avez choisies pour le VPN), votre résultat ressemblera à ce qui suit :

 

         

 

          Output

         [#] ip link add wg0 type wireguard

[#] wg setconf wg0 /dev/fd/63

[#] ip -4 address add 10.8.0.2/24 dev wg0

[#] ip -6 address add fd0d:86fa:c3bc::2/64 dev wg0

[#] ip link set mtu 1420 up dev wg0

[#] resolvconf -a tun.wg0 -m 0 -x

[#] wg set wg0 fwmark 51820

[#] ip -6 route add ::/0 dev wg0 table 51820

[#] ip -6 rule add not fwmark 51820 table 51820

[#] ip -6 rule add table main suppress_prefixlength 0

[#] ip6tables-restore -n

[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820

[#] ip -4 rule add not fwmark 51820 table 51820

[#] ip -4 rule add table main suppress_prefixlength 0

[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1

[#] iptables-restore -n

Dans cet exemple, remarquez les routes en surbrillance ajoutées par la commande, qui correspondent aux adresses IP autorisées dans la configuration de l'homologue.

Vous pouvez vérifier l'état du tunnel sur l'homologue à l'aide de la commande wg :

         

          sudo wg

 

         

 

         

 

          Output

         interface: wg0

 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

 private key: (hidden)

 listening port: 49338

 fwmark: 0xca6c

 

peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=

 endpoint: 203.0.113.1:51820

 allowed ips: 10.8.0.0/24, fd0d:86fa:c3bc::/64

 latest handshake: 1 second ago

 transfer: 6.50 KiB received, 15.41 KiB sent

Vous pouvez également vérifier à nouveau l'état du serveur et vous obtiendrez un résultat similaire.

Vérifiez que votre homologue utilise le VPN en utilisant les commandes ip route et ip -6 route. Si vous utilisez le VPN comme passerelle pour tout votre trafic Internet, vérifiez quelle interface sera utilisée pour le trafic destiné aux résolveurs DNS 1.1.1.1 et 2606:4700:4700::1111 de CloudFlare.

Si vous n'utilisez WireGuard que pour accéder aux ressources du VPN, substituez une adresse IPv4 ou IPv6 valide comme la passerelle elle-même dans ces commandes. Par exemple 10.8.0.1 ou fd0d:86fa:c3bc::1.

 

         

          ip route get 1.1.1.1

 

         

 

         

 

          Output

         1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000

   cache

Remarquez que le périphérique wg0 est utilisé et que l'adresse IPv4 10.8.0.2 que vous avez attribuée à l'homologue est utilisée. De même, si vous utilisez IPv6, exécutez ce qui suit :

 

         

          ip -6 route get 2606:4700:4700::1111

 

         

 

         

 

          Output

         2606:4700:4700::1111 from :: dev wg0 table 51820 src fd0d:86fa:c3bc::2 metric 1024 pref medium

Notez à nouveau l'interface wg0 et l'adresse IPv6 fd0d:86fa:c3bc::2 que vous avez attribuée à l'homologue.

Si votre homologue dispose d'un navigateur, vous pouvez également visiter ipleak.net et ipv6-test.com pour confirmer que votre homologue achemine son trafic via le VPN.

Une fois que vous êtes prêt à vous déconnecter du VPN sur votre homologue, utilisez la commande wg-quick :

 

 

         

          sudo wg-quick down wg0

 

         

Vous obtiendrez une sortie comme la suivante, indiquant que le tunnel VPN est fermé :

 

         

 

          Output

         [#] ip link delete dev wg0

[#] resolvconf -d tun.wg0 -f

Si vous définissez les AllowedIPs sur le pair à 0.0.0.0/0 et ::/0 (ou pour utiliser des plages autres que celles que vous avez choisies pour le VPN), alors votre sortie ressemblera à ce qui suit :

 

         

 

          Output

         [#] ip rule delete table 200 from 203.0.113.5

[#] ip route delete table 200 default via 203.0.113.1

[#] ip -4 rule delete table 51820

[#] ip -4 rule delete table main suppress_prefixlength 0

[#] ip -6 rule delete table 51820

[#] ip -6 rule delete table main suppress_prefixlength 0

[#] ip link delete dev wg0

[#] resolvconf -d tun.wg0 -f

[#] iptables-restore -n

[#] ip6tables-restore -n

Pour se reconnecter au VPN, exécutez à nouveau la commande wg-quick up wg0 sur le pair. Si vous souhaitez supprimer complètement la configuration d'un pair du serveur WireGuard, vous pouvez exécuter la commande suivante, en veillant à substituer la clé publique correcte pour le pair que vous souhaitez supprimer :

 

 

         

          sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

 

         

En général, vous n'aurez besoin de supprimer la configuration d'un pair que si celui-ci n'existe plus, ou si ses clés de chiffrement sont compromises ou modifiées. Sinon, il est préférable de laisser la configuration en place afin que le pair puisse se reconnecter au VPN sans avoir à ajouter sa clé et ses adresses autorisées à chaque fois.

Conclusion

Dans ce tutoriel, vous avez installé le paquet WireGuard et ses outils sur les systèmes serveur et client. Vous avez mis en place des règles de pare-feu pour WireGuard, et configuré les paramètres du noyau pour permettre le transfert de paquets en utilisant la commande sysctl sur le serveur. Vous avez appris à générer les clés de chiffrement privées et publiques de WireGuard et à configurer le serveur et le (ou les) pair(s) pour qu'ils se connectent l'un à l'autre.

Si votre réseau utilise IPv6, vous avez également appris à générer une plage d'adresses locales unique à utiliser pour les connexions entre pairs. Enfin, vous avez appris à limiter le trafic qui doit passer par le VPN en restreignant les préfixes réseau que le pair peut utiliser, ainsi qu'à utiliser le serveur WireGuard comme une passerelle VPN pour gérer tout le trafic Internet pour les pairs.

Si vous souhaitez en savoir plus sur WireGuard, y compris comment configurer des tunnels plus avancés, ou utiliser WireGuard avec des conteneurs, visitez la documentation officielle de WireGuard.