Wireguard

Wireguard est un VPN très pratique à mettre en place tout en restant sécurisé puisqu’il n’accepte que les dernières méthodes de chiffrement existantes. De plus, il fonctionne même si l’IP de votre appareil change (passage d’une connexion filaire à un réseau sans-fil par exemple). Il permet un accès tant en IPv4 qu’IPv6, ce qui donne accès à une IP fixe en IPv6 si votre FAI n’en donne pas. Il est tellement intéressant qu’il est présent de base à partir d’OpenBSD 6.8. Avec les version précédentes, il faudra installer un port (# pkg_add wireguard-go).

Contrairement aux autres VPN, il dispose de clients sur de multiples plateformes (android, MacOS…) ce qui facilite son utilisation.

C’est certainement le choix le plus simple et utile si on veut mettre en place un VPN sur un serveur auto-hébergé.

Principe de fonctionnement

On retrouve les mêmes idées qui ont déjà fait leurs preuves pour chiffrer des mails ou encore publier les signatures DKIM : la paire de clés.

Pour faire simple, chaque morceau de données envoyé au travers du VPN est mis dans un coffre et fermé avec un cadenas qui ne peut s’ouvrir qu’avec la clé échangée pendant la poignée de mains. La poignée de main est quant à elle chiffrée avec les clés publiques la première fois.

Mise en place d’un “roadwarrior”

Dans cet exemple, nous utiliserons dans le VPN des IP situées dans le sous réseau (lien à lire, c’est édifiant 😉) 10.0.0.0/24 :

Le VPN se met en place par la création d’interfaces wgN, où “N” peut être un chiffre de 0 à 9 par exemple. Sous OpenBSD, une telle interface peut être obtenue en remplissant un fichier /etc/hostname.wgN.

Le serveur écoutera sur le port 443 en UDP. N’importe quel autre port peut-être utilisé. Toutefois, il est fréquent que les ports trop élevés soient bloqués sur les points d’accès publics (hôtel, restaurant…). On voit parfois des exemples utilisant le port 51820. Regardez le fichier /etc/services pour vous faire une idée de ce qui est un “grand” ou “petit” numéro de port.

Création de clés

Pour créer une clé privée robuste, utilisez la commande suivante :

openssl rand -base64 32

Cela retourne par exemple : “uA1ggvRv66QslZ0ygorWvcLVTxzFauffqMigXTrmLVY=

Ce n’est qu’une fois une clé privée attribuée à une interface que vous pourrez récupérer la clé publique correspondante avec la commande

# ifconfig wgN

Sur le serveur

On crée une clé privée :

# openssl rand -base64 32
r8uSGD6vyycE5n5/atU9/NX9JQPo4SJryNGpjbQG+rA=

On crée l’interface en précisant la clé précédente

# ifconfig wg0 create wgkey r8uSGD6vyycE5n5/atU9/NX9JQPo4SJryNGpjbQG+rA= wgport 443

Maintenant, vous pouvez récupérer la clé publique correspondant à cette nouvelle interface :

# ifconfig wg0
wg0: flags=8082<BROADCAST,NOARP,MULTICAST> mtu 1420
        index 5 priority 0 llprio 3
        wgport 443
        wgpubkey x9VXlh4AMa2YRjTMRVE39pQRsFHRJHUYrATL6vkqFmU=
        groups: wg

La ligne commençant par “wgpubkey” vous renseigne sur la clé publique utilisée par le serveur. Il faudra la préciser pour les clients, prenez-en note.

Prenez-bien note aussi de la clé privée du serveur : on l’utilisera tout à l’heure dans un fichier pour automatiser toute la procédure en cours.

Sur un client

On fait la même chose que sur le serveur, c’est à dire créer une clé privée puis une interface wg0 associée (nul besoin de préciser le port):

# openssl rand -base64 32
    q/7uIx6wBIRUIdxOi5D6OWEQRVUt2AXhMj7j29W/s3s=
# ifconfig wg0 create wgkey q/7uIx6wBIRUIdxOi5D6OWEQRVUt2AXhMj7j29W/s3s=
# ifconfig wg0 |grep wgpubkey
    wgpubkey V3pCAhxnRl0QEL8luB9D4EvTVxGT7QGDDCZ3O26kY3A=

Redirection du traffic à travers le serveur

Ici, on souhaite que le serveur se constitue comme une sorte de relai entre le client et le reste du réseau.

On doit pour cela activer la redirection d’IP sur les paquets passant par le serveur :

# sysctl net.inet.ip.forwarding=1

Pour que ça soit automatique, ajoutez cette ligne dans /etc/sysctl.conf:

net.inet.ip.forwarding=1

Si vous voulez faire de même en IPv6, utilisez plutôt:

net.inet6.ip6.forwarding=1

De plus, il faudra ajouter une règle pour faire du nat avec le parefeu :

# Ouverture du port 443 en UDP
pass in proto udp from any to any port 443 keep state
# Ce qui vient du VPN (wg0) est NATté vers l'interface "publique" du
# serveur
match out on egress from (wg0:network) to any nat-to (egress:0)
# la règle match doit être avant un "pass out on egress..." final
pass on egress from (wg0:network) to any
pass in on wg0

Creusons le tunnel

Maintenant qu’on dispose de tout le nécessaire pour identifier client et serveur, on peut creuser le tunnel. Pour ça, on va notamment ajouter les clés publiques des clients sur le serveur, et inversement. On va aussi indiquer les IP autorisées à utiliser le tunnel.

Afin de gagner du temps pour la suite et rendre les choses plus simples, nous allons désormais directement éditer les fichiers /etc/hostname.wg0. Ainsi, lors d’un futur redémarrage, la configuration sera intacte.

Prêtez bien attention aux clés utilisées, ce sont les mêmes que celles obtenues juste avant pour vous aider à vous repérer. 😉

Sur le serveur

Le fichier /etc/hostname.wg0 contient maintenant:

up
inet 10.0.0.1/24
wgkey r8uSGD6vyycE5n5/atU9/NX9JQPo4SJryNGpjbQG+rA=
wgport 443

wgpeer V3pCAhxnRl0QEL8luB9D4EvTVxGT7QGDDCZ3O26kY3A= wgaip 10.0.0.2/32

Quelques explications :

Vous pouvez ajouter autant de lignes “wgpeer” que vous voulez. C’est bon à savoir si vous souhaitez proposer un accès à plusieurs machines 😉. Cependant, chaque client disposera de sa propre IP. Par exemple :

wgpeer V3pCAhxnRl0QEL8luB9D4EvTVxGT7QGDDCZ3O26kY3A= wgaip 10.0.0.2/32
wgpeer m7K/gfmMPYRJx1IOP01zYrNbEuMnnZ29xN4OBgRoRXo= wgaip 10.0.0.3/32
wgpeer qnuq5MgezCDHXsYYGmrcegPCNcJvz9EOIG3XyHp1DBk= wgaip 10.0.0.4/32

Sur le client

Le fichier /etc/hostname.wg0 du client fonctionne comme pour le serveur, à ceci près qu’on doit notamment préciser où trouver le serveur (”wgendpoint”) et modifier les routes par défaut pour que le traffic passe par le tunnel.

wgkey q/7uIx6wBIRUIdxOi5D6OWEQRVUt2AXhMj7j29W/s3s=
wgpeer x9VXlh4AMa2YRjTMRVE39pQRsFHRJHUYrATL6vkqFmU= wgendpoint chezmoi.tld 443 wgaip 0.0.0.0/0
inet 10.0.0.2/24
!route add -priority 2 192.0.2.2 192.0.1.1
!route add -priority 7 default 10.0.0.1
up

Afin de vous simplifier la vie pour ces histoires de passerelle, vous pouvez directement indiquer l’appell à route -n get default dans le fichier /etc/hostname.wg0 :

wgkey ...
wgpeer ... wgendpoint 192.0.2.2 443 wgaip 0.0.0.0/0
inet 10.0.0.2/24
!route add -priority 2 192.0.2.2 $(route -n get default | awk '/gateway/ { print $2 }')
!route add -priority 7 default 10.0.0.1
up

Ouverture du tunnel

Démarrez cette interface avec la commande suivante sur le serveur et le client :

# sh /etc/netstart wg0

Vous pouvez désormais vérifier que lorsque vous naviguez sur internet, votre nouvelle IP est celle du serveur.

Configuration de clients utilisant d’autres systèmes d’exploitation

Comme je le disais plus haut, Wireguard est bien supporté par la plupart des systèmes. Cherchez “Client wireguard -nom-de-votre-plateforme-” pour trouver votre bonheur. Par exemple, pour Android, on peut trouver un client dans les dépôts F-droid.

Pour aller plus vite

On a précisé ici comment déployer le VPN avec les outils de base dans OpenBSD. Sachez que vous pouvez installer le port “wireguard-tools” qui pourra vous faire gagner du temps sur la gestion des clés.

Ressources

Ce tutoriel est très largement inspiré des liens suivants :


Page suivante →