Mise en place de WireGuard
Tutoriel d'installation du VPN WireGuard en Split-Tunnel ou Full-Tunnel sur Linux (Ici Ubuntu) et création du fichier de configuration du premier client
— But du tutoriel
- Installer et configurer WireGuard
- Choisir et comprendre la configuration Split-Tunnel pour ne rediriger que les requêtes de certaines IP par le biais de votre VPN.
- Bonus: Si vous avez un Pi-hole dans votre foyer, il sera possible d'utiliser le DNS de votre Pi-hole grâce au VPN WireGuard. (Bien évidemment ceci est aussi possible avec d'autre VPN)
Pi-hole est un outil permettant de filtrer les requêtes DNS, il est utilisé pour bloquer les publicités, traqueurs, et plus sur tous les appareils d'un foyer sans installer d'application sur chacun de ses appareils
Dans ce tutoriel nous verrons comment mettre en place un VPN moderne (WireGuard)
Nous verrons comment configurer WireGuard en Split-Tunnel côté client pour que seul les requêtes DNS soient redirigées vers le VPN. Split-tunnel signifie que vous 'autorisez' seulement certaines requêtes à passer par le VPN et que les autres continuerons d'utiliser votre connexion normale/actuelle sans passer par le VPN.
Il existe un client WireGuard ( Liste des appareils compatibles : https://www.wireguard.com/install/ ) pour toutes les plateformes majeures, aucun problème de compatibilité de ce côté là (que ça soit iOS, Android, Windows ou Mac).
Les points forts de WireGuard
- Pas de problème d'overhead comme avec OpenVPN
- Reconnexion rapide (Passage sous un pont, perte de signal réseau...)
- Configuration et installation simple et efficace
Ma configuration est la suivante
Ma box est connectée à internet et ma Raspberry Pi 4 (Ubuntu Server 18) est connectée en ethernet à ma box. Dans ce cas là il n'est en général pas nécessaire d'installer de firewall sur votre Raspberry puisque seul les ports que vous aurez redirigés de votre box vers celle-ci seront accessibles depuis l’extérieur.
J'ai uniquement redirigé le port 51820 (Port par défaut utilisé pour la connexion WireGuard) vers la Raspberry. Aucun autre port n'a besoin d'être redirigé puisque une fois connecté au VPN, ce sera comme si vous étiez chez vous, en local ; il sera alors possible d'accéder à tous les ports de la Raspberry.
Si vous souhaitez rediriger le trafic internet par le biais de votre VPN il faudra activer le 'transfert' du trafic IPV4 :
Éditer le fichier en écrivant nano /etc/sysctl.conf
Et ajouter net.ipv4.ip_forward = 1
en bas de celui-ci
Pour appliquer la modification immédiatement : sysctl -p
— Installer WireGuard sur le serveur
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard
Pour les autres plateformes, cliquez ici)
— Configuration de WireGuard sur le serveur
Générer une clé privée et sa clé publique
Rentrer la commande wg genkey | tee privatekey | wg pubkey > publickey
Explication de la commande : wg genkey
génère une clé privée, tee privatekey
écrit le résultat de wg genkey
dans le fichier privatekey
et renvoie la privatekey vers la commande wg pubkey
qui génère alors la clé publique à partir (dérivation) de la clé privée et l'écrit dans le fichier publickey
.
Il y a maintenant deux fichiers dans le répertoire (celui où la commande a été exécutée), un nommé privatekey
et l'autre publickey
Ensuite, créer un fichier nommé wg0.conf
dans le dossier /etc/wireguard/
Coller le texte suivant dans le fichier :
[Interface]
Address = 192.168.2.1
PrivateKey = Coller la clé privée (Contenu du fichier privatekey)
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # Commande exécutée à l'arrêt de WireGuard (ou de l'interface wg0)
[Peer]
# Nom du client
PublicKey = Laisser vide pour le moment, nous générerons une paire de clé privée/publique pour le client plus tard
AllowedIPs = 192.168.2.3/32 # Adresse local attribuée par le vpn au client qui se connecte avec cette clé publique
Explications de la composition du fichier de configuration serveur
(wg0.conf
)
Section [Interface]
Address : L'adresse IP local qu'aura votre serveur. Littéralement l'adresse IP de l'interface du VPN WireGuard
PrivateKey : Collez ici simplement le contenu du fichier privatekey, c'est la clé privée de votre serveur WireGuard, vos clients auront besoin de simplement connaître la clé publique de votre serveur (contenu du fichier publickey)
ListenPort : Port sur lequel le serveur écoutera les connexions entrantes. Si votre serveur est derrière votre box, il faut s'assurer que ce port est redirigé vers votre serveur. Configurable par l'interface de votre box internet. (Exemples pour accéder à l'interface de votre box : http://192.168.0.1 pour SFR, http://mafreebox.free.fr ou http://192.168.1.254 pour Free)
PostUp : Commande exécutée au démarrage de WireGuard (ou de l'interface wg0). Remplacez eth0 par le nom de votre interface ethernet ou wi-fi. (Commande ifconfig)
PostDown : Commande exécutée à l'arrêt de WireGuard (ou de l'interface wg0). Remplacez eth0 par le nom de votre interface ethernet ou wi-fi. (Commande ifconfig)
Section [Peer]
# Nom du client (Il y aura autant de catégorie [Peer] qu'il y a de client). Cette ligne est un commentaire pour s'y retrouver, elle n'est pas nécessaire (visible car précédé d'un #)
PublicKey : Coller la clé publique du client (Ce n'est pas le fichier publickey !). Laissez vide pour le moment, nous générerons une paire de clé privée/publique pour le client plus tard.
AllowedIPs : Adresse local attribuée par le vpn au client qui se connecte avec cette clé publique. Il est possible d'attribuer une IP allant de 192.168.2.2 jusqu'a 192.168.0.2.254
— Configuration de WireGuard pour le client
La syntaxe du fichier de configuration du client est la même quelque soit la plateforme (Windows, OSX, Linux, Android ou iOS). Vous pouvez donc très bien tester votre configuration sur votre ordinateur Windows, et si ça fonctionne, exporter la configuration et l'importer sur votre appareil iOS. (Transférer le fichier via iCloud par
exemple)
Il faut générer une paire de clé privée/publique pour chaque client. Chaque client doit être ajouté dans sa propre section [Peer] de la configuration du serveur (wg0.conf
).
Il est possible de générer la paire clé privée/publique directement depuis le client (depuis le client iOS), en cliquant sur un bouton, je conseil de générer directement la clé privée sur le client et d'inscrire la clé publique liée à cette clé privée dans la section [Peer] du serveur (wg0.conf
), mais il est aussi possible de générer la paire avec la commande que nous avons utilisé pour générer celle du serveur, l'algorithme est le même.
Le serveur n'aura besoin que de la clé publique de votre client. La clé privée du client reste sur l'appareil du client ! (et la clé publique du client n'est inscrite nul part dans la configuration du client, il la dérive tout seul à partir de la clé privée quand il se connecte au serveur).
Vous pouvez afficher la configuration en QR code sur le terminal grâce à qrencode
, une fois le fichier créé avec l'exemple ci-dessous la commande qrencode -t ansi256 < config-client-1.conf
(si ansi256 n'affiche pas correctement le qrcode, essayez ansiutf8, ou ansi)
Exemple de configuration sous forme de texte (l'application iOS ne propose qu'une interface, mais il est possible d'importer le fichier configuration par la suite)
[Interface]
PrivateKey = Clé privée du client
ListenPort = 21841
Address = 192.168.2.3/32
DNS = Mettre une IP (192.168.2.1 par exemple, si utilisez Pi-hole)
[Peer]
PublicKey = Coller la clé publique du serveur
AllowedIPs = 192.168.0.0/24, 192.168.2.0/24
Endpoint = IPPubliqueDeVotreBox:51820
Explications de la composition du fichier de configuration client
La configuration du client ressemble à celle du serveur. Ici la section [Interface] définit le client et [Peer] définit le serveur distant.
Section [Interface]
PrivateKey : (Contenu du fichier publickey que nous avons généré au tout début)
ListenPort : 21841
Address : C'est ici qu'il faut inscrire l'adresse IP Local qui sera attribuée par WireGuard, il faut que cela soit la même que celle qui est écrite dans le wg0.conf
pour cette clé publique. Oui, même si nous n'avons pas inscrit la clé publique ici, votre client l'envoie automatiquement au serveur WireGuard auquel il se connecte (Oui ! Car elle est générée (dérivée) à partir de la clé privée).
DNS : Ce champ est pour utiliser un serveur DNS spécifique, par exemple si vous utilisez Pi-hole. Sinon, supprimer le champ.
Section [Peer]
PublicKey : Coller le contenu du fichier publickey
que nous avons généré au tout début. Le client qui se connecte n'a besoin que de connaître la clé publique du serveur auquel il se connecte. (Et le serveur n'a que besoin de la clé publique du client !)
AllowedIPs : Définit les IPs autorisées à passer par le VPN. Pour que toutes les connexions passent par celui-ci, inscrivez simplement 0.0.0.0/0
, c'est ce qu'on appel un VPN Full-Tunnel (Un VPN 'Normal' en somme).
Mais il est aussi possible de n'autoriser que les requêtes qui vont vers certaines IP à passer par le VPN (dit Split-Tunnel) par exemple si vous souhaitez accéder aux périphériques de chez vous (NAS, Dossier partager par votre PC, Page de configuration de votre box) sans que vos requêtes internet 'normales' passent par le VPN. Pour ma box SFR, il me suffit d'autoriser les requêtes qui vont de 192.168.0.0 à 192.168.0.255, le préfixe varie selon les box, pour Free c'est de 192.168.1.0 à 192.168.1.255. Il faut alors inscrire 192.168.0.0/24
ou 192.168.1.0/24
. Si vous souhaitez par exemple pouvoir ping et accéder aux autres clients qui sont connectés sur le VPN en plus de votre réseau local, il faut inscrire 192.168.0.0/24, 192.168.2.0/24
. Pour comprendre le chiffre après le symbole " / " (slash), il faudra se renseigner sur la notation CIDR (voir l'annexe 1 en bas de page)
C'est aussi de cette manière qu'il est possible d'utiliser le Pi-hole (sans pour autant pomper toute la connexion de chez-vous), en autorisant seulement les requêtes vers l'IP de votre VPN à par votre VPN 192.168.2.1/32
et en définissant 192.168.2.1/32
comme IP dans la section DNS ci-dessus (Si Pi-hole est installé sur la même machine que WireGuard), ce qui fait que seul les requêtes DNS transiteront par le VPN, les pubs et trackers seront donc bien bloqués sans pour autant ralentir la connexion.
Endpoint : L'IP Publique de votre box, celle qui apparait en tapant 'mon ip' sur Google. Suivit du port du serveur que nous avions choisit (51820 dans notre cas). Il est conseillé d'utiliser un serveur de DNS Dynamique (No-ip, DynDNS...) si vous avez une IP Dynamique.
— Activer WireGuard
sudo wg-quick up wg0
démarre l'interface wg0 précédemment configurée.
sudo wg
permet de voir le status de WireGuard.
sudo systemctl enable wg-quick@wg0.service
permet d'activer WireGuard au démarrage du serveur.
Vous pouvez en suite activer le VPN sur le client, la connexion devrait se faire !
— Bonus
# 1 Accéder aux clients wireguard depuis un périphérique qui est sur le réseau local (mais qui n'est pas connecté au VPN !)
Les clients wireguard pourront ping sans problèmes des appareils sur votre réseau local, en revanche le contraire n'est pas possible et il faudra connecter obligatoirement l'appareil local au VPN pour ping/contacter les clients connectés au VPN.
Une des solution est d'ajouter la route à table de routage du routeur, malheureusement ma box SFR ne le permet pas, ma solution pour le moment est par exemple pour mon ordinateur WINDOWS 10 de taper la commande suivante dans un terminal avec accès administrateurs
route -p ADD 192.168.2.0 MASK 255.255.255.0 192.168.0.25
Cela fait passer les requêtes vers 192.168.2.0
à 192.168.2.255
vers la passerelle 192.168.0.25
qui est chez moi l'IP local de la Raspberry, le -p
signifie que la règle est persistante (même après un redémarrage de Windows).
Si vous ne pouvez pas ajouter la règle au routeur, l'opération sera à répéter pour tous les appareils.
Mais c'est quand moins casse tête de se contenter de connecter WireGuard pour l'appareil local d'avoir AllowedIPs tel que : AllowedIPs = 192.168.2.0/24, 192.168.0.25/32
# 2 Contourner le blocage de ports
Il peut arriver que le port par défaut soit bloqué (51820).
Il est possible d'utiliser le port des requêtes DNS (53) qui dans la grande majorité des cas n'est pas bloqué. Il suffit de changer le ListenPort dans le fichier wg0.conf
/!\ Ne semble pas compatible avec la box Orange qui utilise le port 53, que cela soit en UDP et TCP, je n'ai pas trouvé de workaround pour le moment.
Tutoriel réalisé à l'aide de celui-ci merci à /u/PanzerschreckGER
— Annexes
Annexe 1.
Tableau des notations CIDR