Blog & Astuces

Configurer son VPN personnel avec Wireguard

Configurer son VPN personnel avec Wireguard

Tuto

Dans ce tutoriel, je vais présenter comment faire pour mettre en place son propre serveur VPN pour accéder à son réseau local à distance. Il peut également être utilisé lorsqu'on se connecte depuis un réseau non sécurisé (type réseau Wi-Fi public) afin de se protéger.

Pour cela nous allons utiliser Wireguard, un protocle sûr et rapide. L'avantage de Wireguard comparé à OpenVPN est sa vitesse et sa facilité de configuration. Contrairement à OpenVPN, il n'y a pas besoin de s'embêter à gérer des certificats par exemple. J'écrirais peut-être cependant un autre tutoriel pour OpenVPN plus tard, que j'utilise personnellement comme VPN secondaire.

J'utilise personnellement ce VPN afin d'accéder à l'interface SSH de mon serveur à distance sans avoir à exposer le port SSH sur Internet, ce qui apporte une sécurité supplémentaire. Il faut juste exposer le port du VPN.

Pré-requis

Pour suivre ce tutoriel, vous devrez avoir un serveur ou un ordinateur qui tourne sous Linux chez vous. Il est aussi possible de mettre en place ce VPN sur un VPS par exemple. Il est à priori possible aussi de mettre en place un serveur Wireguard sur un PC Windows, mais ce tutoriel se basera uniquement sur une installation sous Linux.

Ce tutoriel a été testé sur un serveur qui tourne sous Ubuntu.

Installation de Wireguard

Le paquet est proposé officiellement par toutes les distributions majeures.

Sous Ubuntu ou Debian, lancer cette commande suffit à installer Wireguard :

sudo apt install wireguard

Pour les autres distributions se reporter à cette documentation : https://www.wireguard.com/install/

Il ne reste plus qu'à configurer le VPN !

 Configuration de base de Wireguard

Les fichiers de configuration se trouvent dans le dossier /etc/wireguard. La première chose à faire est de générer une paire de clés publiques/privés. Pour se faire, lancez la commande suivante :

Passer en root puis accéder au dossier /etc/wireguard qui est par défaut accessible qu'à un utilisateur root :

su
cd /etc/wireguard/

Générer ensuite la clé privée :

wg genkey > privatekey

Puis dériver la clé publique à partir de la clé privée. Nous utiliserons cette clé publique pour se connecter au VPN depuis un appareil extérieur :

wg pubkey < privatekey > publickey

Ouvrir ou créer le fichier wg0.conf dans le dossier /etc/wireguard/ :

sudo nano /etc/wireguard/wg0.conf

Configurer le fichier comme suit :

[Interface]
Address = 192.168.54.1/24
Address = fda4:f69:cc89::1/64
SaveConfig = false
PostUp = ufw route allow in on wg0 out on eno1
PostUp = iptables -t nat -I POSTROUTING -o eno1 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eno1 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eno1
PreDown = iptables -t nat -D POSTROUTING -o eno1 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eno1 -j MASQUERADE
ListenPort = 51820
PrivateKey = INSERER_LA_PRIVETE_KEY_ICI
MTU = 1420

Je vais expliquer en quoi consistent les différentes valeurs :

  • Adress : il s'agit de l'IP interne au serveur. C'est une adresse IP virtuelle locale qui sera exposée aux appareils qui se connectent au VPN. Vous pouvez laissez celles que j'ai définies ou en définir une autre. Veillez à ce que ce soient des adresses uniques par rapport au réseau local pour éviter les conflits
  • SaveConfig : évite que la configuration soit écrasée
  • PostUp et PreDown : des commandes qui seront exécutées respectivement quand le service du VPN sera démarré ou éteint. Elles permettent d'ajouter des règles de routage dans le pare-feu iptables afin de relayer le trafic vers l'extérieur du VPN (donc vers le réseau local, et Internet). Modifier la valuer de eno1 pour indiquer l'interface réseau du serveur (ethernet ou Wi-FI)
  • ListenPort : port d'écoute du VPN
  • PrivateKey : collez ici la clé privée que nous avons généré juste avant
  • MTU : taille maximum d'un paquet avant fragmentation. 1420 étant la valeur par défaut.

