11

Monter un VPN en 15 min avec OpenBSD

15 min, si si, j'ai vérifié ^^ Et encore, c'est la mise à jour de la machine virtuelle qui était la plus longue!

Depuis peu, Wireguard est disponible sous OpenBSD 6.7-current. Il s'agit d'un protocole de 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 peut donner accès à une IP fixe en IPv6 si votre FAI n'en donne pas.

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

J'ai eu le plaisir de le configurer récemment et me suis dit :

Hééé, mais je pourrais peut-être proposer un accès VPN en l'échange de quelques euros ?

À la place, j'ai décidé de vous apprendre comment faire :P. Ça sera une config "roadwarrior", autrement dit un tunnel chiffré depuis vos appareils vers le serveur VPN qui relaiera le traffic vers l'internet mondial, vous faisant apparaître avec une nouvelle IP.

Vous pourrez retrouver ce tuto dans le manuel d'auto-hébergement.

Etape 1 : louer un serveur (VPS)

Il nous faut un serveur OpenBSD. Plusieurs choix s'offrent à vous :

Une fois dans votre espace personnel chez vultr, choisissez "Deploy Instance".

Ensuite, on va prendre le serveur le moins cher : nous n'avons pas besoin d'un grand espace de stockage ni d'une forte puissance de calcul.

Ajoutez l'IPv6 si vous le souhaitez, ainsi qu'une clé SSH pour que ça soit plus pratique.

Après validation, patientez que votre serveur soit en route.

Une fois que vous voyez le "Running", cliquez dessus pour avoir des infos comme l'IP du serveur, le mot de passe root, ...

Il ne vous reste plus qu'à vous connecter sur cette machine :)

D'après l'exemple ci-dessus:

ssh root@45.77.62.140 

Etape 2 : passer en 6.7-current

Il vous suffit d'une commande :

vultrvpn# sysupgrade -s
Fetching from https://ftp4.usa.openbsd.org/pub/OpenBSD/snapshots/amd64/
SHA256.sig   100% |*************************************|  2144       00:00    
Signature Verified
INSTALL.amd64 100% |************************************| 43523       00:00    
base67.tgz    11% |****                                 | 31744 KB    06:48 ETA
...

Patientez, ça va redémarrer.

Reconnectez-vous en SSH, puis mettez les ports à jour:

vultrvpn# pkg_add -u

Et voilà! On peut passer au VPN. :)

Etape 3 : Comprendre le fonctionnement de Wireguard

Il sera donc indispensable d'être très attentif à recopier les clés correctement par la suite. Prenez le temps de vérifier quelle clé correspond à quel appareil pour éviter de vous tromper.

Etape 4 : Mise en place d'un "roadwarrior"

Dans cet exemple, nous utiliserons dans le VPN des IP situées dans le sous réseau 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é, mais le 443 est rarement bloqué sur les points d'accès publics (hôtel, restaurant...). On voit parfois des exemples utilisant le port 51820.

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.

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. Dans /etc/pf.conf:

# 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

Rechargez le parefeu avec # pfctl -f /etc/pf.conf.

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:

wgkey r8uSGD6vyycE5n5/atU9/NX9JQPo4SJryNGpjbQG+rA=
wgport 443
wgpeer V3pCAhxnRl0QEL8luB9D4EvTVxGT7QGDDCZ3O26kY3A= wgaip 10.0.0.0/24
inet 10.0.0.1/24
up

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 ;).

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 45.77.62.140 443 wgaip 0.0.0.0/0
inet 10.0.0.2/24
!route add -priority 2 45.77.62.140 192.168.1.1
!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 est celle du serveur.

https://ipecho.net/plain

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.

Ajouter un nouveau client au serveur

Il suffit d'ajouter une nouvelle ligne "wgpeer" dans le fichier /etc/hostname.wg0 du serveur avec la clé publique correspondant au nouvel appareil.

wgpeer <cle publique de l'appareil> wgaip 10.0.0.0/24

Etape 5 : lire les ressources ayant servi à rédiger ce tuto

Ce tutoriel est très largement inspiré des liens suivants, tous en anglais :

06/07/2020 15:17

📧 Un commentaire?