Wireguard

De ArchwikiFR


WireGuard® est un VPN extrêmement simple mais rapide et moderne qui utilise une cryptographie de pointe. Il vise à être plus rapide, plus simple, plus léger et plus utile qu'IPSec, tout en évitant la prise de tête.

Important : Wireguard n'est pas stable, et n'a pas été audité complètement. MÉFIEZ-VOUS DES DRAGONS ; BATTERIES NON INCLUSES ; SOL GLISSANT

Installation

Installer dkms, les headers pour votre noyau (typiquement linux-headers ou linux-lts-headers), ainsi que wireguard-tools.

Utilisation

Note : Il est possible de ne pas utiliser de fichier de configuration et d'utiliser uniquement ip(8) et wg(8), mais c'est infernal à documenter ici : se référer au wiki anglophone

Principes

Chaque noeud du VPN Wireguard est identifié par une clef cryptographique publique, comme ysVmXI769pZ29CUSMWxXep7mnuw3WDXECHNHsyMQHjU=.

Sur chaque noeud, il faut également déclarer quelles sont les addresses qu'on peut s'attendre à voir arriver depuis chaque autre noeud : ce sont les AllowedIPs.

Quick-start

Dans un premier temps, on génère sur chacun des noeuds une paire de clefs.

cd /etc/wireguard
(umask 077; wg genkey > privatekey)
wg pubkey < privatekey > publickey

On lance ensuite deux dés à 256 faces pour déterminer le réseau qu'on va utiliser pour le VPN.

vpnprefix="10.$((RANDOM%256)).$((RANDOM%256))"
echo "IP du noeud 1 : $vpnprefix.1\nIP du noeud 2 : $vpnprefix.2"

On récupère l'IP publique d'un des deux noeuds, puis on procède à la rédaction des configurations.

Fichier: /etc/wireguard/wg0.conf
# Sur le noeud 1, le "serveur"
[Interface]
# le /24 est important : on définit un réseau (/24) auquel l'interface appartient
Address = 10.X.Y.1/24
PrivateKey = <contenu de /etc/wireguard/privatekey>
# 51280 est le port par défaut, libre à vous d'adapter au besoin
ListenPort = 51280

# On définit qui est le second noeud
[Peer]
PublicKey = <contenu de /etc/wireguard/publickey sur le second noeud>
# le /32 est important : on définit que :
# - les paquets réseau à destination de 10.X.Y.2/32 seront envoyés au second noeud
# - le second noeud ne va envoyer sur l'interface du VPN que des paquets réseau dont la source est 10.X.Y.2
AllowedIPs = 10.X.Y.2/32
Fichier: /etc/wireguard/wg0.conf
# Sur le noeud 2, le "client"
[Interface]
# le /24 est important : on définit un réseau (/24) auquel l'interface appartient
Address = 10.X.Y.2/24
PrivateKey = <contenu de /etc/wireguard/privatekey>

# On définit qui est le "serveur"
[Peer]
PublicKey = <contenu de /etc/wireguard/publickey sur le premier noeud>
# le /24 indique ici que tous les noeuds du VPN vont d'abord communiquer avec le serveur,
# qui va nous renvoyer ce qui nous concerne :
# on peut s'attendre à recevoir du trafic de la part d'hypothétiques nouveaux noeuds qui seraient dans 10.X.Y/24
AllowedIPs = 10.X.Y.0/24
Endpoint = <IP publique du noeud 1>:51280
# En général les clients sont derrière du NAT, et si on veut que le serveur puisse joindre le client à tout moment, il faut :
PersistentKeepalive = 15

On allume tout, on vérifie que ça fonctionne.

root@noeud1 # wg-quick up wg0
root@noeud2 # wg-quick up wg0
user@noeud1 % ping -c5 10.X.Y.2
user@noeud2 % ping -c5 10.X.Y.1

Si ça ping, tout est bon. Sinon : vérifier les IPs, vérifier que le serveur est joignable (dans une DMZ domestique, etc.). Au besoin, il est possible de spécifier un FQDN dans le Endpoint =.

