Ca faisait un moment que je voyais passer des articles sur le VPN Wireguard. Ce week-end, entre deux lignes de code, j’ai voulu percer le mystère en mettant en place un serveur et en configurant 3 clients, un sous Ubuntu, un sous MacOs, et un sous Android. Ayant pris quelques notes d’installation, je vais essayer de mettre tout ça au clair pour que vous puissiez à votre tour utliser Wireguard.

La motivation

Depuis des années j’utilise openvpn, j’en étais pleinement satisfait jusqu’à ce que la fibre arrive. Le problème d’openvpn c’est qu’il n’est pas multithread, il ne va donc utiliser qu’un coeur et du coup si vous avez une bonne connexion vous allez être limité (sauf a prendre un serveur avec un gros CPU => $++). Concrétement dans mon cas, avec une instance Scaleway C2M je saturais a 200Mbs:

Debit avecOpenVPN

J’ai donc voulu tester Wireguard pour voir si je pouvais améliorer mon débit. Je ne fais pas durer le suspens inutilement, comme vous pouvez le constater les choses ce sont nettement améliorées 😎

Debit wireguard

Pour l’upload, ne cherchez pas, Orange a du mal à se défaire du coté assymétrique de l’ADSL…

Installation de Wireguard

J’ai installé Wireguard sur 4 “devices”:

  • un serveur sous Ubuntu 16.04
  • un poste de travail sous Ubuntu 18.04
  • un imac
  • un téléphone Android

A noter que j’ai préalablement installé Unbound sur le serveur VPN pour disposer d’un résolveur DNS pour les clients.

Installation de wireguard sur une instance Scaleway

Pour mon “serveur” j’ai updragé mon instance Scaleway pour une C2L qui offre un trés bon rapport bande passante / prix. Malheureusement le fait d’utliser une instance Scaleway complique un peu les choses, Wireguard est un module du noyau et comme les instances Scaleway ne permettent pas d’utiliser nos propres noyaux, et en particulier les noyaux standard de la distribution, il va falloir mettre quelque peu les mains dans le camboui.

Attention ne suivez cette procédure que si vous utilisez une instance Scaleway

Je considère que votre instance est UP, la première chose à faire va être de changer le Netboot. Rendez vous sur l’interface Scaleway à la section qui concerne l’instance. En bas de page, cliquez sur le bouton Show de la ligne Advanced et dans la section Bootscript selectionnez un noyau 4.15:

Debit wireguard

Ensuite rendez vous sur le serveur et exécutez les commandes suivantes:

apt update
apt install ncurses-dev git dpkg-dev libelf-dev libssl-dev build-essential
git clone https://git.zx2c4.com/WireGuard wireguard

On va à présent compiler le module Wireguard. Pour nous faciliter les choses, et ne pas avoir a entrer les commandes une à une on va créer le script suivant dans le fichier getmod.sh:

# Determine versions
arch="$(uname -m)"
release="$(uname -r)"
upstream="${release%%-*}"
local="${release#*-}"
 
# Get kernel sources
mkdir -p /usr/src
wget -O "/usr/src/linux-${upstream}.tar.xz" "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${upstream}.tar.xz"
tar xf "/usr/src/linux-${upstream}.tar.xz" -C /usr/src/
ln -fns "/usr/src/linux-${upstream}" /usr/src/linux
ln -fns "/usr/src/linux-${upstream}" "/lib/modules/${release}/build"
 
# Prepare kernel
zcat /proc/config.gz > /usr/src/linux/.config
printf 'CONFIG_LOCALVERSION="%s"\nCONFIG_CROSS_COMPILE=""\n' "${local:+-$local}" >> /usr/src/linux/.config
wget -O /usr/src/linux/Module.symvers "http://mirror.scaleway.com/kernel/${arch}/${release}/Module.symvers"
# already installed above # apt-get install -y libssl-dev # adapt to your package manager
make -C /usr/src/linux prepare modules_prepare

On le rend exécutable et on l’exécute:

chmod +x getmod.sh
./buildmod.sh

Puis on compile le module:

cd /usr/src/linux
make oldconfig
~/wireguard/contrib/kernel-tree/create-patch.sh | patch -p1
make modules -j9 # pick "M" (as a module) when asked about wireguard
make modules_install

Une fois cette étape terminée, vous pouvez continuer en suivant la procédure classique ci-dessous.

ATTENTION vous allez avoir un warning vous indiquant que le module est déja installé (je ne me souviens plus du message exact mais c’est quelque chose dans ce goût là). Ignorez le.

Installation de wireguard sous Ubuntu

Il vous suffit d’éxecuter:

add-apt-repository ppa:wireguard/wireguard
apt-get update
apt-get install wireguard-dkms wireguard-tools linux-headers-$(uname -r)

Installation de Wireguard sous MacOS

Il vous suffit d’utiliser brew:

brew install wireguard-tools

Installation de wirefuard sous Android

Il vous suffit d’installer le client officiel Wireguard pour Android

Configuration

Dans mon cas je vais utiliser le réseau privé 10.0.0.0/24 pour le VPN.

Le cas du client Android étant particulier je le traiterais à la fin.

Création des clés sur toutes les machines (clients et serveur donc)

Sur chaque poste j’ai créé dans la home de l’user un dossier .wireguard:

mkdir ~/.wireguard

On se place dans ce dossier et on génère les clés:

cd ~/.wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Configuration commune

