WireGuard est un logiciel open-source qui permet de mettre en place un VPN. Il vise à être plus rapide et plus léger que d’autre protocole VPN comme OpenVPN ou IPsec. WireGuard est toujours en cours de développement, et même dans son avancement actuel il est plus rapide que OpenVPN. Plus d’info sur le site de Wireguard: https://www.wireguard.com/performance/
WireGuard créé une interface réseau (comme wg0) qui a le même comportement que eth0.
Dans ce tuto nous allons voir comment installer le serveur WireGuard et configurer un client sous Android. La configuration de WireGuard est très simple et rapide.
La connexion au VPN s’effectue via un échange de clés publiques entre le serveur et le client.
Note: Ce tutot a été réalisé sur un rapsberry 3, avec la distribution Buster de Raspbian, et la version 4.19.118-v7+ du Kernel
Installer Wireguard sous Raspberry
Toutes les commandes suivantes sont à effectuer en sudo
Mettre à jour votre raspberry
apt-get update apt-get upgrade apt-get dist-upgrade
Actuellement Wireguard n’est pas inclus dans la distribution de Raspbian, il faut donc ajouter le dépôt backports
echo 'deb http://deb.debian.org/debian buster-backports main contrib non-free' > /etc/apt/sources.list.d/buster-backports.list
Installer les clés du précédent dépôt
gpg --keyserver keys.gnupg.net --recv 648ACFD622F3D138 gpg --keyserver keys.gnupg.net --recv 04EE7237B7D453EC gpg --export 04EE7237B7D453EC | apt-key add - gpg --export 648ACFD622F3D138 | apt-key add -
Si la commande gpg –keyserver ne fonctionne pas vous vous tester les commandes suivantes proposées par Oga en commentaire.
gpg –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 648ACFD622F3D138 gpg –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 04EE7237B7D453EC gpg --export 04EE7237B7D453EC | apt-key add - gpg --export 648ACFD622F3D138 | apt-key add -
Empêcher Debian d’utiliser ce dépôt pour vos paquets standards
sh -c 'printf "Package: *\nPin: release a=unstable\nPin-Priority: 90\n" > /etc/apt/preferences.d/limit-unstable'
Mettre à jour la liste des paquets
apt-get update
Installer les headers linux. ils sont nécessaires pour faire marcher wireguard. Pas d’inquiétude si l’execution se termine avec ce genre d’erreur (dkms: WARNING: Linux headers are missing, which may explain the above failures.
please install the linux-headers-4.19.118-v8+ package to fix this.)
apt-get install raspberrypi-kernel-headers
Installer Wireguard, Wireguard-dmks s’installera en même temps et va builder une version adaptée avec le kernel du rapsberry
apt-get install wireguard
Configurer le serveur WireGuard
Dans cette partie nous allons créer les clés serveurs et pour un client, et créer notre fichier de configuration.
Ce schéma résume la configuration que nous allons déployer.
Tout d’abord placer vous dans le dossier de Wireguard
cd /etc/wireguard/
Générer les clés serveurs (privée et publique)
wg genkey | tee server_private_key | wg pubkey > server_public_key
Générer les clés clients (privée et publique)
wg genkey | tee client_private_key | wg pubkey > client_public_key
Créer le fichier de configuration
vim wg0.conf
y insérer le contenu suivant:
[Interface] Address = 10.10.10.1/32 SaveConfig = true 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 ListenPort = 51900 PrivateKey = <mettre le contenu de la clé server private> [Peer] # client 1: Android de colas PublicKey = <mettre le contenu de la clé client publique> AllowedIPs = 10.10.10.2/32
La première partie Interface permet configurer le serveur:
- Adress : l’adresse IP du serveur VPN du réseau virtuel. Il ne s’agit pas de l’adresse IP de votre réseau privée, mais bien d’une nouvelle IP à définir vous même.
- ListenPort : le port du VPN, qui va écouter les connexions entrantes
- PostUp/PostDown : ligne de commandée lancé au démarrage et arrêt de wireguard. eth0 correspond à l’interface connecté à votre LAN
- SaveConfig: Indique que la configuration doit se mettre automatiquement à jour quand un nouveau client est ajouté en ligne de commande pendant que le service fonctionne.
- PrivateKey : clé privée du serveur
La deuxième partie Peer permet configurer un client. Si vous souhaitez connecter plusieurs client il faudra dupliquer cette partie en changeant les paramètres:
- AllowedIPs : correspond à l’adresse IP du client autorisé à se connecter au VPN
- si vous mettez un masque /32 comme dans l’exemple seul cet unique client peut se connecter au VPN
- si vous mettez la valeur suivante 10.10.10.0/24 alors vous autorisez plusieurs clients à se connecter au VPN. Tous ceux ayant une adresse IP comprise entre 10.10.10.2 et 10.10.10.254. Vous pouvez donc jouer sur la valeur du masque pour autoriser un certain nombre de client.
- Pour des questions de sécurité un client == une paire de clé, donc on va préférer utiliser un masque /32
- PublicKey : clé publique du client
Changer les droits au dossier de configuration pour le mettre en lecture/écrite qu’à root
chown -R root:root /etc/wireguard/ chmod -R og-rwx /etc/wireguard/* umask 077
Démarrer Wireguard, avec la commande suivante
wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.10.10.1/32 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] ip -4 route add 10.10.10.2/32 dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Vérifier le bon fonctionnement de Wireguard
wg show
Activer le service Wireguard pour qu’il démarre à chaque reboot du rapsberry
systemctl enable wg-quick@wg0
Note : Avant de mettre à jour votre fichier wg0.conf, n’oublier pas de stopper le service sinon vos modifications seront perdues.
Activer la redirection de port sur votre box
Sur votre routeur / box vous devez mettre en place la redirection de port pour rediriger le port entrant 51900 en UDP vers le port 51900 sur votre raspberry. Voici un exemple sur la freebox mini4k
Activer le port Forwarding sur le raspberry
Si une fois connecté au VPN vous souhaitez accéder à votre réseau privé, il faut donc activer le port forwarding.
Editer le fichier
/etc/sysctl.conf
et décommenter la ligne
net.ipv4.ip_forward=1
Redémmarer le serveur pour que la modification soit prise en compte
reboot
Configurer le client Wireguard sous Android
Sur votre smartphone télécharger et installer l’application android Wireguard.
Il y a deux facon de configurer le client, soit via la génération d’un qrcode sur le serveur, soit en remplissant tous les champs sous l’application Android. Cette deuxième méthode est un peu plus contraignante car il faut recopier les clés privées et publiques.
Via Qrcode
Sur votre raspberry, installer qrcode
apt-get install qrencode
Créer un fichier, client.conf, qui contient la conf de votre client
[Interface] Address = 10.10.10.2/32 PrivateKey = <clé privée du client> DNS = 8.8.8.8 [Peer] PublicKey = <clé publique du serveur> AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = wireguard.tutoanco.colas-delmas.fr:51900
Dans la Partie Interface nous retrouvons les informations suivantes:
- PrivateKey: clé privée du client
- Adresses: Adresse IP du client, qui est définie dans la partie Peer sur le serveur
- DNS Serveur: DNS de Google
Dans la Partie Peer nous retrouvons les informations suivantes:
- PublicKey: Clé publique du serveur
- Endpoint:
- Renseigner un nom de domaine suivie du port qui permet de joindre votre serveur.
- Sinon si vous avec une adresse IP publique fixe, vous pouvez la renseigner suivie du numéro de port. Voir cet article pour Obtenir son adresse IP publique en ligne de commande.
- Si vous avez une adresse IP dynamique, il vous faut utiliser un service comme no-ip, DuckDNS, etc.
- Allowed IPs: ce champs permet de définir quel trafic doit passer par le VPN. si vous renseignez 0.0.0.0/0, ::/0 tout le trafic passera par le VPN.
Si vous souhaitez que seul le trafic vers votre LAN privée passe par le VPN il faudra mettre: 10.10.10.0/24, 192.168.0.0/24 (où cette adresse correspond à votre LAN). Cette configuration ne fonctionne pas chez moi, car le reste du trafic (accès à google par exemple ne fonctionne pas).
En d’autre terme, quand le client tente d’envoyer à un paquet à une IP, il regarde les AllowedsIPs et si l’IP apparaît dans la liste alors le paquet sera envoyé à travers le VPN. Même principe quand il reçoit un paquet.
Générer le qrcode que vous scannerez
qrencode -t ansiutf8 -r client.conf
Manuellement
Sur l’application faite ajouter un VPN en cliquant sur l’icone , puis cliquer sur « Create from Scratch« .
Puis configurer votre connexion comme expliqué ci dessus et détaillé sur le screenshot.
Tester votre connexion
Depuis votre smartphone, il faut suffit d’afficher votre adresse IP publique via le site Mon ip.
Cette adresse IP doit être la même que celle obtenue sur votre raspbery en suivant ce guide: Obtenir son adresse IP publique en ligne de commande