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:
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 😎
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:
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:
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
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
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 ⤵️