Sur tous les postes (clients et serveur donc) on crée le fichier /etc/wireguard/wg0.conf que l’on renseigne ainsi :

[Interface]
PrivateKey = <clé privée du poste>
Address = adresse IP du poste au sein du VPN

Donc par exemple pour le serveur, qui va avoir comme IP 10.0.0.1:

[Interface]
PrivateKey = <clé privée du poste>
Address = 10.0.0.1

Configuration des clients

Sur chaque client on va ajouter une section [Peer] qui va définir les paramétres de connexion au serveur (le peer dans le cas d’un client):

[Peer]
PublicKey = <clé publique du serveur>
Endpoint = <adresse IP du serveur>:<port du serveur>
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

Au final le fichier de configuration du client va ressembler à (pour le client 10.0.0.2):

PrivateKey =  <clé privé du poste>
Address = 10.0.0.2/24
DNS = 10.0.0.1

[Peer]
PublicKey = <clé publique du serveur>
Endpoint = 163.172.X.Y:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

Si vous n’avez pas de résolveur sur le serveur, mettez 8.8.8.8 (oui je sais… 😉)

Configuration du serveur

Dans la partie [Interface] on va ajouter la variable ListenPort qui va renseigner le port d’écoute du serveur.

Pour chaque client on va ajouter une section [Peer] et y renseigner:

  • la clé publique du serveur
  • l’ip vers laquelle le serveur va router les paquets au travers du VPN. Dans notre cas ce sera uniquement l’adresse IP du client (contrairement auxconfig des clients où l’on met toutes les IP 0.0.0.0/0 car on veut que tout le trafic passe par le VPN).

Par exemple dans mon cas le fichier va être:

[Interface]
Address = 10.0.0.1/32
SaveConfig = false
ListenPort = 51820
PrivateKey = <clé privée du serveur>

[Peer]
PublicKey = <clé publique du client 1>
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = <clé publique du client 2>
AllowedIPs = 10.0.0.3/32

[Peer]
PublicKey = <clé publique du client 3>
AllowedIPs = 10.0.0.4/32

Mise à feu

On va commencer par créer l’interface Wireguard wg0 sur le serveur:

wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 10.0.0.1/32 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] ip route add 10.0.0.4/32 dev wg0
[#] ip route add 10.0.0.3/32 dev wg0
[#] ip route add 10.0.0.2/32 dev wg0

On peut vérifier que tout c’est bien passé via:

wg show
interface: wg0
  public key: h2LqrHkXXXXXXXXVqjEfriAAc=
  private key: (hidden)
  listening port: 51820

Et on fait la même chose sur chaque client, par exemple sur 10.0.0.2:

$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 10.0.0.2/24 dev wg0
[#] ip link set mtu 1340 dev wg0
[#] ip link set wg0 up
[#] resolvconf -a tun.wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0

Normalement:

  • vous devriez pouvoir pinger le serveur:
$ ping -c3 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=17.3 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=18.0 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=17.9 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 17.317/17.750/18.016/0.345 ms
  • naviguer sur internet
$ wget http://ovh.net/files/1Gb.dat -O /dev/null
--2018-09-02 18:03:15--  http://ovh.net/files/1Gb.dat
Résolution de ovh.net (ovh.net)… 213.186.33.6
Connexion à ovh.net (ovh.net)|213.186.33.6|:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 125000000 (119M) [application/octet-stream]
Enregistre : «/dev/null»

100%[=============================================================================>] 
119,21M  50,6MB/s    ds 2,4s    

2018-09-02 18:03:17 (50,6 MB/s) - «/dev/null» enregistré [125000000/125000000]

Si vous souhaitez enregistrer Wireguard comme service (sur les postes Linux):

systemctl enable wg-quick@wg0

Et si ça ne fonctionne pas ?

Si ça peut vous aider, voici un probléme que j’ai rencontré: j’ai deux accés fibre, un chez Free et un chez Orange Pro. Je n’ai eu aucun soucis avec Free, par contre chez Orange le download était bon mais l’upload quasi nul. Fixer le MTU, coté client, à 1420 (il était en auto avant) a corrigé le probléme.

Si vous avez un autre soucis, décrivez le dans les commentaires j’essairai de vous aider. J’insiste sur le fait de le faire via les commentaires car ainsi ce sera utile à tous.

Configuration du client Android

Ouvrez l’application Wireguard pour Android et cliquez sur la pastille + en bas à droite pour ajouter une nouvelle connexion puis cliquez sur Create from scratch:

Configuration wireguard sous android étape 1

On retrouve la configuration classique que l’on à rencontré dans les fichiers /etc/wireguard/wg0.conf.

A cela prés qu’il va falloir cliquer sur GENERATE pour générer les clés.

Dans Addresses mettez l’adresse IP que vous avez choisi pour votre device Android sous la forme IP/32, par exemple 10.0.0.4/32.

Cliquez ensuite sur ADD PEER

Configuration wireguard sous android étape 2

Renseignez Public Key avec la clé publique de votre serveur, Endpoint avec son adresse sous la forme IP:PORT et mettez 0.0.0.0/0 dans le champ Allowed IPs

Configuration wireguard sous android étape 3

Voila en supposant que vous avez configuré ce peer coté serveur ça devrait fonctionner.

Si vous avez des questions ou des remarques n’hésitez pas à m’en faire part via les commentaires.

Et si ce tuto vous a plu pensez à le partager ⤵️