Recherche de site Web

Comment créer un VPN sur Ubuntu 20.04 à l’aide de Wireguard


Wireguard est un VPN moderne et très facile à configurer, disponible sur plusieurs systèmes d’exploitation. L’application est disponible dans les dépôts officiels d’Ubuntu 20.04, elle est donc également très facile à installer. Contrairement à d’autres logiciels comme OpenVPN qui est basé sur l’utilisation de certificats ssl, Wireguard est basé sur l’utilisation de paires de clés. Dans ce tutoriel, nous allons voir comment configurer, en quelques étapes faciles, un serveur VPN et un pair client sur la dernière version stable d’Ubuntu.

Dans ce tutoriel, vous allez apprendre :

  • Comment installer Wireguard sur Ubuntu 20.04 Focal Fossa
  • Comment créer une paire de clés publique et privée
  • Comment configurer le serveur et un homologue client
  • Comment rediriger tout le trafic entrant vers le VPN

Wireguard VPN sur Ubuntu 20.04

Configuration logicielle requise et conventions utilisées

Installation

Wireguard est officiellement disponible dans le dépôt « univers » d’Ubuntu 20.04, nous pouvons donc l’installer via apt. La version disponible, au moment de la rédaction de cet article, est 1.0.20200319-1ubuntu1 :

sudo apt install wireguard

Le système nous demandera de confirmer que nous voulons installer le programme et ses dépendances, et terminera l’opération en quelques secondes.

Génération de clés

Nous devons générer une clé publique et une clé privée pour chaque machine que nous voulons utiliser dans notre VPN. La clé privée doit être gardée secrète sur la machine, la clé publique est utilisée pour accéder à la machine depuis les autres pairs.

Pour générer les clés, nous pouvons utiliser l’utilitaire wg. Dans le fichier de configuration de Wireguard, nous devrons référencer la clé privée de la machine, tandis que la clé publique sera utilisée sur les autres pairs. Notez que nous allons référencer les clés directement, donc théoriquement, nous n’avons pas besoin de les stocker dans des fichiers. Nous le ferons cependant de toute façon, juste pour plus de commodité.

Pour générer la clé privée de notre serveur, nous devons utiliser la sous-commande genkey de wg. La commande renvoie la clé créée à stdout ; Pour écrire la clé d’un fichier, nous pouvons utiliser la puissance des redirections shell :

wg genkey > server_private_key

La commande génère la clé et la stocke dans le fichier server_private_key, mais déclenche l’avertissement suivant :

Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.

En effet, avec l’utilisateur par défaut umask (002), les fichiers sont créés avec le mode 664, ils sont donc lisibles par tout le monde, ce qui n’est pas recommandé. Pour résoudre ce problème, nous pouvons soit changer l’umask utilisé dans la session shell actuelle avant de créer les fichiers :

umask 077

Ou modifiez les autorisations des fichiers à 600 après la création. Ici, nous opterons pour la dernière solution.

Une fois que notre clé privée est prête, nous pouvons générer la clé publique qui est basée sur celle-ci. Pour accomplir cette tâche, nous utilisons la sous-commande pubkey de wg. Comme précédemment, nous utilisons les redirections shell : d’abord pour passer le contenu du fichier server_private_key au stdin de la commande, puis pour rediriger la clé générée vers le fichier server_public_key :

wg pubkey < server_private_key > server_public_key

Pour éviter de taper, nous pouvons générer les deux touches, avec une seule commande, ce qui implique l’utilisation de l’opérateur shell | (pipe) et de la commande tee :

wg genkey | tee server_private_key | wg pubkey > server_public_key

La sortie de la commande sur le côté gauche de l’opérateur de tuyau (|) est passée à l’entrée standard du programme sur son côté droit. La commande tee, à la place, nous permet de rediriger la sortie d’une commande à la fois vers un fichier et vers une sortie standard (plus d’informations sur les redirections de shell ici).

Une fois que nos clés sont prêtes, nous pouvons créer le fichier de configuration du serveur.

Fichier de configuration du serveur

