Installation d’un VPN WireGuard avec IPtables

WireGuard est un VPN très léger et simple à configurer, il fonctionne sur un système P2P. Il est disponible sur de nombreux supports comme Windows ou Android et d’une stabilité incroyable ! Dans ce tuto, on va installer et configurer WireGuard et IPtables pour que le serveur NAT tous le flux venant du client.

Image représentant un schéma d'une architecture wireguard

On commence par installer les paquets requis, WireGuard pour le VPN, IPtables pour filtrer et surtout nater le flux et IPtables-persistent pour que la configuration IPtables soient persistante après un redémarrage du système

root@CT-WIREGUARD:~# apt-get install wireguard iptables iptables-persistent 

Nous allons créer le répertoire /opt/wireguard-keys afin d’y stocker les clés

root@CT-WIREGUARD:~# mkdir /opt/wireguard-keys

Rendez-vous dans le répertoire que nous venons de créer

root@CT-WIREGUARD:~# cd /opt/wireguard-keys

Puis on génère la clé privée et la publique

root@CT-WIREGUARD:~# wg genkey | tee privatekey | wg pubkey > publickey

Afin de protéger nos clés, on modifie les droits du dossier et son contenu

root@CT-WIREGUARD:~# chmod -R 600 /opt/wireguard-keys

On affiche les clés que nous venons de générer, la clé privé sera utilisée dans la configuration de notre serveur WireGuard et la publique servira lors de la configuration du client

root@CT-WIREGUARD:~# cat privatekey
root@CT-WIREGUARD:~# cat publickey

Afin de configurer WireGard, nous allons créer et modifier le fichier wg0.conf

root@CT-WIREGUARD:~# nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.10.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = clé_privée_générée_sur_le_serveur 

[Peer]
PublicKey = clé_publique_générée_sur_le_client
AllowedIPs = 10.10.10.0/24

Explication :

  1. Address
    Il s’agit de l’adresse IP de l’interface du VPN côté serveur
  2. SaveConfig
    Indique que la configuration de l’interface doit être sauvegardée
  3. ListenPort
    Permet de définir le port réseau du service WireGuard
  4. PrivateKey
    Doit avoir pour valeur la clé privée qui a été générée sur le serveur
  5. PublicKey
    Doit avoir pour valeur la clé publique qui a été générée sur le client (Nous reviendrons modifier cette valeur plus tard dans le tuto après avoir généré cette clé)
  6. AllowedIPs
    Défini les adresses IP qui seront routées à travers le tunnel VPN vers le client

Maintenant que l’interface est configurée on va l’activer au démarrage du poste. A ce stade là, il n’y a pas d’intérêt à la démarrer maintenant car nous reviendrons dessus pour configurer la clé publique du client

root@CT-WIREGUARD:~# systemctl enable wg-quick@wg0

Nous configurons maintenant IPtables.

Pour ne pas s’embrouiller avec les commandes, on va simplement modifier le fichier de persistance rules.v4 car nous redémarrerons le serveur plus tard pour confirmer que le VPN monte bien et que tout est fonctionnel après un reboot. Attention, ici ens18 est le nom de mon interface réseau. Pensez bien à remplacer le nom de cette interface par la votre.

root@CT-WIREGUARD:~# nano /etc/iptables/rules.v4
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i wg0 -j ACCEPT
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens18 -j MASQUERADE
-A POSTROUTING -s 10.10.10.0/24 -o ens18 -j MASQUERADE
COMMIT

Il s’agit là d’une configuration basique de IPtables, libre à vous de la peaufiner pour rendre tout ça plus sécurisé.

Etant donné que notre serveur WireGuard va effectuer du routage, on active la fonction forward en décommentant la ligne correspondante et en s’assurant que la valeur est bien égale à 1

root@CT-WIREGUARD:~# nano /etc/sysctl.conf
net.ipv4.ip_forward=1

Nous reviendrons sur le serveur après la configuration du client.

Dans cet exemple j’utilise un client Windows, mais ça fonctionne très bien en mobile ou sous linux, les configurations sont identiques

Après avoir installé et lancé de client WireGuard, il faut cliquer sur la petite flèche à côté de « Ajouter le tunnel » située en bas à gauche

Image de configuration wireguard

Vous constaterez que lorsque la fenêtre d’ajout du tunnel s’ouvre, une clé publique et privée sont générées automatiquement

Image d'une configuration wireguard vierge

On va modifie tout ça par :

[Interface]
PrivateKey = mK9FTWiSqWnoTM5OsLUuyfQWHdVTdQ7AiFZ53a/hS2o=
Address = 10.10.10.5/24

[Peer]
PublicKey = clé_publique_générée_sur_le_serveur 
AllowedIPs = 10.10.10.0/24, 192.168.1.0/24, 172.16.1.0/24
Endpoint = IP-PUBLIQUE:51820
Image d'une configuration wireguard complète

Explication :

  1. PrivateKey Doit avoir pour valeur la clé privée qui a été générée par le client ( se fait automatiquement)
  2. Address Il s’agit de l’adresse IP de l’interface du VPN côté client
  3. PublicKeys Doit avoir pour valeur la clé publique qui a été générée sur le serveur
  4. AllowedIPs Défini les adresses IP qui seront routées à travers le tunnel VPN vers le serveur. J’ai mis plusieurs adresses pour bien comprendre qu’il est possible de contacter plusieurs réseaux via ce tunnel
  5. Endpoint Défini l’adresse à laquelle le client doit s’accrocher lorsqu’il démarre et le port configuré sur le serveur précédemment

On constate qu’il y’a un champ grisé « Clé publique », celle-ci a été générée automatiquement lors de l’ouverture de la fenêtre de création du tunnel. Il faut copier cette clé sur le serveur

root@CT-WIREGUARD:~# nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.10.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = clé_privée_générée_sur_le_serveur 

[Peer]
PublicKey = clé_publique_générée_sur_le_client
AllowedIPs = 10.10.10.0/24

Reste plus qu’à redémarrer le serveur et tout est fonctionnel

root@CT-WIREGUARD:~# reboot

0 Commentaires

Ecrire un commentaire

XHTML: Vous pouvez utiliser les balises : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Connexion