Une fois OK activez et démarrez le service du VPN :

sudo wg-quick up wg0
sudo systemctl enable [email protected]
sudo systemctl start [email protected]

Exposition du port du VPN sur le routeur

Autorisez dans le pare-feu du serveur le port d'entrée du VPN (ici 51820) par exemple. Pour UFW vous pouvez lancer :

sudo ufw allow 51820/udp
sudo ufw reload

Ensuite, autorisez via le pare-feu de votre routeur le port 51820/udp en entrée. Avec le NAT, pointez ensuite vers le port 58120 de votre serveur en entrée.

Bien sûr, vous pouvez changer le numéro de port et mettre n'importe lequel, tant qu'il correspond à celui paramétré dans la configuration de Wireguard (ListenPort).

Ajout d'un appareil

Pour ajouter un nouvel appareil (par exemple un smartphone Android ou un ordinateur portable), il faut générer une paire de clés publiques/privés pour chaque appareil.

Vous pouvez faire cela comme suit :

Générer une nouvelle clé privée :

wg genkey > privatekey.1

Dérivez une clé publique à partir de cette clé privée :

wg pubkey < privatekey.1 > publickey.1

Pour améliorer la sécurité de la connexion, je vous conseille de générer une clé pré-partagée :

wg genpsk

Notez la clé pré-partagée qui est générée quelque part.

Dans le fichier de configuration /etc/wireguard/wg0.conf, ajoutez la configuration suivante à la fin :

[Peer]
PublicKey = INSERER_ICI_LA_CLE_PUBLIQUE
PresharedKey = INSERER_ICI_LA_CLE_PRE_PARTAGEE
AllowedIPs = 192.168.54.2/32, fda4:f69:cc89::2/128

Insérez la clé publique ici, ainsi que la clé pré-partagée que nous avons générée. La valeur de AllowedIPs correspond à l'adresse IP virtuelle locale que pourra prendre l'appareil.

Ensuite, redémarrez le service de Wireguard :

sudo systemctl restart [email protected]

Nous allons ensuite générer la configuration Wireguard à importer sur l'appareil client.

Créez un fichier de configuration textuel quelque part, puis entrez les valeurs suivantes :

[Interface]
Address = 192.168.54.2/32, fda4:f69:cc89::2/128
DNS = ENTREZ_ICI_ADRESSE_DNS_FACULTATIF
PrivateKey = ENTREZ_ICI_LA_CLE_PRIVEE

[Peer]
AllowedIps = 0.0.0.0/0, ::/0
Endpoint = ADRESSE_IP_DU_SERVEUR_VPN:PORT_DU_SERVEUR_DNS
PreSharedKey = INSERER_ICI_LA_CLE_PRE_PARTAGEE
PublicKey = INSERER_ICI_LA_CLE_PUBLIQUE_DU_SERVEUR

Modifiez les valeurs comme suit :

  • Adress : Entrez les adresses IPs publiques de l'appreil. Les mêmes qui ont été définies juste avant
  • DNS : Entrez l'adresse IP du DNS. Par exemple l'adresse IP du serveur si vous exposez un service DNS, sinon une autre IP. Facultatif
  • PrivateKey : Entrez ici la clé privée générée juste avant
  • AllowedIps : Entrez ici les adresses IPs vers lesquelles l'appareil pourra se connecter. Ici la valeur entrée permettra à l'appareil de se connecter à toute IP, donc vers Internet
  • Endpoint : Adresse IP publique du serveur sur Internet, ou nom de domaine, suivi du port
  • PreSharedKey : La clé pré-partagée que nous avons généré juste avant. Facultatif mais fortement recommandé pour améliorer la sécurité de la connexion
  • PublicKey : La clé publique du serveur

Importez ce fichier de configuration dans l'application Wireguard (sur Android ou Windows par exemple). Si vous avez suivi le tutoriel à la lettre, vous devriez réussir à vous connecter à votre serveur en VPN.

Si vous souhaitez vous connecter depuis un appareil Linux, installez Wireguard de la même manière que la première partie du tutoriel, puis importez le fichier de configuration que nous avons écrit à l'emplacement /etc/wireguard/wg0.conf. Puis lancez la commande suivante :

sudo wg-quick up wg0

Commentaires