Pour configurer l’installation de Wireguard, nous pouvons créer un fichier de configuration appelé wg0.conf avec le contenu suivant :

[Interface]
PrivateKey = <private key of the server (the content of the server_private_key file)>
Address = 10.0.0.1/24
ListenPort = 51820

Notez que le nom du fichier est arbitraire, mais il doit être basé sur le nom que nous utiliserons pour notre interface, wg0 dans ce cas. Ce nom sera référencé lors du démarrage du service, comme nous le verrons ci-dessous.

Dans notre exemple. La section [interface] du fichier de configuration contient les champs suivants :

  • PrivateKey
  • Adresse
  • ListenPort

La valeur du champ PrivateKey n’est rien d’autre que la clé privée du serveur que nous avons générée précédemment.

Dans le champ Adresse, nous avons spécifié l’adresse à attribuer à l’interface dans le VPN avec le masque de sous-réseau en utilisant la notation CIDR. Dans ce cas, nous avons utilisé 10.0.0.1/24, donc notre adresse « serveur » Wireguard à l’intérieur du VPN sera 10.0.0.1, ce qui se trouve dans la plage d’adresses disponible qui va de 10.0.0.1 à 10.0.0.254.

Enfin, dans le champ ListenPort, nous avons spécifié sur quel port Wireguard écoutera le trafic entrant. Une règle pour autoriser ledit trafic doit également être ajoutée à notre pare-feu. Nous le ferons dans la section suivante.

Nous pouvons maintenant modifier les permissions des fichiers et les déplacer dans le répertoire /etc/wireguard :

chmod 600 server_public_key server_private_key wg0.conf
sudo mv server_private_key server_public_key wg0.conf /etc/wireguard

Nous pouvons maintenant démarrer le service wg-quick en spécifiant le nom de l’interface Wireguard après @ dans le nom de l’unité. Qu’est-ce que cette notation ? C’est une caractéristique de systemd : avec lui, nous pouvons générer plusieurs fichiers d’unités sur la base d’un fichier « modèle », en passant la valeur qui sera substituée dans le modèle, après le symbole @ dans le nom de l’unité. Voici le contenu de l’unité wg-quick@.service :

[Unit]
Description=WireGuard via wg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
Documentation=man:wg-quick(8)
Documentation=man:wg(8)
Documentation=https://www.wireguard.com/
Documentation=https://www.wireguard.com/quickstart/
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/wg-quick up %i
ExecStop=/usr/bin/wg-quick down %i
Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity

[Install]
WantedBy=multi-user.target

La valeur que nous spécifierons après le @ dans le nom de l’unité lors du démarrage ou de l’arrêt, remplacera %i dans les lignes ExecStart et ExecStop. Dans ce cas, nous utiliserons wg0 :

sudo systemctl enable --now wg-quick@wg0

Avec la commande ci-dessus, nous avons démarré le service et faisons en sorte qu’il soit automatiquement démarré au démarrage. Pour vérifier que notre configuration a été appliquée, nous pouvons exécuter la commande wg. La sortie produite doit afficher des informations sur l’interface wg0 :

sudo wg
interface: wg0
  public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4=
  private key: (hidden)
  listening port: 51820

Maintenant, procédons et configurons notre pare-feu et notre transfert de paquets.

Configuration du pare-feu et du réseau

Dans ce tutoriel, je vais supposer l’utilisation de ufw. Comme nous l’avons déjà dit, nous devons ajouter une règle pour autoriser le trafic entrant via le port que nous avons spécifié dans le fichier de configuration, 51820. Nous le faisons en exécutant une commande très simple :

sudo ufw allow 51820/udp

Nous devons également autoriser la redirection de paquets sur notre système. Pour accomplir la tâche, nous devons supprimer le commentaire de la ligne 28 du fichier /etc/sysctl.conf, de sorte qu’il ressemble à ceci :

Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Pour que les modifications soient effectives sans redémarrer le système, nous devons exécuter la commande suivante :

sudo sysctl -p

À l’étape suivante, nous allons configurer le client.

