Outils pour utilisateurs

Outils du site


config-vpn

Mise en place d'un serveur VPN avec WireGuard

Présentation

Wireguard est un logiciel et un protocole open-source, publié sous licence GPL, développé par Jason A. Donenfeld.
WireGuard permet de construire des tunnels VPN via des connexions point-à-point sécurisés et cryptés.
Il peut être configuré en mode routé ou bridgé. Sous Linux il est exécuté en tant que module du niyau et se veut plus rapide que OpenVPN ou IPSec Source: Wikipedia

Parler de serveur dans le cas de wireGuard est un abus de langage.
Puisqu'il fonctionne en mode point-à-point, il n'y a pas vraiment de client ou de serveur comme avec OpenVPN. Il y a juste un nœud (peer) qui se connecte à un autre noeud. Dans notre cas on va utiliser une machine avec une IP publique qui fera office de serveur VPN.
Les “clients” se connecteront à ce serveur à travers leur BOX Fibre ou ADSL et “sortiront” sur internet avec l'adresse IP publique qui leur aura été fourni. L'installation à été réalisé sur Debian 10 (Buster). La documentation officielle. est très complète. Ici je ne fait que la résumer et la traduire.
Je vous recommande aussi de suivre le (Quick Start) qui permet de bien comprendre la mise en œuvre de WireGuard.

Installation du serveur


Rappelez-vous que dans le cas de WireGuard le terme de serveur est un abus de langage!

Notes: j'ai très souvent, voir toujours eu des problème avec l'installation du package sous Debian. Installer à partir des sources. Ça fonctionne
à tous les coups.

C'est part…

Installation des pré-requis

$ sudo apt update
$ apt install -y libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-config xz-utils

Notes:

  • apt update: met à jour la liste des paquets
  • les paquets linux-headers-$(uname -r) build-essential pkg-config libmnl-dev libelf-dev sont nécessaires pour la compilation du noyau et de l'outil wg
  • la commande uname -r permet de récupérer la version du noyau installé.

Récupération des sources

$ wget https://git.zx2c4.com/WireGuard/snapshot/WireGuard-0.0.20191012.tar.xz

Extraction des sources

Pensez à installer <pre>xz-utils</pre> si vous ne l'avez pas…

# tar xvlf WireGuard-0.0.20191012.tar.xz

Compilation des sources et installation du noyau

$ cd WireGuard-0.0.20191012/src
$ make
$ sudo make install

Le dernier make devrait installer les fichiers suivants:

/usr/share/man/man8/wg.8
/usr/share/man/man8/wg-quick.8
/usr/share/bash-completion/completions/wg
/usr/share/bash-completion/completions/wg-quick
/usr/bin/wg
/usr/bin/wg-quick
/etc/wireguard
/lib/modules/$(uname -r)/extra/wireguard.ko

/etc/wireguard/ ⇒ le répertoire ou est stocké le fichier de configuration
/lib/modules/$(uname -r)/extra/wireguard.ko ⇒ le module du noyau
/usr/bin/wg ⇒ l'utilitaire pour générer, les clès, configurer les tunnels etc.
/usr/bin/wg-quick ⇒ un script bash pour faciliter

Lancement du tunnel au démarrage du système

On peut lancer automatiquement la conneion au VPN avec systemctl

$ sudo systemctl enable wg-quick@wg0

Activation du routage IP

Pour activer le routage IP au niveau du serveur exécuter les commandes suivantes:

$ sudo sysctl -w net.ipv4.ip_forward=1

On oublie pas l'IPv6:

$ sudo sysctl -w net.ipv6.conf.all.forwarding=1

Cette commande autorise le routage des paquets entrants et sortants qui transitent par le tunnel.

Pour que cette option soit prise en compte au redémarrage du serveur rajouter les ligne suivantes dans /etc/sysctl.conf:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Configuration de WireGuard

On arrive à la partie croustillante.

Génération des paires de clés

Pour WireGuard on crée une paire de clés (clé privée, clé publique).
La clé privée est gardée secret, c'est elle qui permet de décrypter les paquets.
La clé publique est communiquée au nœud distant. C'est elle qui lui permet de crypter le paquet qui ne pourra être décrypté qu'avec la clé privée.

