Configurer un serveur VPN sur Raspberry Pi

Jinku Hu 14 avril 2022
Configurer un serveur VPN sur Raspberry Pi

Cet article présente la configuration d’un serveur VPN sur les appareils Raspberry Pi.

Configurer le package VPN WireGuard sur le système d’exploitation Raspberry Pi

Généralement, il existe de nombreux protocoles et implémentations différents pour le serveur VPN, mais cet article a choisi le logiciel WireGuard comme option contemporaine dominante.

Le package logiciel est généralement disponible sur les référentiels par défaut et vous devriez pouvoir l’installer à l’aide de la commande suivante :

sudo apt install wireguard

Une fois le package wireguard installé, plusieurs outils de ligne de commande seront disponibles sur votre système Raspberry Pi pour manipuler la configuration et les interfaces de WireGuard.

WireGuard ajoute généralement une nouvelle interface réseau virtuelle au système. WireGuard implémente un concept de CryptoKey Routing, noté en associant des clés publiques/privées à chaque pair.

À savoir, les pairs ne sont que des acteurs du tunnel VPN, chacun identifié par des clés publiques uniques. Nous devons donc générer ces clés et les inclure dans les fichiers de configuration correspondants.

Étant donné que les fichiers de configuration et les clés privées doivent être considérés comme des informations sensibles, nous invoquons la commande umask 0700 avant de générer les clés et de les stocker dans le répertoire /etc/wireguard.

Par conséquent, seuls les propriétaires de ces fichiers peuvent lire/écrire le contenu ultérieurement.

umask 0700; wg genkey | sudo tee /etc/wireguard/private.key

Exemple de sortie :

2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=

La commande précédente stockera la clé dans le fichier private.key et l’imprimera pour la copier facilement.

Ensuite, nous allons créer un fichier de configuration nommé wg0.conf dans le même répertoire /etc/wireguard et y inclure le contenu suivant :

[Interface]
PrivateKey = 2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=
Address = 10.10.10.1/24
ListenPort = 51820

Notez que ce fichier de configuration est pour le pair Raspberry Pi, et vous pouvez renommer la partie wg0 comme vous le souhaitez.

Vous devez copier remplacer la valeur PrivateKey par la clé générée avec la commande précédente. Vous pouvez également spécifier un port qui acceptera les connexions entrantes et l’adresse du pair.

Nous pouvons maintenant passer à l’autre pair (Peer A), qui devrait se connecter au Raspberry Pi. À ce stade, nous supposons que l’autre machine est basée sur Linux et que vous y avez installé le package WireGuard en conséquence.

La configuration Peer A suivra les mêmes étapes pour réutiliser la commande pour générer la clé publique et l’exécuter. Notez que les clés peuvent être générées sur une machine, mais comme les clés privées sont censées être secrètes, nous les développons sur les machines homologues correspondantes.

Une fois la clé privée générée, créez un fichier de configuration (par exemple wg0.conf) dans le répertoire /etc/wireguard et insérez les lignes suivantes :

[Interface]
PrivateKey = 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
Address = 10.10.10.2/32

Notez que la valeur PrivateKey ici est arbitraire, et vous devez la remplacer par la valeur valide. Dans le même temps, l’adresse IP peut être modifiée si vous avez des besoins de configuration réseau spécifiques.

Après cela, nous devons générer des clés publiques et les stocker dans leurs fichiers de configuration. Les clés publiques sont dérivées des clés privées et, dans notre cas, devront être générées sur les deux appareils.

Utilisez la commande suivante pour générer une clé publique sur Raspberry Pi et la seconde sur l’autre machine :

sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Maintenant, insérons la section peer dans le fichier de configuration. Les lignes suivantes doivent être ajoutées au fichier Raspberry Pi /etc/wireguard/wg0.conf :

[Peer]
PublicKey = PRIVATE_KEY_OF_PEER_A
AllowedIPs = 10.10.10.2/32

Notez que la valeur AllowedIPs est la même que l’adresse IP spécifiée dans la valeur Adresse du fichier de configuration Peer A.

De plus, remplacez PRIVATE_KEY_OF_PEER_A par la clé privée générée sur le Peer A. D’autre part, ajoutez les lignes suivantes au fichier wg0.conf sur la machine du Peer A.

Assurez-vous de remplacer la valeur de la clé privée par celle correspondante et l’adresse Endpoint par l’adresse de l’appareil Raspberry Pi. N’oubliez pas que la configuration suivante rendra la connexion VPN unilatérale, car seul le pair A accédera au réseau Raspberry Pi.

[Peer]
PublicKey = PRIVATE_KEY_OF_RASPBERRY
AllowedIPs = 0.0.0.0/0
Endpoint = 172.16.0.134:51820

Enfin, vous devez démarrer le service correspondant côté Raspberry Pi à l’aide de la commande :

sudo systemctl enable wg-quick@wg0.service

Alors que le pair A utilisera la commande suivante chaque fois qu’il voudra créer une interface de tunnel et s’y connecter :

sudo wg-quick up wg0

Vous pouvez supprimer l’interface et mettre fin à la connexion existante du pair A avec la commande :

sudo wg-quick down wg0

Comment acheminer tout le trafic Peer A via Raspberry Pi

À ce stade, le pair A ne pourra pas accéder à Internet, mais uniquement au réseau Raspberry Pi. Nous devons ajouter des paramètres supplémentaires aux fichiers de configuration pour que cela se produise.

Commençons par le fichier Peer A wg0.conf et ajoutons la ligne suivante dans la section [Interface] :

DNS = DNS_ADDRESS_USED_BY_RASPBERRY

Cette valeur d’adresse DNS dépend de la configuration du réseau, vous devez donc récupérer celle actuellement active et la mettre à jour si, pour une raison quelconque, elle est modifiée à l’avenir.

D’autre part, vous devez ajouter ces lignes supplémentaires au fichier wg0.conf du Raspberry Pi :

PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Notez que le nom wg0 devra être modifié dans ces lignes si vous créez un nom de fichier différent pour les fichiers de configuration.

Une fois que vous avez enregistré les modifications wg0.conf, ouvrez le fichier /etc/sysctl.conf et décommentez/modifiez les lignes :

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Habituellement, net.ipv6.conf.all.forwarding n’est requis que si vous incluez également des adresses IPv6 dans les fichiers de configuration. Après cela, vous devez exécuter la commande suivante pour que les modifications prennent effet :

sudo sysctl -p

Maintenant, vous devez vous connecter et transférer tout votre trafic Internet de Peer A via Raspberry Pi. Cependant, si vous exécutez un pare-feu sur le Raspberry Pi, assurez-vous de configurer les règles correspondantes pour le pair A, sinon il ne pourra pas du tout accéder au réseau.

Vous pouvez voir notre introduction au pare-feu ufw ici.

Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - Raspberry Pi