Installation de Wireguard

wireguard

Présentation

Wireguard est un logiciel de VPN opensource assurant facilité d'utilisation, sécurité, économie d'énergie et performance.

Il fonctionne en mode "non-connecté". Il transmet les données en UDP.

Avantage extraordinaire (en tout cas à mon sens), il n'y a jamais de coupure de sessions.

Si par exemple, votre ordinateur est connecté en ethernet et en WIFI, que vous déconnectez votre câble ethernet et que votre ordinateur switche sur le WIFI, il ne cassera pas les connexions TCP en cours. C'est extrêmement pratique.

Autre exemple, si vous utilisez Wireguard sur votre smartphone, au delà de l'économie d'énergie par rapport à un autre logiciel VPN tel que OpenVPN, le fait de passer du WIFI à la 4G ou 5G, il ne cassera pas non plus vos sessions en cours et la transition se fait de manière transparente.

Pour vulgariser à l'extrême, lorsque vous le démarrez, il va monter une interface entre votre appareil et votre serveur, un peu comme si vous aviez creuser un trou qui va vers votre serveur, et y envoyer les données dedans. Son boulot n'est pas de s'assurer que le données arrivent à bon port, mais de "jeter" tous les paquets dans le trou que vous avez creusé.

La sécurité est assurée par l'utilisation de clés asymétriques pré-enregistrées dans la configuration pour générer une clé symétrique pour chiffrer les données.

Wikipedia dit à ce sujet :

