Introduction Wireguard
WireGuard VPN - Présentation
WireGuard est une implémentation VPN simple, rapide et moderne, largement déployée et multiplateforme.
Les VPN ont traditionnellement été difficiles à comprendre, à configurer et à déployer. WireGuard a supprimé la majeure partie de cette complexité en se concentrant sur sa tâche unique et en laissant de côté des éléments tels que la distribution des clés et les configurations poussées. Vous obtenez une interface réseau qui crypte et vérifie le trafic, et les tâches restantes comme la configuration des adresses, le routage, etc. sont laissées aux outils système habituels comme ip-route(8)
et ip-address(8)
.
La configuration des clés cryptographiques est très similaire à la configuration de ssh pour l’authentification par clé : chaque côté de la connexion a sa propre clé privée et publique, et la clé publique des peers
, et cela suffit pour commencer à chiffrer et vérifier le trafic échangé.
Pour plus de détails sur le fonctionnement de WireGuard et des informations sur sa disponibilité sur d’autres plates-formes, veuillez consulter la section des références.
Concepts WireGuard
Il est utile de considérer WireGuard principalement comme une interface réseau, comme n’importe quelle autre. Il aura les attributs habituels, comme l’adresse IP, CIDR, et il y aura un routage associé. Mais il possède également des attributs spécifiques à WireGuard, qui gèrent la partie VPN des choses.
Tout cela peut être configuré via différents outils. WireGuard lui-même fournit ses propres outils dans le package de l’espace utilisateur wireguard-tools : wg(8) et wg-quick(8). Mais ceux-ci ne sont pas strictement nécessaires : n’importe quel espace utilisateur avec les bons privilèges et les appels du noyau peut configurer une interface WireGuard. Par exemple, systemd-networkd et network-manager peuvent le faire eux-mêmes, sans les utilitaires de l’espace utilisateur WireGuad.
Les attributs importants d’une interface WireGuard sont :
- clé privée : avec la clé publique correspondante, elles sont utilisées pour authentifier et chiffrer les données. Ceci est généré avec la commande wg genkey. port d’écoute : le port UDP sur lequel WireGuard écoutera le trafic entrant. Liste des pairs, chacun avec :
- clé publique : la contrepartie publique de la clé privée. Généré à partir de la clé privée de ce pair, à l’aide de la commande wg pubkey. point de terminaison : où envoyer le trafic chiffré. Ceci est facultatif, mais au moins un des pairs correspondants doit l’avoir pour amorcer la connexion.
- IP autorisées : liste des réseaux ou adresses de destination du tunnel interne pour ce pair lors de l’envoi de trafic, ou, lors de la réception de trafic, quels réseaux ou adresses sources sont autorisés à nous envoyer du trafic.
Note
|
La cryptographie n’est pas simple__. Lorsque nous disons que, par exemple, une clé privée est utilisée pour déchiffrer ou signer le trafic, et qu’une clé publique est utilisée pour chiffrer ou vérifier l’authenticité du trafic, c’est une simplification et cache beaucoup de détails importants. WireGuard a une explication détaillée de ses protocoles et de la gestion de la cryptographie sur son site Web, à l’adresse https://www.wireguard.com/protocol/ |
Ces paramètres peuvent être définis avec l’outil de bas niveau wg(8)
, directement via la ligne de commande ou avec un fichier de configuration. Cet outil, cependant, ne gère pas les paramètres non-WireGuard de l’interface. Il ne lui attribuera pas d’adresse IP, par exemple, ni ne configurera le routage. Pour cette raison, il est plus courant d’utiliser wg-quick(8)
.
wg-quick(8)
gérera le cycle de vie de l’interface WireGuard. Il peut l’activer ou le désactiver, configurer le routage, exécuter des commandes arbitraires avant ou après l’activation de l’interface, etc. Il augmente le fichier de configuration que wg(8) peut utiliser, avec ses propres paramètres supplémentaires, ce qu’il est important de garder à l’esprit lors de l’envoi de ce fichier à wg(8)
, car il contiendra des paramètres dont wg(8)
ne sait rien.
Le fichier de configuration wg-quick(8)
peut avoir un nom arbitraire, et peut même être placé n’importe où sur le système, mais la meilleure pratique est :
- Placez le fichier dans
/etc/wireguard
. - Nommez-le d’après l’interface qu’il contrôle.
Par exemple, un fichier appelé
/etc/wireguard/wg0.conf
contiendra les paramètres de configuration nécessaires pour une interface réseau WireGuard appeléewg0
. En suivant cette pratique, vous bénéficiez de la possibilité d’appelerwg-quick
avec juste le nom de l’interface :
sudo wg-quick up wg0
Et cela affichera l’ wg0interface, lui donnera une adresse IP, configurera le routage et configurera les paramètres spécifiques de WireGuard pour qu’il fonctionne. Cette interface est généralement appelée wg0, mais peut avoir n’importe quel nom d’interface réseau valide, comme office(elle n’a pas besoin d’un numéro d’index après le nom), , home1etc. Il peut être utile de lui donner un nom significatif si vous prévoyez de vous connecter à plusieurs pairs. .
Passons en revue un exemple d’un tel fichier de configuration :
[Interface]
PrivateKey = eJdSgoS7BZ/uWkuSREN+vhCJPPr3M3UlB3v1Su/amWk=
ListenPort = 51000
Address = 10.10.11.10/24
[Peer]
# office
PublicKey = xeWmdxiLjgebpcItF1ouRo0ntrgFekquRJZQO+vsQVs=
Endpoint = wg.example.com:51000 # fake endpoint, just an example
AllowedIPs = 10.10.11.0/24, 10.10.10.0/24
Dans la rubrique [Interface]
:
Address
: il s’agit de l’adresseIP
et duCIDR
avec lesquels l’interface _WireGuard sera configurée.ListenPort
: le portUDP
que WireGuard utilisera pour le trafic (écoute et envoi).PrivateKey
: la clé secrète utilisée pour déchiffrer le trafic destiné à cette interface. La liste despeers
, chacun dans sa propre section[Peer]
(l’exemple ci-dessus n’en a qu’un), vient ensuite :PublicKey
: la clé qui sera utilisée pour chiffrer le trafic vers ce pair.Endpoint
: où envoyer le trafic crypté.AllowedIPs
: lors de l’envoi de trafic, il s’agit de la liste des adresses cibles qui identifient ce pair. Lors de la réception du trafic, c’est la liste des adresses qui sont autorisées à être la source du trafic. Pour générer les paires de clés pour chaque pair, la commandewg(8)
est utilisée :
$ umask 077
$ wg genkey > wg0.key
$ wg pubkey < wg0.key > wg0.pub
Et puis le contenu de wg0.key
et wg0.pub
peut être utilisé dans le fichier de configuration.
Voici à quoi cela ressemble lorsque cette interface est mise en place par wg-quick(8)
:
$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.10.11.10/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.10.10.0/24 dev wg0
Voici ce qui wg-quick(8)
a fait pour nous :
- Création de l’interface WireGuard
wg0
. - Configuré avec les données du fichier de configuration.
- Ajout de l’
IP/CIDR
du Addresschamp à l’ wg0interface. - Calculé un
MTU
approprié (qui peut être remplacé dans la configuration si nécessaire) - Ajout d’un itinéraire pour
AllowedIPs
. Notez que dans cet exemplellowedIPs
est une liste de deux blocs de réseauCIDR
, maiswg-quick(8)
seulement ajouté une route pour10.10.10.0/24
et ignoré10.10.11.0/24
. C’est parce que leAddress
a déjà été spécifié comme un/24
. Si nous avions spécifié l’adresse comme10.10.11.10/32
à la place,wg-quick(8)
nous aurions alors ajouté une route pour10.10.11.0/24
explicitement.
Pour mieux comprendre le AllowedIPs
fonctionnement, passons en revue un exemple rapide.
Disons que ce système veut envoyer du trafic vers 10.10.10.201/24
. Il y a une route pour cela qui dit d’utiliser l’interface wg0
pour cela :
$ ip route get 10.10.10.201
10.10.10.201 dev wg0 src 10.10.11.10 uid 1000
cache
Puisque wg0
est une interface WireGuard, il consultera sa configuration pour voir si un peer
a cette adresse cible dans la liste AllowedIPs
. Il s’avère qu’un peer
l’a, auquel cas le trafic :
-
- Sera authentifié comme le notre et crypté pour ce
peer
.
- Sera authentifié comme le notre et crypté pour ce
-
- Envoyé vers le
Endpoint
.
- Envoyé vers le
Imaginons maintenant l’inverse. Ce système recevait du trafic sur le port ListenPort
UDP. S’il peut être déchiffré et vérifié comme provenant de l’un des peers
répertoriés à l’aide de sa clé publique respective, et si l’adresse IP
source correspond à la liste AllowedIPs
correspondante, le trafic est alors accepté.
Et s’il n’y en a pas d’Endpoint
? Eh bien, pour amorcer le VPN, au moins l’un des peers
doit avoir un Endpoint
, sinon il ne saura pas où envoyer le trafic, et vous obtiendrez une erreur disant “Adresse de destination requise”.
Mais une fois que les peers
se connaissent, celui qui n’avait pas de paramètre Endpoint
dans l’interface se souviendra d’où provient le trafic et utilisera cette adresse comme point de terminaison actuel. Cela a un effet secondaire très agréable qui est de suivre automatiquement un endpoint mobile (raod warrior peer
), qui ne cesse de changer d’adresse IP. C’est très courant avec les ordinateurs portables qui sont suspendus et remis en route dans un nouveau réseau, puis tentent d’établir à nouveau le VPN
à partir de cette nouvelle adresse.
Peers
Vous remarquerez que le terme peer
est utilisé de indifféremment pour serveur
ou client
. D’autres termes utilisés dans certaines documentations VPN
sont gauche
et droite
, ce qui commence déjà à signifier que la différence entre un serveur
et un client
est un peu floue. Seul importe, le cas échéant, au début de l’échange de trafic : qui envoie le premier paquet de données. En ce sens, les serveurs
s’attendent à rester inactifs et à attendre que les connexions soient lancées vers eux, et les clients
sont les initiateurs. Par exemple, un ordinateur portable dans un café public initiant une connexion au pair VPN de l’entreprise. L’ordinateur portable doit connaître l’adresse de ce pair, car il initie l’échange. Mais le serveur
n’a pas besoin de connaître l’adresse IP
de l’ordinateur portable au préalable.
Sur un VPN de site à site, cependant, lorsque deux réseaux distincts sont connectés via le tunnel, qui est le serveur et qui est le client ? Les deux, il est donc préférable de les appeler peers
à la place.
Récapitulatif
Principaux points à retenir de cette introduction :
- Chaque
peer
participant au VPN WireGuard possède une clé privée et une clé publique. AllowedIPs
est utilisé comme clé de routage lors de l’envoi de trafic et comme ACL lors de la réception de trafic.- Pour établir un VPN avec un
peer
distant, vous avez besoin de sa clé publique. De même, lepeer
distant aura besoin de votre clé publique. - Au moins un des
peers
a besoin d’unEndpoint
configuré afin de pouvoir initier leVPN
.