SĂ©curiser votre navigation avec WireGuard VPN 🌐

SĂ©curiser votre navigation avec WireGuard VPN 🌐

WireGuard est un protocole VPN moderne et lĂ©ger, il offre une alternative efficace et sĂ©curisĂ©e pour Ă©tablir des connexions privĂ©es sur Internet. Etant conçu pour ĂȘtre plus rapide et plus performant que d'autres protocoles VPN tels que OpenVPN et IPsec, il gagne rapidement en popularitĂ© dans le domaine des rĂ©seaux privĂ©s virtuels.

Dans notre article nous allons monter un serveur VPN WireGuard sur un serveur Debian 12 (Bookworm) afin de naviguer de façon sécurisé sur Internet depuis notre iPhone/Windows/Linux.


Prérequis:

  • Un serveur avec une IP publique
  • Un accĂšs root / sudoer Ă  celui-ci

Installation et configuration de WireGuard

gael@lab-vpn:~$ sudo apt-get update && sudo apt-get install -y wireguard

Il va falloir générer les clé privée et publique qui vont permettre de chiffrer nos connexions et de nous authentifier.

# Génération de la clé privée dans le répertoire de configuration
gael@lab-vpn:~$ wg genkey | sudo tee /etc/wireguard/server_private.key
<Votre clé privée>

# Changement des permissions afin de les limiter seulement au propriétaire
gael@lab-vpn:~$ sudo chmod go= /etc/wireguard/server_private.key

# Génération de la clé publique à partir de la clé privée
gael@lab-vpn:~$ sudo cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
<Votre clé publique>

La clĂ© publique du serveur devra ĂȘtre sur tous les profiles clients. Quand aux clĂ©s publique de chaque client, ils devront faire parti de la configuration du serveur.

Maintenant, nous allons créer notre fichier de configuration qui va se servir des éléments généré dans l'étape précédente.
Il faut créer un fichier /etc/wireguard/wg0.conf, wg0 sera le nom de notre interface virtuelle WireGuard.
Ce fichier va contenir les informations serveurs et les informations clients. Dans un premier temps nous renseignons les informations serveur.

[Interface]
# Adresse IP du serveur à l'intérieur du VPN
Address = 192.168.100.254/24
# Clé privée du serveur
PrivateKey = <Votre clé privée>
# Port sur lequel le serveur Ă©coute
ListenPort = 51820

Avant de pouvoir lancer le service, il va falloir crĂ©er notre premier client 1ïžâƒŁ

Génération des clés client

Tout comme le serveur, nous allons devoir gĂ©nĂ©rer une pair de clĂ© privĂ©e / publique pour notre client. La methode sera exactement la mĂȘme, seul le rĂ©pertoire de destination va changer.

# Création d'un dossier pour générer les configurations clients
gael@lab-vpn:~$ mkdir -p ~/wg_client/ && cd ~/wg_client/
# Génération de la clé privée
gael@lab-vpn:~$ wg genkey | tee iphone_private.key
<Clé privée Iphone>
# Génération de la clé publique
gael@lab-vpn:~$ cat iphone_private.key | wg pubkey | tee iphone_public.key
<Clé publique Iphone>

On peut également rajouter une couche de sécurité en générant une clé partagée (PSK). Celle-ci sera connue uniquement du client et du serveur.

# Toujours dans notre dossier /home/gael/wg_client/
gael@lab-vpn:~$ wg genpsk | tee iphone_psk.key
<Clé psk Iphone>

Maintenant que nous avons généré toutes les clés nécessaires, il va falloir déclarer notre client dans notre configuration serveur. Pour cela il va falloir ajouter une section [Peer] dans le fichier de configuration que nous avons créé précédemment (/etc/wireguard/wg0.conf)

[Interface]
# Adresse IP du serveur à l'intérieur du VPN
Address = 192.168.100.254/24
# Clé privée du serveur
PrivateKey = <Votre clé privée>
# Port sur lequel le serveur Ă©coute
ListenPort = 51820