[Wireguard](https://fr.wikipedia.org/wiki/WireGuard) utilise les protocoles suivants :
    - Curve25519 pour l'échange de clé
    - ChaCha20 pour la cryptographie symétrique
    - Poly1305 pour les codes d'authentification de message
    - SipHash pour les clés hashées
    - BLAKE2s pour la fonction de hachage cryptographique
    - Basé uniquement en UDP

[...]

[Wireguard](https://fr.wikipedia.org/wiki/WireGuard) supporte le mode de pré-partage symétrique des clés, qui fournit une couche de cryptographie symétrique supplémentaire pour atténuer les futurs progrès de l'informatique quantique. Cela réduit le risque que le trafic soit stocké jusqu'à ce que les ordinateurs quantiques soient capables de casser Curve25519, leur permettant de déchiffrer le trafic. Les clés pré-partagées sont "généralement gênantes du point de vue de la gestion des clés et pourraient être plus probablement volées", mais à plus court terme, si la clé symétrique est compromise, les clés Curve25519 offrent toujours une protection plus que suffisante.

Il a été intégré au noyau Linux depuis la version 5.6.

Installation du serveur

Dans cet exemple, je vais partir du principe que votre machine est déjà accessible publiquement sur Internet et qu'elle tourne sur une Debian (ou du moins un OS basé sur Debian)

Pour installer Wireguard, il existe sur le Github de Angristan, un script permettant de manager l'installation du serveur Wireguard, ainsi que l'ajout / suppression des clients.

Pour démarrer l'installation :

root@server:~# curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
root@server:~# chmod +x wireguard-install.sh
root@server:~# ./wireguard-install.sh

Pourquoi sauvegarder le script et l'éxecuter après plutôt que de le curl et de piper ça vers bash ? Parce que comme je l'ai mentionné précédemment, ce script va nous permettre de manager les clients par la suite.

Exécutons le script :

root@server:~# ./wireguard-install.sh
Welcome to the WireGuard installer!
The git repository is available at: https://github.com/angristan/wireguard-install

I need to ask you a few questions before starting the setup.
You can keep the default options and just press enter if you are ok with them.

IPv4 or IPv6 public address: 176.150.229.7
Public interface: eth0
WireGuard interface name: wg0
Server WireGuard IPv4: 10.66.66.1
Server WireGuard IPv6: fd42:42:42::1
Server WireGuard port [1-65535]: 53210
First DNS resolver to use for the clients: 192.168.1.253
Second DNS resolver to use for the clients (optional):

WireGuard uses a parameter called AllowedIPs to determine what is routed over the VPN.
Allowed IPs list for generated clients (leave default to route everything): 0.0.0.0/0,::/0

Okay, that was all I needed. We are ready to setup your WireGuard server now.
You will be able to generate a client at the end of the installation.
Press any key to continue...

Nous allons déjà décortiquer ce qui a été mis :

  • IPv4 or IPv6 public address: 176.150.229.7 : On renseigne l'adresse IP publique de notre machine
  • Public interface: eth0 : On renseigne l'interface utilisée par l'adresse IP publique de notre machine
  • WireGuard interface name: wg0 : On choisi le nom de l'interface pour Wireguard (wg0 par défaut)
  • Server WireGuard IPv4: 10.66.66.1 : On choisi l'adresse IPv4 privé du serveur Wireguard
  • Server WireGuard IPv6: fd42:42:42::1 : On choisi l'adresse IPv6 privé du serveur WireGuard
  • Server WireGuard port [1-65535]: 53210 : On renseigne le port du serveur Wireguard
  • First DNS resolver to use for the clients: 192.168.1.253 : Ici on renseigne l'adresse du résolveur DNS utilisé. Dans un article précédent j'avais expliqué comment installer une Pi-hole. Nous renseignons son IP ici pour bénéficier des avantages de la Pi-hole sur la connexion VPN.

Le choix d'un résolveur DNS secondaire est optionnel.

Ensuite nous voyons que nous avons renséigné les routes par défault 0.0.0.0/0,::/0 qui correspondent à tout le traffic IPv4 et tout le traffic IPv6 vers Internet. Cette configuration permet de générer par défaut ces routes pour tous les clients que nous allons configurer.

Bien entendu, cette instruction (AllowedIPs) est présente dans la configuration client. Nous pouvons très bien choisir uniquement certaines routes à faire passer dans le tunnel. Nous y reviendrons plus tard.

Ensuite, le script va installer et configurer tous les paquets necessaires à l'installation de Wireguard.

Client configuration

The client name must consist of alphanumeric character(s). It may also include underscores or dashes and can't exceed 15 chars.
Client name: client1
Client WireGuard IPv4: 10.66.66.2
Client WireGuard IPv6: fd42:42:42::2

Ensuite, le script nous demande de configurer un client.

  • Client name: client1 : Nous choisissons le nom du client Wireguard que nous voulons
  • Client WireGuard IPv4: 10.66.66.2 : Nous choisissons son adresse IPv4
  • Client WireGuard IPv6: fd42:42:42::2 : Nous choisissons son IPv6

Puis le script va nous générer le fichier de configuration. Et surprise :

screen1

Il nous génère un QR-code contenant la configuration intégrale du client.

Ce qui est très pratique sur un smartphone.

En effet, le client Wireguard sur smartphone (Android en tout cas), propose le scan d'un QR-code pour entrer la configuration d'un client.

Regardons le contenu de la configuration client1:

root@server:~# cat /root/wg0-client-client1.conf
[Interface]
PrivateKey = CGSPk1nHFYV7n8Y9DXsDFrZetCQrzqApRugEQBAjV2o=
Address = 10.66.66.2/32,fd42:42:42::2/128
DNS = 192.168.1.253,192.168.1.253

[Peer]
PublicKey = /Tc513AC3RLRt7bROYaBerxDft43KDdE2pbGYSgs21o=
PresharedKey = Avz8turMaSrsfru45dFCBC9dFqmwq7SmO7mDlguEB+k=
Endpoint = 176.150.229.7:53210
AllowedIPs = 0.0.0.0/0,::/0

Nous pouvons modifier ce fichier de configuration pour modifier les résolveurs DNS par exemple ou bien ce que nous voulons router à travers le VPN.

Relançons le script d'installation :

root@server:~# ./wireguard-install.sh
Welcome to WireGuard-install!
The git repository is available at: https://github.com/angristan/wireguard-install

It looks like WireGuard is already installed.

What do you want to do?
   1) Add a new user
   2) List all users
   3) Revoke existing user
   4) Uninstall WireGuard
   5) Exit
