WireGuard est un logiciel open source relativement nouveau pour créer des tunnels VPN sur la couche IP en utilisant une cryptographie de pointe.
Ce dernier est réputé plus rapide qu’OpenVPN.
Par exemple NordVPN a migré son infrastructure OpenVPN vers une version modifiée de WireGuard.
On peut l’utiliser pour :
- Télétravail afin de rendre l’accès à un réseau LAN d’une entreprise
- Pour un serveur VPN privé pour masquer son adresse IP. Cela inclut aussi l’utilisation de pihole pour bloquer les pubs et trackers.
Voici comment installer et configurer un serveur Wireguard sur un Linux (Debian).
Enfin comment installer les clients Windows, Linux et Android.
Table des matières
Présentation de WireGuard
WireGuard est un serveur VPN récent qui utilise les algorithmes de chiffrement suivant :
- ChaCha20 pour le cryptage symétrique, authentifié avec Poly1305, en utilisant la construction AEAD de RFC7539
- Curve25519 pour ECDH
- BLAKE2s pour le hachage et le hachage par clé
- SipHash24 pour les clés de hachage
- HKDF pour la dérivation de clé, comme décrit dans RFC5869
Comme je l’ai dit dans l’introduction, WireGuard est réputé pour être plus rapide.
Du moins c’est ce que le projet libre indique.
Si on s’en tient à ce comparatif WireGuard, OpenVPN et IPSec, on voit bien qu’il est bien devant.
Comment installer le serveur VPN WireGuard
Wireguard permet donc une connexion VPN entre un client et un serveur cela à travers un tunnel sécurisé.
C’est le principe des VPN.
Pour ce faire, le client et serveur créé un coupe de clés privés et publics.
Puis on échange les clés publiques entre le client et le serveur afin que l’on puisse chiffre et déchiffrer les données.
C’est le principe des algorithmes de chiffrement asymétriques.
Il n’y a pas de prérequis particulier, si vous devez faire un partage de connexion via le VPN, pensez à activer le forward des interfaces :
sysctl -w net.ipv4.ip_forward=1 sysctl -w net.ipv6.conf.all.forwarding=1
Installer les paquets et générer la clé privée et publique
On commence par installer les paquets wireguard avec apt-get :
apt-get install wireguard wireguard-tools net-tools linux-headers-`uname -r`
Puis on génère les clés publiques et privées du serveur WireGuard.
cd /etc/wireguard/
umask 077; wg genkey | tee private.key | wg pubkey > public.key
Créer le fichier de configuration
Ensuite on créé le fichier de configuration du serveur Wireguard.
Pour cela, créez le fichier /etc/wireguard/wg0.conf
## Set Up WireGuard VPN on Debian By Editing/Creating wg0.conf File ##
[Interface]
## My VPN server private IP address ##
Address = 192.168.10.1/24
## My VPN server port ##
ListenPort = 51194
## VPN server's private key i.e. /etc/wireguard/privatekey ##
PrivateKey = aXXXXXXXQ=
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Voici quelques explications sur le contenu :
- Address : spécifiez l’adresse IP privée du serveur VPN
- SaveConfig : la configuration doit être sauvegardée à l’arrêt en utilisant l’état actuel de l’interface.
- PrivateKey : La clé privée du serveur VPN, qui se trouve dans le fichier /etc/wireguard/private.key sur le serveur.
- ListenPort : le serveur VPN WireGuard écoutera sur le port UDP 51194. Sinon le port par défaut est 51820.
- PublicKey : La clé publique du client VPN, qui se trouve dans le fichier /etc/wireguard/public.key sur l’ordinateur client.
- AllowedIPs : adresses IP que le client VPN est autorisé à utiliser. Dans cet exemple, le client ne peut utiliser que l’adresse IP 10.10.10.2 à l’intérieur du tunnel VPN.
- PostUp et PostDown : permet de passer des commandes lors de la connexion et déconnexion d’un pair. Utile dans le cas d’un partage de connexion via le VPN.
Une fois le fichier de configuration du serveur Wireguard en place, on peut démarrer le service.
systemctl start wg-quick@wg0
Erreur Cannot find device “wg0”
Dans mon cas, j’ai eu cette erreur qui indique qu’il ne peut trouver l’interface wg0.
Cela vient du fait que le module du noyau ne se charge pas.
Aug 09 18:50:43 ns3140199 systemd[1]: Starting WireGuard via wg-quick(8) for wg0…
Aug 09 18:50:43 ns3140199 wg-quick[14998]: [#] ip link add wg0 type wireguard
Aug 09 18:50:43 ns3140199 wg-quick[14998]: RTNETLINK answers: Operation not supported
Aug 09 18:50:43 ns3140199 wg-quick[14998]: Unable to access interface: Protocol not supported
Aug 09 18:50:43 ns3140199 wg-quick[14998]: [#] ip link delete dev wg0
Aug 09 18:50:43 ns3140199 wg-quick[14998]: Cannot find device "wg0"
Aug 09 18:50:43 ns3140199 systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE
Aug 09 18:50:43 ns3140199 systemd[1]: [email protected]: Failed with result 'exit-code'.
Aug 09 18:50:43 ns3140199 systemd[1]: Failed to start WireGuard via wg-quick(8) for wg0.
root@ns3140199:/etc/wireguard# modprobe wireguard
modprobe: FATAL: Module wireguard not found in directory /lib/modules/4.19.0-8-amd64
Lors de la compilation, dans /var/lib/dkms/wireguard/1.0.20200712/build/make.log, on trouve ces erreurs :
make[3]: *** [/usr/src/linux-headers-4.19.0-8-common/scripts/Makefile.build:309: /var/lib/dkms/wireguard/1.0.20200712/build/socket.o] Error 1
make[3]: *** Waiting for unfinished jobs….
make[2]: *** [/usr/src/linux-headers-4.19.0-8-common/Makefile:1537: module/var/lib/dkms/wireguard/1.0.20200712/build] Error 2
make[1]: *** [Makefile:146: sub-make] Error 2
make: *** [Makefile:8: all] Error 2
make: Leaving directory '/usr/src/linux-headers-4.19.0-8-amd64'
root@ns3140199:/etc/wireguard# /usr/lib/dkms/dkms_autoinstaller start
[….] dkms: running auto installation service for kernel 4.19.0-8-amd64:
Kernel preparation unnecessary for this kernel. Skipping…
La solution sur Reddit
Comment installer le client VPN Wireguard
La partie serveur est prêt, on peut passer à l’installation des clients.
Il est compatible avec toutes les distributions Linux mais aussi pour Windows et Android.
La page de téléchargement Wireguard.
Ensuite c’est très simple :
- On installe le client
- Puis on créé le fichier de configuration en indiquant l’IP du client à utiliser.
- Enfin une clé publique est générique que l’on va ensuite autoriser sur le serveur
Voici un exemple de fichiers de configuration du client.
[Interface]
PrivateKey = aK9KmBHXXXX
Address = 192.168.10.2/32
DNS = 192.168.10.1
[Peer]
PublicKey = XXXXXjSX4CbXS0=
AllowedIPs = 0.0.0.0/0
Endpoint = 54.xx.xx.xx:51194
PersistentKeepalive = 20
Les explications :
- Address: spécifiez l’adresse IP privée du client VPN. Mettez bien le masque /32.
- DNS (optionnel) : spécifiez 192.168.10.1 (serveur VPN) comme serveur DNS.
- PrivateKey: clé privée du client, qui se trouve dans le fichier /etc/ wireguard/privatekey sur l’ordinateur client.
- PublicKey: clé publique du serveur, qui se trouve dans le fichier /etc/ wireguard/publickey sur le serveur.
- AllowedIPs 0.0.0.0/0 représente l’ensemble de l’Internet, ce qui signifie que tout le trafic vers Internet doit être acheminé via le VPN. Sinon spécifier la classe d’IP du réseau VPN : ex 192.168.10.0/24
- Endpoint (optionnel) : adresse IP publique et numéro de port du client
- PersistentKeepalive: Envoyez un paquet vide authentifié au pair toutes les 25 secondes pour maintenir la connexion active. Si PersistentKeepalive n’est pas activé, le serveur VPN ne pourra peut-être pas envoyer une requête ping au client VPN.
Windows
Voici comment installer WireGuard sur Windows.
- Télécharger puis installer le client WireGuard
- Puis exécutez le
- En bas à gauche, cliquez sur le bouton Ajouter un tunnel vide
- Nommez le nom du tunnel
- La clé privée et alors créée et directement intégré dans la section [Interface]
- La clé publique du client apparaît alors en haut
- Utilisez comme explique le fichier de configuration donné précédemment
- Validez sur le bouton Enregistrer
- Puis tentez une connexion au tunnel
Linux (Ubuntu)
Voici comment installer le client sur Linux, par exemple ici avec une Ubuntu.
- Activer les dépôts wireguard puis utilisez apt-get pour l’installer
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get install wireguard resolvconf
Puis on génère le couple de clés privées et publiques du client :
cd /etc/wireguard/
umask 077; wg genkey | tee privatekey | wg pubkey > publickey
Puis créez le fichier /etc/wg0.conf avec la configuration qui va bien :
Puis un test de connexion pour voir que l’on a bien le trafic internet routé vers le VPN.
Raspberry PI
Les paquets sur raspberrypi ne sont pas disponibles pour le moment.
Il faut activer les dépôts testing.
Cette manipulation ne sera plus nécessaire lors de la prochaine mise à jour de distribution qui devrait intégrer les paquets WireGuard par défaut.
Pour ce faire :
echo "deb http://archive.raspbian.org/raspbian testing main" | sudo tee --append /etc/apt/sources.list.d/testing.list
sudo apt update
sudo apt-get install wireguard
Puis le reste est identique à Linux.
Android
Enfin on termine avec l’insallation du client WireGuard sur Android.
- Ouvrez le Playstore pour installer wireguard
- On lance le client Wireguard pour cliquer sur le bouton + en bleue afin de créer une connexion
- On peut alors créer un fichier de zéro ou importer depuis un autre fichier de configuration, c’est ce que j’ai fait ici.
- On modifie le fichier si besoin.. puis on lance la connexion.
- Donnez ensuite les autorisations qui vont bien à WireGuard
- Puis la connexion VPN s’établit sans problème.
Comment activer et voir les logs WireGuard
Par défaut, Wireguard ne fait aucune journalisation ainsi vous n’avez aucun log pour visualiser les erreurs et débuger.
Toutefois, il existe des solutions afin d’activer les logs dans WireGuard.
Suivez ce tutoriel :
Comment modifier la configuration WireGuard
Nous avons donc configuré les clients mais ce n’est pas fini.
En effet, il faut déclarer les peers sur le serveur.
Cela à travers des sections [Peer].
Pour éditer la configuration du serveur :
wg-quick down wg0 ; vim /etc/wireguard/wg0.conf ; wg-quick up wg0
Puis on ajoute les sections [Peer] avec la clé publique du client et son adresse IP sur le réseau VPN.
[Interface]
Address = 192.168.10.1/24
SaveConfig = true
ListenPort = 51194
PrivateKey = aK9KmBHXXXX
[Peer]
PublicKey = wr5IFvffIZv1XYiyB9FxEEq04VbkJjXfMnz1wUYl6mk=
AllowedIPs = 192.168.10.5/32
Endpoint = 86.198.118.124:63321
PersistentKeepalive = 20
[Peer]
PublicKey = mkz7IULKW4L7x8ObviMV65SJe11aJOdPOF5esbLg/xM=
AllowedIPs = 192.168.10.6/32
PersistentKeepalive = 20
[Peer]
PublicKey = 6CFuuilD5PBgg7Y4X5SUwHTPUGCep+Ebmz1DLbtnN3o=
AllowedIPs = 192.168.10.7/32
PersistentKeepalive = 20
Au final, on obtient le fichier /etc/wireguard/wg0.conf suivant :
Afin de bien comprendre les échanges de clés publiques.
La commande wg et wg-quick
La commande wg-quick permet de monter et descendre l’interface du VPN Wireguard.
wg-quick down wg0
wg-quick up wg0
Mais on peut bien entendu utiliser systemctl puisque WireGuard fonctionne en tant que service et daemon :
systemctl restart wg-quick@wg0
La commande wg possède plusieurs options :
- show : affiche la configuration actuelle et les informations sur l’appareil
- showconf : affiche la configuration actuelle d’une interface WireGuard donnée, à utiliser avec `setconf ‘
- set : modifier la configuration actuelle, ajouter des pairs, supprimer des pairs ou changer de pairs
- setconf : applique un fichier de configuration à une interface WireGuard
- addconf : ajoute un fichier de configuration à une interface WireGuard
- syncconf : synchronise un fichier de configuration avec une interface WireGuard
- genkey : génère une nouvelle clé privée et l’écrit dans stdout
- genpsk : génère une nouvelle clé pré-partagée et l’écrit dans stdout
- pubkey : lit une clé privée depuis stdin et écrit une clé publique sur stdout
Par exemple, la commande wg show sur le serveur permet de vérifier la configuration ainsi que les clients connectés.
Lorsqu’aucun client n’est connecté :
wg show
Avec des clients connectés :
Liens
- Installer et configurer un serveur VPN WireGuard sur Linux et client (Windows, Android, Ubuntu)
- Comment utiliser les commandes wg et wg-quick (Wireguard)
- Comment activer et voir les logs WireGuard
- Résoudre les erreurs dans les logs WireGuard
- Comment installer OpenVPN sur Ubuntu, Debian
- Installer un raspberry en routeur VPN + pi-hole (NordVPN ou ProtonVPN)
- Serveur d’anonymat : OpenVPN + Proxy et TOR
- pi-hole : bloquer la publicité et trackers
- Configurer pihole avec DNSCrypt ou DNS over HTTPS (DoH)