I.   Présentation

 

WireGuard est un VPN extrêmement simple mais rapide et moderne qui utilise une cryptographie de pointe. Il se veut plus rapide, plus simple, plus léger et plus utile qu’IPSec, tout en évitant les maux de tête massifs. Il a l’intention d’être beaucoup plus performant qu’ OpenVPN. WireGuard est conçu comme un VPN polyvalent pour fonctionner sur des interfaces embarquées et des superordinateurs, adapté à différentes circonstances. Initialement publié pour le noyau Linux, il est maintenant multiplate-forme et largement déployable. Il est actuellement en plein développement, mais il pourrait déjà être considéré comme la solution VPN la plus sûre, la plus facile à utiliser et la plus simple de l’industrie.

 

Wireguard est encore en développement, ici nous sommes dans un labo, la mise en production n’est pas conseillée.

 

Nous allons mettre en place un serveur VPN Wireguard et des clients qui s’y connecteront.

 


II.   Les VMs

 

Nous aurons donc:

  • 1 VM wireguard
  • 1 VM client
  • 1 Android client

 

Les deux VMs seront sous debian 9 stretch. Elles n’ont aucune caractéristique précise car nous sommes en labo. Dans notre cas elles ont:

  • 2 CPU
  • 2 Go de RAM
  • 100 Go de disque

Elles auront pour nom dans notre cas:

  • WIREGUARD-SRV
  • WIREGUARD-CLT

 

Elles sont à jour:

apt update && apt upgrade -y

 

 


III.   Installation

 

Pour installer Wireguard il suffit d’ajouter les sources qui sont répertoriées instable/unstable:

[WIREGUARD-SRV] & [WIREGUARD-CLT]

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable

 

Puis nous pouvons chercher les mises à jour et installer le paquet Wireguard:

[WIREGUARD-SRV] & [WIREGUARD-CLT]

apt update && apt install wireguard -y

 


IV.   Configuration

1) Génération des clés

 

Nous allons créer dans le home de nos utilisateurs deux clés, une privé et une publique

[WIREGUARD-SRV] & [WIREGUARD-CLT]

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

 

Afficher les valeurs des clés:

cat privatekey publickey

 

2) Fichier wg0.conf

 

Tout va se passer dans le fichier /etc/wireguard/wg0.conf que l’on doit créer:

nano /etc/wireguard/wg0.conf

 

Puis nous le remplissons:

[WIREGUARD-SRV]

[Interface]
PrivateKey = CLE PRIVEE DU SERVEUR --> privatekey
Address = 10.0.0.1
SaveConfig = false
ListenPort = 51820

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE
DNS = 8.8.8.8


[Peer]
# CLient 1 = VM debian
PublicKey = CLE PUBLIQUE DU CLIENT --> publickey
AllowedIPs = 10.0.0.2/32

 

Explications:

[Interface] : Paramètre pour la définition de la configuration local (serveur wireguard)
PrivateKey : CLE PRIVEE DU SERVEUR –> privatekey
Address : adresse que prendra la carte virtuelle wg0 différente de la carte réseau connectée à internet (eth0/ens18)
SaveConfig :false
ListenPort : définit sur quel port le serveur wireguard va ecouter les connexions des clients
PostUp : règles iptables (parefeu) à activer lorsque la carte wg0 s’active (up)
PostDown : règles iptables (parefeu) à désactiver lorsque la carte wg0 se désactive (down)
DNS : Les clients utiliseront le DNS spécifié, ici celui de google

[Peer] : Paramètre pour la définition de la configuration du client qui se connectera au serveur wireguard
PublicKey : CLE PUBLIQUE DU CLIENT –> publickey
AllowedIPs : IPs autorisées à se connecter. Ici on met un /32 pour qu’il n’y ait que l’adresse 10.0.0.2 et non pas un /24 pour autoriser les IPs 10.0.0.1-254

Si vous mettez l’option DNS, il faudra installer le paquet resolvconf.
apt install resolvconf -y


Vous pouvez ajouter d’autres clients en rajoutant une autre section [Peer]

 

Les règles Iptables:

iptables -A FORWARD -i wg0 -j ACCEPT : Tout le trafic provenant de la carte wg0 est autorisé
; : permet de mettre plusieurs règles à la suite
iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE : On NAT (translate) le trafic vers ens18.