# Iphone
[Peer]
# Clé publique du client Iphone
PublicKey = <Clé publique Iphone>
# PSK du client Iphone
PresharedKey = <Clé psk Iphone>
# Permet de dire au serveur quelles IP il y a derriĂšre le VPN (dans notre cas on veut seulement 1 clients et non un vpn site a site)
AllowedIPs = 192.168.100.100/32

Maintenant que notre fichier de configuration est complet, on va pouvoir activer et lancer notre service WireGuard.

# Cette commande permet de créer l'interface wg0 sur notre serveur
gael@lab-vpn:~$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.100.254/24 dev wg0
[#] ip link set mtu 1420 up dev wg0

# On peut voir l'Ă©tat du serveur
gael@lab-vpn:~$ sudo wg show
interface: wg0
  public key: <Votre clé publique>
  private key: (hidden)
  listening port: 51820

peer: <PeerID>
  preshared key: (hidden)
  allowed ips: 192.168.100.100/32

Si l'on veut rendre persistant et automatique le lancement du service, on peut l'activer et le gérer via systemd.

# On l'active pour qu'il se lance au démarrage
gael@lab-vpn:~$ sudo systemctl enable wg-quick@wg0

# On peut Ă©galemement le reload (relancer sans interruption) si on souhaite ajouter un nouveau client (Peer)
gael@lab-vpn:~$ sudo systemctl reload wg-quick@wg0

Création du fichier de configuration client

Dans cette partie, nous allons générer le fichier de configuration de notre notre client VPN (Iphone). Tout comme le fichier de configuration serveur, il aura 2 sections, la premiÚre [Interface] afin de configurer l'aspect réseau et la seconde [Peer] afin de s'authentifier sur le serveur WireGuard.

Le fichier de configuration client doit ressembler à ça. (/home/gael/wgclient/iphone.conf)

[Interface]
# La clé privée de votre client Iphone
PrivateKey = <Clé privée Iphone>
# L'adresse IP de votre client
Address = 192.168.100.100/24
# Le DNS a utilisé (Vous pouvez en mettre un privé)
DNS = 1.1.1.1

[Peer]
PublicKey = <Serveur Clé publique>
PresharedKey = <Client Iphone PSK>
# En définissant 0.0.0.0/0 on dit que tout notre traffic passe par le VPN
AllowedIPs = 0.0.0.0/0 
Endpoint = <Votre IP Publique>:51820
# Permet de garder la connexion active lorsque l'on est derriĂšre du NAT (C'est le cas pour toute les BOX)
# https://www.wireguard.com/quickstart/#nat-and-firewall-traversal-persistence
PersistentKeepalive = 25

Maintenant il faut l'importer sur votre client... Pour cela il y a plusieur solution:

  1. Envoyer le fichier de configuration par mail ou autre sur votre client.
  2. Copier manuellement la configuration sur votre client.
  3. GĂ©nĂ©rer un QRCode et le scanner sur votre client đŸ“·.

Dans le cas de notre client Iphone, avec l'application WireGuard (https://apps.apple.com/fr/app/wireguard/id1441195209), nous avons la possibilité de scanner un QR code.
Pour générer le QR code, il suffit d'utiliser une commande qrencode.

# On télécharge le package.
gael@lab-vpn:~$ sudo apt install qrencode
# On génÚre notre qrcode en png
gael@lab-vpn:~$ qrencode -t png -o /home/gael/wgclient/iphone.png -r /home/gael/wgclient/iphone.conf

# On le télécharge sur une machine avec une UI afin de pouvoir le lire 
gael@workstation ~ % scp <MonServeurVPN>:/home/gael/wgclient/iphone.png .

Il suffit d'ouvrir le fichier PNG avec le QRcode et le lire depuis l'Iphone via l'application WireGuard pour avoir notre configuration d'importé.
On se connecte avec l'application mobile et on vérifi sur le serveur si le client est bien présent

gael@lab-vpn:~$ sudo wg show
interface: wg0
  public key: <Clé publique Iphone>
  private key: (hidden)
  listening port: 51820

peer: 9OLC3eAJMz+YK1/H3fI1Hd5TM63fLIaV8AtnphQiCFw=
  preshared key: (hidden)
  endpoint: <Client Public IP>:30874
  allowed ips: 192.168.100.100/32
  latest handshake: 1 minute, 7 seconds ago
  transfer: 1.24 MiB received, 10.00 MiB sent

Notre client est bien prĂ©sent ! đŸ•ș Mais ... nous n'avons pas accĂšs a Internet depuis celui-ci car nous n'avons pas configurĂ© le serveur afin de donner l'accĂšs. Nous allons faire ça dans l'Ă©tape suivante âŹ‡ïž

Configuration du NAT

Le Nat et l'IP forward, permet de configurer notre serveur comme un Routeur/une BOX. Le NAT permet à plusieurs appareils d'un réseau local (nos clients VPN) de partager une seule adresse IP publique (l'IP publique de notre serveur), facilitant ainsi leur accÚs à Internet et renforçant la sécurité en masquant les adresses internes.

Par défaut, les serveurs Linux n'ont pas la fonction routage d'activé (Ni le NAT). Pour cela on va devoir l'activer:

# On active la fonction d'Ip forward pour l'IPv4 de façon persistante.
gael@lab-vpn:~$ echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/50-ipv4-forward.conf
net.ipv4.ip_forward = 1
# On l'applique sur la configuration courante
gael@lab-vpn:~$ sudo sysctl -p /etc/sysctl.d/50-ipv4-forward.conf
net.ipv4.ip_forward = 1
# On peut vérifier la valeur courante 
gael@lab-vpn:~$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Maintenant que le transfert de paquet entre interface est activé, on va devoir construire notre NAT. Pour cela nous allons utiliser Iptables, c'est un outil puissant permettant de contrÎler et sécuriser les flux de données sur un systÚme Linux en spécifiant des rÚgles de pare-feu.

# On met la polique par défaut de refuser les packets que l'on doit forward
gael@lab-vpn:~$ sudo iptables -P FORWARD DROP

# On créé une rÚgle Nat autorisant notre réseau WireGuard (192.168.100.0/24) a utiliser notre IP publique sur notre interface ens2
gael@lab-vpn:~$ sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens2 -j MASQUERADE

# On autorise les nouvelles connexions initialisé par notre interface wg vers ens2 (internet via l'ip publique)
gael@lab-vpn:~$ sudo iptables -A FORWARD -i wg0 -o ens2 -s 192.168.100.0/24 -m conntrack --ctstate NEW -j ACCEPT

# On autorise les réponses
gael@lab-vpn:~$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Attention !
Les rÚgles Iptables sont chargées en mémoire, si l'on restart le serveur elles sont perdu. Pour les rendre persistante, il faut installer un packet et les sauvegarder dans un fichier.

# On installe le packet
gael@lab-vpn:~$ sudo apt-get install iptables-persistent

# On sauvegarde les rÚgles en cours dans un fichier qui est lu au démarrage.
gael@lab-vpn:~$ sudo iptables-save | sudo tee /etc/iptables/rules.v4

Vous devriez avoir maintenant accĂšs Ă  Internet depuis votre client iPhone đŸ“±.

Pour vérifier que votre IP de sorti est bien celle de votre serveur, vous pouvez utiliser un site comme https://ipinfo.io/what-is-my-ip

A gauche l'IP publique de notre FAI comme nous somme en Wifi. A droite, l'IP publique de notre serveur.

Maintenant, votre connexion est chiffrĂ© entre votre client et votre serveur. C'est votre serveur qui fera les requĂȘtes pour vous. Donc si vous avez un serveur en Pologne, l'IP de sortie sera en Pologne, c'est une mĂ©thode qui est utilisĂ© pour by-passer des restrictions d'accĂšs en fonction de l'IP source.

L'avantage de cela, c'est que ça vous permet d'avoir une connexion sĂ©curisĂ©e lorsque vous ĂȘtes sur un points d'accĂšs non sĂ»re (Wifi publique dans les restaurants, aĂ©roport, rue...). Chez vous si vous avez un abonnement internet cela ne change pas grands chose Ă  part que votre FAI ne voit pas vos requĂȘte, mais votre hĂ©bergeur si. A voir en qui vous avez le plus confiance...

Dans le monde du travail, le VPN permet au client (PC/Téléphone) d'accéder au réseau de l'entreprise de maniÚre sécurisé. Pas de router votre traffic internet.