L'outil wg permet d'afficher les statistiques d'utilisation.

root@noeud1 # wg
interface: wg0
  public key: xxx
  private key: (hidden)
  listening port: 51820

peer: yyy
  endpoint: <déterminé lorsque ça tourne>
  allowed ips: 10.X.Y.2/32
  latest handshake: 15 seconds ago
  transfer: 28.45 MiB received, 566.30 MiB sent

IPv6

Wireguard supporte correctement les IPv6 : il suffit de les ajouter après une virgule, là où il y avait des IPv4.

[Interface]
[...]
Address = 10.X.Y.1/24, 1:2:3::1/64
[Peer]
[...]
AllowedIPs = 10.X.Y.2/32, 1:2:3::2/128

Redirections & partage de LAN

Redirection de tout le trafic

Wireguard peut être utilisé pour protéger tout le trafic en l'envoyant au "serveur". Cf. le site Wireguard qui propose d'autres méthodes plus complexes qui ne sont pas abordées ici.

Pour cela : il faut que le serveur soit un routeur (se référer au wiki anglophone ou à la documentation de l'OS du serveur) ; et il faut indiquer que tout internet est joignable à travers le serveur.

Fichier: /etc/wireguard/wg0.conf
# Sur le noeud 2, le "client"
[Interface]
Address = 10.X.Y.2/24
PrivateKey = <contenu de /etc/wireguard/privatekey>

# On définit qui est le "serveur"
[Peer]
PublicKey = <contenu de /etc/wireguard/publickey sur le premier noeud>
# On fait confiance au serveur, et on dit qu'internet entier est joignable à travers le serveur
AllowedIPs = 0.0.0.0/0, ::0/0
Endpoint = <IP publique du noeud 1>:51280
PersistentKeepalive = 15


Redirection d'un LAN

Dans un contexte similaire aux RoutedLans d'OpenVPN, il est possible de partager des LANs grâce à wireguard.

On ajoute à notre réseau un noeud 3 qui dispose d'un LAN 10.A.B.0/24. On doit alors éditer la conf du serveur, et créer la conf pour le noeud 3.

Fichier: /etc/wireguard/wg0.conf
# Sur le noeud 1, le "serveur"
[Interface]
# le /24 est important : on définit un réseau (/24) auquel l'interface appartient
Address = 10.X.Y.1/24
PrivateKey = <contenu de /etc/wireguard/privatekey>
# 51280 est le port par défaut, libre à vous d'adapter au besoin
ListenPort = 51280

# On définit qui est le second noeud
[Peer]
PublicKey = <contenu de /etc/wireguard/publickey sur le second noeud>
# le /32 est important : on définit que :
# - les paquets réseau à destination de 10.X.Y.2/32 seront envoyés au second noeud
# - le second noeud ne va envoyer sur l'interface du VPN que des paquets réseau dont la source est 10.X.Y.2
AllowedIPs = 10.X.Y.2/32

# On définit le nouveau noeud
[Peer]
PublicKey = <contenu de /etc/wireguard/publickey sur le troisième noeud>
# On sait que le troisième noeud aura une IP dans le VPN (10.X.Y.3),
# mais aussi qu'il y a un LAN derrière : on l'indique ici.
AllowedIPs = 10.X.Y.3/32, 10.A.B.0/24
Fichier: /etc/wireguard/wg0.conf
# Sur le noeud 3, le "client qui a aussi un LAN derrière lui"
[Interface]
Address = 10.X.Y.3/24
PrivateKey = <contenu de /etc/wireguard/privatekey>

# On définit qui est le "serveur"
[Peer]
PublicKey = <contenu de /etc/wireguard/publickey sur le premier noeud>
# Tout le VPN est joignable à travers le serveur
AllowedIPs = 10.X.Y.0/24
Endpoint = <IP publique du noeud 1>:51280
PersistentKeepalive = 15

# On ne définit pas le noeud 2 dans la conf du noeud 3

Systemd

Une fois que tout fonctionne, on peut activer le service qui va bien.

wg-quick down wg0
systemctl enable --now wg-quick@wg0.service