C’est à dire que le trafic arrivant de wg0 (n’ayant pas internet) va être envoyé sur la carte ens18 (ayant internet). Cela permet de connecter les clients en provenance de la carte wg0 à internet (ens18)

 

 

[WIREGUARD-CLT]

[Interface]
PrivateKey = CLE PRIVEE DU CLIENT
Address = 10.0.0.2/24


[Peer]
PublicKey = CLE PUBLIQUE DU SERVEUR WIREGUARD
Endpoint = 192.168.1.49:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25

 

Endpoint : L’adresse de la “vraie carte” réseau de sortie où est virtuellement attaché wg0 sur le serveur. En gros IP du serveur Wireguard sur la carte eth0/ens18
PersistentKeepalive : permet d’envoyer toutes les X secondes un paquet afin que la connexion ne soit pas coupée par un pare-feu (fonctionnement normal d’un pare-feu)

 

 


V.   Mise en route

 

La mise en route est très simple, une fois les fichiers wg0.conf enregistrés et parfaitement complétés, on va pouvoir démarrer le serveur VPN avec une seule commande:

[WIREGUARD-SRV]

wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 10.0.0.1 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] resolvconf -a tun.wg0 -m 0 -x
[#] ip route add 10.0.0.2/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE

 

Puis au tour du ou des clients:

[WIREGUARD-CLT]

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 1420 dev wg0
[#] ip link set wg0 up

 

Maintenant vous devriez pouvoir depuis [WIREGUARD-CLT] pinguer le [WIREGUARD-SRV]

ping 10.0.0.1 -c 3
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=0.308 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.321 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.416 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2029ms
rtt min/avg/max/mdev = 0.308/0.348/0.416/0.050 ms

 

Vous devriez également avoir accès à internet depuis [WIREGUARD-CLT], pour le tester en ligne de commande:

wget http://ipv4.online-dc3.testdebit.info/50M.iso
--2018-11-28 17:41:41-- http://ipv4.online-dc3.testdebit.info/50M.iso
Résolution de ipv4.online-dc3.testdebit.info (ipv4.online-dc3.testdebit.info)… 62.210.156.7
Connexion à ipv4.online-dc3.testdebit.info (ipv4.online-dc3.testdebit.info)|62.210.156.7|:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 50000000 (48M) [application/x-iso9660-image]
Sauvegarde en : « 50M.iso »
50M.iso 100%[============================================>] 47,68M 1,86MB/s in 26s2018-11-28 17:42:07 (1,81 MB/s) — « 50M.iso » sauvegardé [50000000/50000000]

 

 


VI.   Android

 

Pour les téléphones Android, téléchargez l’application WireGuard sur le PlayStore .

 

1) Méthode Qrcode

Cette méthode est la plus rapide/simple.

Nous allons sur le serveur créer le fichier de configuration du client puis générer un Qrcode que l’on pourra envoyer pour que le client le scanne avec son téléphone.

Tout d’abord, on créé les certificats du client:

[WIREGUARD-SRV]

mkdir ~/.clients
cd ~/.clients
umask 077
wg genkey | tee client_privatekey | wg pubkey > client_publickey

 

Puis on créé le fichier de configuration du client

[WIREGUARD-SRV]

nano ~/.clients/client_wg0.conf
[Interface]
PrivateKey = CLE PRIVEE DU CLIENT --> client_publickey
Address = 10.0.0.4/24

[Peer]
PublicKey = CLE PUBLIQUE DU SERVEUR
Endpoint = 192.168.1.49:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0 -> sous android sinon aucune communication

 

Le fichier est fin prêt, passons à la génération du Qrcode:

[WIREGUARD-SRV]

apt install qrencode -y
qrencode -t ansiutf8 < client_wg0.conf

 

Le Qrcode est affiché, il ne vous reste plus qu’à le faire scanner ou à l’envoyer (copie d’écran)

 

Il faut a présent modifier le fichier de configuration wg0.conf sur le serveur et ajouter la nouvelle section Peer:

[WIREGUARD-SRV]

[Peer]
PublicKey = CLE PUBLIC DU TELEPHONE ANDROID
AllowedIPs = 10.0.0.4/32

 

Relancez le service wireguard pour la prise en compte de la nouvelle configuration:

[WIREGUARD-SRV]

wg-quick down wg0 && wg-quick up wg0

 

 

2) Méthode manuel