Select an option [1-5]:

Nous pouvons désormais manager les clients Wireguard et désinstaller le serveur proprement.

Pour configurer un 2e client, il suffit de taper 1 puis "Entrée" pour configurer un nouveau client.

Pour activer automatiquement le montage de l'interface wg0 lors du reboot de la machine :

root@server:~# systemctl enable wg-quick@wg0

Configuration du client

Pour configurer Wireguard sur la machine cliente (un PC sous Debian par exemple), il faut tout d'abord installer Wireguard :

root@client1:~# apt install wireguard

Ensuite, il suffit de récupérer le fichier de configuration client généré sur le serveur, le renommer en wg0 et de le déposer dans le répertoire /etc/wireguard

Pour monter le tunnel, il suffit de taper la commande :

root@client1:~# wg-quick up wg0

Avec la commande ifconfig, nous pouvons voir que l'interface est montée.

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 10.66.67.2  netmask 255.255.255.255  destination 10.66.67.2
        inet6 fd42:42:42::2  prefixlen 128  scopeid 0x0<global>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 41  bytes 6620 (6.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 129  bytes 26260 (25.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Si nous voulons monter automatiquement le tunnel au boot de la machine, tout comme sur le serveur :

root@client1:~# systemctl enable wg-quick@wg0

Aller plus loin avec Pi-hole

Pour éviter de voir dans vos stats Pi-hole uniquement votre serveur apparaître plutôt que vos appareils clients connecté à Wireguard, il convient de faire 2 ou 3 petites choses :

  • Créer un fichier de configuration Wireguard pour votre Pi-hole. Puis, dans AllowedIPs, renseigner l'adresse IP locale de votre serveur Wireguard (10.66.66.1 par défaut comme vu plus haut). Vous pouvez aussi rajouter son IPv6 (fd42:42:42::1) ce qui donnerait :
[Interface]
PrivateKey = CGSPk1nHFYV7n8Y9DXsDFrZetCQrzqApRugEQBAjV2o=
Address = 10.66.66.3/32,fd42:42:42::3/128
DNS = 127.0.0.1

[Peer]
PublicKey = /Tc513AC3RLRt7bROYaBerxDft43KDdE2pbGYSgs21o=
PresharedKey = Avz8turMaSrsfru45dFCBC9dFqmwq7SmO7mDlguEB+k=
Endpoint = 192.168.1.1:53210
AllowedIPs = 10.66.66.1,fd42:42:42::1

Nous modifions aussi l'adresse du résolveur DNS à 127.0.0.1 pour qu'il résolve les noms de domaines en s'interrogeant lui-même.

Nous changeons aussi le Endpoint pour le faire passer directement depuis l'adresse IP interne de notre serveur Wireguard.

  • Dans la configuration DNS des clients Wireguard, il faut renseigner l'adresse IP VPN de la Pi-hole (10.66.66.3 par exemple si votre Pi-hole a cette adresse de configuré). Exemple :
[Interface]
PrivateKey = CGSPk1nHFYV7n8Y9DXsDFrZetCQrzqApRugEQBAjV2o=
Address = 10.66.66.1/32,fd42:42:42::1/128
DNS = 10.66.66.3

[Peer]
PublicKey = /Tc513AC3RLRt7bROYaBerxDft43KDdE2pbGYSgs21o=
PresharedKey = Avz8turMaSrsfru45dFCBC9dFqmwq7SmO7mDlguEB+k=
Endpoint = 176.150.229.7:53210
AllowedIPs = 0.0.0.0,::/0

Avec ces outils, vous protégez désormais un peu plus votre vie privée, et vous éviterez d'être à la merci des publicités envahissantes quel que soit le lieu où vous êtes, et depuis n'importe quel type d'appareils que vous utilisez.

lolcat