$ sudo mkdir /etc/wireguard/private
$ sudo wg genkey | tee /etc/wireguard/private/privkey | sudo wg pubkey > /etc/wireguard/private/pubkey
$ sudo chmod 700 /etc/wireguard/private
$ sudo chmod 600 /etc/wireguard/private/*

Fichier de configuration

Dans le répertoire /etc/wireguard/wg0.conf on va mettre les informations nécessaire pour créer l'interface

[Interface]
PrivateKey = sPVFrwgLfETkidY7+ihZHpZCzNT7s/WARmjRVeoVvFM=
ListenPort = 51820
Address = 10.0.0.1/24, fd00::1/64
SaveConfig = false

Quelques explications:

PrivateKey = contient la clé privée que l'on a généré juste avant
ListenPort = C'est le numéro de port sur lequel sera établie la connexion
Adresses = Correspont aux adresses de l'interfce dans le tunnel
SaveConifg = le fichier de configuration de ne sera pas modifié par la cli wg.

Maintenant on peut démarrer l'interface wireguard

$ systemctl start wg-quick@wg0

Avec la commande wg0 on peut voir si l'interface est montée

root@baionet:/home/erjo# wg
interface: wg0
public key: pmcbNukQLOFSdImt2Tzy5gG4NLDOxHGI4MYGugBKWAE=\\
private key: (hidden)
listening port: 51820


Maintenant il reste à 'connecter' des nœuds clients que l'on va rajouter dans le fichier de configuration (/etc/wireguard/wg0.conf)
Dans le principe le 'client' doit se générer une paire de clée et nous communiquer sa clée publique. Il met à jour soon fichier de conf et nous le notre.
Dans la pratique c'est nous, FAI, qui fournissons à l'utilisateur un fchier de configuration avec tout ce qu'il faut à l'intérieur.

Configuration du 'client'

1. On génère les clés comme plus haut. Sauf que dans ce cas on ne conserve pas la clée privée puisque c'est celle du client.
On pourrait être tenté de le faire au cas ou le client perdrait son fichier de conf et blabla.
Mais dans le principe c'est comme si la banque conservait une copie de votre code de carte bancaire… C'est mal.

2. On donne au client sont fichier de conf (wg0.conf) qui contiendra:

  • Sa clé privée
  • Ses adresses IPs (v4 et v6)
  • les infos pour ouvrir le tunnel avec le serveur.

Le fichier ressemble à ça:

[Interface]
PrivateKey = iFUKDweuPernEUv84czH8jXxvTiNFuH0kJqpK4ClL3c=
Address = 130.89.148.77/32, 2001:67c:2564:a119::77/64
DNS = 80.67.169.12, 80.67.169.40, 2001:910:800::12, 2001:910:800::40
 
[Peer]
PublicKey = pmcbNukQLOFSdImt2Tzy5gG4NLDOxHGI4MYGugBKWAE=
PresharedKey = N/PZozZRhOLwc0DttzmDE5V5BvWyc86MVTxfRudzlk4=
PersistentKeepalive = 15
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 80.67.186.254:51820

Quelques explications:

PrivateKey = Comme plus haut, c'est la clé privé du client.
Address = Ici on met directement les IPs publiques que l'on a assignés au client.
DNS = Ce sont ceux de FDN. Il serait assez mal venu d'utiliser ceux de Google. Nuetralité oblige.

Dans la section [Peer] on retrouve

PublicKey = La clé publique du serveur
PersistentKeepalive = Pour éviter que le tunnel ne tombe lorsqu'il n'y a pas de trafic. Particulièrement utile avec une ADSL.
AllowadIPs = les IPs que le client est autorisé à se connecter. Il ne faut pas les oublier sinon le client ne pourra discuter qu'avec le serveur.
Endpoint = L'IP et le port du seveur sur lequel va s'établir le tunnel.


Et enfin dans le fichier de configuration du serveur on ajoute la section [Peer] qui correspond à notre client.

[Interface]
PrivateKey = CNngBuFFo4y2TXBT+NLbE+h5LAqqJUt4bVGgcYFm2n0=
ListenPort = 51820
Address = 10.0.0.1/24, fd00::1/64
SaveConfig = false
 
# User1
[Peer]
PublicKey = N/PZozZRhOLwc0DttzmDE5V5BvWyc86MVTxfRudzlk4=
PresharedKey = N/PZozZRhOLwc0DttzmDE5V5BvWyc86MVTxfRudzlk4=
AllowedIPs = 130.89.148.77/32, 2001:67c:2564:a119::77/64

Note:
Vous devriez avoir autant de section [Peer] que vous avez de clients.


That's All Folks!

config-vpn.txt · Dernière modification: 2020/03/09 21:20 de ohian