Génération de clés client

Passons maintenant au système que nous voulons utiliser en tant que client. Nous devons installer Wireguard dessus ; Une fois cela fait, nous pouvons générer une paire de clés comme nous l’avons fait sur le serveur :

wg genkey | tee client_private_key | wg pubkey > client_public_key

Tout comme nous l’avons fait côté serveur, nous créons le fichier de configuration wg0.conf. Cette fois-ci avec ce contenu :

[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/24

[Peer]
PublicKey = <server_public_key>
EndPoint  = <server_public_ip>:51820
AllowedIPs = 0.0.0.0/0

Nous avons déjà vu la signification des champs contenus dans la section Interface, lorsque nous avons généré la configuration du serveur. Ici, nous avons juste adapté les valeurs à notre client (il aura l’adresse 10.0.0.2 dans le VPN).

Dans cette configuration, nous avons utilisé une nouvelle section, [Peer]. Dans celui-ci, nous pouvons spécifier les informations relatives à un pair, dans ce cas celui que nous utilisons comme « serveur ». Les champs que nous avons utilisés sont les suivants :

  • PublicKey
  • EndPoint
  • Adresses IP autorisées

Dans le champ PublicKey, nous spécifions la clé publique de l’homologue, donc, dans ce cas, la clé publique que nous avons générée sur le serveur.

Le point de terminaison est l’adresse IP publique ou le nom d’hôte de l’homologue suivi d’un deux-points et du numéro de port sur lequel l’homologue écoute (dans notre cas, 51820).

Enfin, la valeur transmise au champ AllowedIPs est une liste d’adresses IP et un masque de sous-réseau séparés par des virgules avec notation CIDR. Seul le trafic dirigé vers l’homologue qui provient des adresses spécifiées sera autorisé. Dans ce cas, nous avons utilisé 0.0.0.0/0 comme valeur : cela fonctionne comme une valeur « fourre-tout », donc tout le trafic sera envoyé à l’homologue VPN (le serveur).

Tout comme nous l’avons fait côté serveur, nous définissons les autorisations appropriées et déplaçons les clés et le fichier de configuration dans le répertoire /etc/wireguard :

chmod 600 client_public_key client_private_key wg0.conf
sudo mv client_public_key client_private_key wg0.conf /etc/wireguard

Une fois le fichier de configuration en place, nous pouvons démarrer le service :

sudo systemctl enable --now wg-quick@wg0

Enfin, la section [Peer] relative à notre client, doit être ajoutée au fichier de configuration que nous avons précédemment créé sur le serveur. Nous y ajoutons le contenu suivant :

[Peer]
PublicKey = <public key of the client>
AllowedIPs = 10.0.0.2/32

À ce stade, nous redémarrons le service :

sudo systemctl restart wg-quick@wg0

Les informations sur l’homologue associé doivent maintenant être signalées dans la sortie de la commande wg :

sudo wg
interface: wg0
  public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4=
  private key: (hidden)
  listening port: 51820

peer: t5pKKg5/9fJKiU0lrNTahv6gvABcmCjQq5gF3BxwiDQ=
  allowed ips: 10.0.0.2/32

À ce stade, à partir du système « client », nous devrions pouvoir envoyer un ping au serveur à l’adresse 10.0.0.1 :

ping -c 3 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=2.82 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=38.0 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=3.02 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 2.819/14.613/37.999/16.536 ms

Conclusions

Dans ce tutoriel, nous avons vu comment créer un VPN en utilisant Wireguard sur la dernière version stable d’Ubuntu : 20.04 Focal Fossa. Le logiciel est vraiment simple à installer et à configurer, surtout si on le compare à d’autres solutions, comme par exemple OpenVpn.

Nous avons vu comment générer les clés publiques et privées utilisées pour notre configuration, et comment configurer à la fois le serveur et un client afin que tout le trafic soit redirigé vers le VPN. En suivant les instructions données, vous aurez une configuration fonctionnelle. Pour plus d’informations, veuillez consulter la page du projet.

Articles connexes: