Installer Wireguard avec LXC

Au sommaire :

  • 1-Qu'est-ce que Wireguard ?
  • 2-Pourquoi installer Wireguard sur Proxmox VE ?
  • 3-Installation
  • 4-Configuration

1-Qu'est-ce que Wireguard ?

Wireguard est un nouveau protocole de communication qui a la particularité d'être plus rapide que OpenVPN et IPsec.

Il est intégré au noyau Linux depuis mars 2020 (version 5.6) et fonctionne dans l'espace noyau (kernel space) contrairement aux deux cités plus haut qui fonctionnent dans l'espace utilisateur (user space).

«Puis-je encore exprimer mon amour pour lui et espérer qu'il fusionnera bientôt? Le code n'est peut-être pas parfait, mais je l'ai parcouru et comparé aux horreurs d'OpenVPN et d'IPSec, c'est une œuvre d'art », a déclaré Linus Torvald à propos de WireGuard.

Je vous conseille de lire cet excellent article du site Clubic à son sujet.

VPN : mais pourquoi tout le monde ne parle que de Wireguard ?
Si vous suivez de prêt ou de loin le petit monde du VPN, vous n’êtes sûrement pas étranger à ce nom : WireGuard. Il est en effet le dernier protocole à la mode chez les amateurs de tunnels chiffrés. Mais pourquoi une telle popularité ? Comment expliquer que tous les éditeurs adoptent ce petit nouvea…

2-Pourquoi installer Wireguard sur Proxmox VE ?

Wireguard va nous être très utile car il va nous permettre d'accéder à notre serveur de n'importe où. De plus, il est très facile à mettre en place et se paie le luxe d'être plus rapide que OpenVPN. Le fait qu'il fonctionne dans l'espace noyau est un énorme avantage en terme de performance.

Nous avons 3 solutions pour installer Wireguard :

  • Créer une machine virtuelle,
  • Créer un conteneur,
  • L'installer dans une solution de routeur pare-feu comme OPNsense,

Avec une machine virtuelle, nous auront une isolation totale mais cela demande beaucoup de ressources (émulation des périphériques, virtualisation) pour un simple service VPN,

Pour OPNsense, nous en reparlerons dans un prochain tutoriel.

Enfin, dans le cadre d'un homelab ou d'un serveur domestique, installer Wireguard dans un conteneur LXC a du sens.

C'est léger, rapide à mettre en place et peu gourmand en ressource (c'est simplement de l'isolation de processus).

Le conteneur dépendra du module Wireguard installé dans le noyau du serveur Proxmox VE.

3-Installation

Il faut noter que désormais avec la version 8.0 de Proxmox il n'y a plus besoin d'ajouter le dépôt backports (Wireguard est déjà dans les dépôts de Proxmox VE) et d'installer les paquet "pve-headers" et wireguard-dkms".

Donc plus besoin de générer le module avec dkms (Dynamic Kernel Module Support) et plus besoin de créer un conteneur privilégié pour accéder au module du noyau, ce qui améliore la sécurité.

Connectez-vous à votre serveur et mettez-le à jour.

root@micro-srv-01:~# apt update && apt upgrade -y 

Activez le module wireguard

root@micro-srv-01:~# modprobe wireguard

Puis ajouter le module pour qu'il se charge au démarrage du serveur

echo "wireguard" >> /etc/modules-load.d/modules.conf

Ensuite, il va falloir créer le conteneur LXC.

Indiquez un nom, un mot de passe et votre clé SSH (pour plus de confort).

Choisissez le template de Ubuntu 22.04 LTS.

Mettez la taille que vous voulez. 2 Go sont largement suffisants (et encore).

Je vous montre ce que ça donne sur mon conteneur de 5 Go, le tout prend 647 Mo.

root@proxwg:~# df -h
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/pve-vm--102--disk--0  4.9G  647M  4.0G  14% /

Mettez un core. C'est le minimum syndical.

128 ou 256 Mo sont suffisants.

Sur mon conteneur, il consomme seulement 39 Mo.

Choisissez une adresse IP statique et la passerelle par défaut. Laissez les options par défaut.

Utilisez les paramètres DNS du serveur

Confirmez la création du conteneur.

Démarrez le conteneur et mettez-le à jour.

root@proxwg:~# apt update && apt upgrade -y

Puis installez wireguard-tools avec les dépendance de base

root@proxwg:~# apt install --no-install-recommends wireguard-tools

Dans /etc/sysctl.conf, décochez la ligne suivante pour activer le transfert de port (port-forwarding) :

#net.ipv4.ip_forward=1

et appliquez la modification

root@proxwg:~# sysctl -p
net.ipv4.ip_forward = 1
root@proxwg:~#

Allez ensuite dans le dossier de Wireguard (etc/wireguard)

root@proxwg:~# cd /etc/wireguard
  • Appliquez un umask 077 aux fichiers qui seront crées dans le dossier par la suite, ce qui fera que seul l'utilisateur aura les droits en écriture, écriture et exécution (rwx-----),
  • Après la fermeture de la session, le dossier retrouvera son umask par défaut qui est 022 (rw-r---r--). Pour plus de renseignements, lire cet excellent article de it.connect :
Gestion de l’umask sous Linux | Commandes et Système | IT-Connect
Apprenez à utiliser l’UMASK sur votre distribution Linux grâce à ce tutoriel
  • Vous allez ensuite générer 4 fichiers, une paire de clé publique/privée pour le serveur wireguard et la même chose pour un client (iphone pour ce tuto),
root@proxwg:/etc/wireguard# umask 077
root@proxwg:/etc/wireguard# wg genkey | tee /etc/wireguard/server-privatekey | wg pubkey > /etc/wireguard/server-publickey
root@proxwg:/etc/wireguard# wg genkey | tee /etc/wireguard/iphone-privatekey | wg pubkey > /etc/wireguard/iphone-publickey

Créez le fichier “wg0.conf” et ajoutez les informations suivantes :

[Interface]
PrivateKey = <server-privatekey> # la clé privée du serveur
Address = 10.0.0.1 # l'adresse du sous réseau
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820 # le port d'écoute par défaut

[Peer]
# Iphone
PublicKey = <iphone-publickey> # la clé publique de l'iphone
AllowedIPs = 10.0.0.2/32 # l'adresse IP que Wireguard lui allouera sur le sous réseau
PersistentKeepalive = 25 # utile lorsque vous êtes derrière un NAT ou un pare-feu

Ensuite, créez le fichier "iphone.conf" et ajoutez les informations suivantes

[Interface]
PrivateKey = <iphone-privatekey> # la clé privée de l'iphone
Address = 10.0.0.2/24 # l'adresse indiquée dans "AllowedIPs"
ListenPort = 51820 # le port d'écoute par défaut. Peut-être modifié
DNS = 1.1.1.1 # Le serveur DNS. Ne surtout pas oublier sinon aucune connexion possible

[Peer]
# Iphone
PublicKey = <server-publickey> # la clé publique du serveur
Endpoint = <adressepublique:51820 # ajoutez l'adresse publique de votre box internet, soit le nom de domaine
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25 # utile lorsque vous êtes derrière un NAT ou un pare-feu
  • Appliquez les droits pour l'utilisateur et le groupe “root” sur le dossier et les sous-dossiers,
  • Supprimez les autorisations de lecture, d'écriture et d'exécution pour tous les utilisateurs, à l'exception du propriétaire du dossier,
  • Activez et démarrez le service "wg-quick@wg0.service",
root@proxwg:~# chown -R root:root /etc/wireguard
root@proxwg:~# chmod -R og-rwx /etc/wireguard
root@proxwg:~# systemctl enable wg-quick@wg0.service
root@proxwg:~# systemctl start wg-quick@wg0.service
root@proxwg:~#

4-Configuration

SI vous souhaitez utiliser Wireguard sur votre smartphone, installez le paquet “qrencode” qui vous permettra d'obtenir un qrcode. Cela vous évitera d'entrer manuellement les informations.

root@proxwg:~# apt install qrencode

Puis générer un qrcode à partir du fichier iphone.conf

root@proxwg:~# qrencode -t ansiutf8 < /etc/wireguard/iphone.conf

Installez l'application sur votre Iphone et scannez le qrcode, vous aurez enfin accès à votre serveur.

Si vous souhaitez plutôt utiliser un poste client Linux, créez une nouvelle paire de clé privée/publique pour votre poste bureautique sur votre serveur.

wg genkey | tee /etc/wireguard/desktop-privatekey | wg pubkey > /etc/wireguard/desktop-publickey

Ajoutez un nouveau peer dans le fichier wg0.conf

[Peer]
# Desktop
PublicKey = <desktop-publickey> # la clé publique de votre poste bureautique
AllowedIPs = 10.0.0.3/32 # l'adresse IP que Wireguard lui allouera sur le sous réseau
PersistentKeepalive = 25 # utile lorsque vous êtes derrière un NAT ou un pare-feu

Ensuite, créez un fichier "desktop.conf".

[Interface]
PrivateKey = <desktop-privatekey> # la clé privée de votre poste bureautique
Address = 10.0.0.3/24 # l'adresse indiquée dans "AllowedIPs"
ListenPort = 51820 # le port d'écoute par défaut. Peut-être modifié
DNS = 1.1.1.1 # Le serveur DNS. Ne surtout pas oublier sinon aucune connexion possible

[Peer]
# Iphone
PublicKey = <server-publickey> # la clé publique du serveur
Endpoint = <adressepublique:51820 # ajoutez l'adresse publique de votre box internet, soit le nom de domaine
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25 # utile lorsque vous êtes derrière un NAT ou un pare-feu

Ensuite sur votre poste bureautique, installez wireguard.

$ sudo apt update
$ sudo apt install wireguard

Copiez le fichier "desktop.conf" du serveur dans /etc/wireguard puis effectuer la commande suivante :

root@ubuntu-desktop wg-quick up desktop
[#] ip link add iphone type wireguard
[#] wg setconf iphone /dev/fd/63
[#] ip -4 address add 10.0.0.2/24 dev iphone
[#] ip link set mtu 1420 up dev iphone
[#] resolvconf -a iphone -m 0 -x
[#] wg set iphone fwmark 51820
[#] ip -6 route add ::/0 dev iphone table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev iphone table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n
root@ubuntu-desktop

Congratulation!!!!!!! Vous avez enfin configuré votre serveur VPN Wireguard sur votre smartphone et votre poste bureautique.

Si vous avez le message "/usr/bin/wg-quick: line 32: resolvconf: command not found", installez le paquet "openresolv".

sudo apt install openresolv

Note : n'oubliez pas d'ouvrir le port 51820 pour que le service soit accessible de l'extérieur. Sur une Freebox c'est très simple mais sur une Livebox, il va falloir créer un lien DynDNS pour mettre à jour l'adresse IP publique de votre nom de domaine.