Cliquez sur le “+” puis sur “Create from scratch”:

 

Nous retrouvons le fichier de configuration avec les sections “Interface” et “Peer”.
Donnez un nom à votre connexion VPN, puis cliquez sur “GENERATE”. Dans “Addresses” mettez l’IP que prendra la connexion VPN (10.0.0.x/32).
Le DNS n’est pas obligatoire si vous l’avez spécifié dans la configuration du serveur.

Cliquez sur “ADD PEER”

 

Entrez la clé publique du serveur.
Autorisez l’IP du serveur.
Entrez l’IP du serveur (eth0/ens18) sous la forme IP:PORT.

Puis enregistrez.

Pour que cela fonctionne il faut mettre 0.0.0.0/0 dans Allowed IPs.

 

Il faut à présent modifier le fichier de configuration wg0.conf sur le serveur et ajouter la nouvelle section Peer:

[WIREGUARD-SRV]

[Peer]
PublicKey = CLE PUBLIC DU TELEPHONE ANDROID
AllowedIPs = 10.0.0.3/32

 

Relancez le service wireguard pour la prise en compte de la nouvelle configuration:

[WIREGUARD-SRV]

wg-quick down wg0 && wg-quick up wg0

 

Vous devriez pouvoir vous connecter sur votre Android comme sur votre VM

 

 

3) Méthode fichier ou archive

Dans ce cas il suffit de copier le fichier de configuration client_wg0.conf sur le téléphone et de l’importer.

 


VII.   Wireguard VS OpenVPN

 

1) Test: copie de fichier

Je vais réaliser un test simple, une copie de fichier. Le client va récupérer un fichier sur le serveur. Test réalisé via Wireguard et après par OpenVPN.

Déroulement du test:

  • Création d’un fichier de 1Go et 10Go sur les serveurs Wireguard et OpenVPN
  • Transfert des fichiers 3 fois (pour faire la moyenne)
  • Calcul de la moyenne de la vitesse de transfert

 

1) Création des fichiers

Wireguard serveur & OpenVPN serveur

cd /tmp
dd if=/dev/zero of=1G.bin bs=1024 count=0 seek=$[1024*1024]
dd if=/dev/zero of=10G.bin bs=1024 count=0 seek=$[1024*1024*10]
ls -lh
total 0
-rw——- 1 root root 10G nov. 29 16:27 10G.bin
-rw——- 1 root root 1,0G nov. 29 16:27 1G.bin

 

2) Transferts

Wireguard client

cd /tmp
scp root@10.0.0.1:/tmp/1G.bin /tmp/

 

Wireguard client

scp root@10.0.0.1:/tmp/10G.bin /tmp/

 

OpenVPN client

cd /tmp
scp root@10.8.0.1:/tmp/1G.bin /tmp/

 

OpenVPN client

scp root@10.8.0.1:/tmp/10G.bin /tmp/

 

 

 

3) Résultats

 

Sans VPN (en MB/s) Copie 1 Copie 2 Copie 3 Moyenne
1Go 109,5 113,0 112,8 111,77
10Go 110,6 111,6 111,2 111,13

 

Wireguard (en MB/s) Copie 1 Copie 2 Copie 3 Moyenne
1Go 64,6 61,6 63,8 63,33
10Go 58,3 62,3 62,2 60,93

 

OpenVPN (en MB/s) Copie 1 Copie 2 Copie 3 Moyenne
1Go 20,3 20,8 20,8 20,63
10Go 20,4 20,5 19,6 20,17
Sur ce test Wireguard est 3 fois plus performant qu’ OpenVPN.

 

2) Test: Iperf3

 

On commence par installer iperf3:

apt install iperf3

 

Puis on lance le test:

[WIREGUARD-SRV] && [OPENVPN-SRV]

iperf3 -s -f M

 

[WIREGUARD-CLT]

iperf3 -c 10.0.0.1 -t 60

 

 

[OPENVPN-CLT]

iperf3 -c 10.8.0.1 -t 60

 

3) Résultats

 

IPERF3 60s WIREGUARD OPENVPN
Transfert (en Go) 10,3 1,24
Bande passante (en Mo/s) 176  21,2
Nous constatons qu’en 60 secondes sous Wireguard nous transférons 8,3 fois plus de données.