Comment installer WireGuard VPN + interface Web sur Ubuntu
Divulgation : Cet article contient des liens d'affiliation. Je peux percevoir une commission lorsque vous achetez via ces liens, sans frais supplémentaires pour vous.
Lorsque vous vous connectez au Wi-Fi d'un café ou que vous accédez à Internet depuis un réseau public quelconque, vos données circulent à travers une infrastructure que vous ne contrôlez pas. Toute personne se situant entre vous et les sites Web que vous visitez pourrait potentiellement intercepter votre trafic, même sur votre réseau domestique, votre fournisseur d'accès à Internet peut voir chaque site que vous consultez.
Un VPN résout ce problème en créant un tunnel chiffré entre votre appareil et un serveur en lequel vous avez confiance. Au lieu que votre trafic aille directement sur Internet, il passe d'abord par ce tunnel sécurisé vers votre serveur VPN, qui le transmet ensuite à sa destination, de sorte que toute personne surveillant le réseau ne voit que des données chiffrées allant vers votre serveur VPN, rien de plus.
WireGuard est un protocole VPN moderne qui accomplit cette tâche remarquablement bien. Contrairement aux technologies VPN plus anciennes qui nécessitent des centaines de milliers de lignes de code, WireGuard réalise la même tâche avec seulement environ 4 000 lignes, ce qui signifie moins de bugs, de meilleures performances et des audits de sécurité plus faciles.
Mais voici le problème : bien que WireGuard lui-même soit simple, gérer plusieurs clients VPN, générer des fichiers de configuration et suivre qui a accès peut devenir fastidieux uniquement via la ligne de commande, c'est pourquoi avoir une interface web est pratique.
Dans ce guide, nous allons configurer un serveur complet WireGuard VPN avec une interface web conviviale qui vous permet de tout gérer depuis votre navigateur, comme l'ajout de nouveaux appareils, la génération de codes QR pour les clients mobiles et la surveillance des connexions sans toucher à un seul fichier de configuration manuellement.
Ce dont vous aurez besoin
Avant de commencer, assurez-vous d'avoir :
- Un serveur Linux avec une adresse IP publique (un VPS de fournisseurs comme DigitalOcean, Linode ou AWS fonctionne parfaitement).
- Accès root ou privilèges sudo sur ce serveur.
- Une compréhension de base de SSH (vous devriez savoir comment vous connecter à votre serveur).
Ce guide suppose que vous utilisez Ubuntu 22.04 ou Ubuntu 24.04, mais les étapes fonctionnent de manière similaire sur Debian et d'autres distributions avec quelques ajustements mineurs.
Comprendre l'architecture
Prenons un moment pour comprendre ce que nous construisons avant de commencer à taper des commandes.
Une configuration WireGuard se compose de pairs – des appareils qui peuvent communiquer entre eux à travers des tunnels chiffrés.
Dans notre cas, nous aurons :
- Le Serveur : Votre machine Linux avec une adresse IP publique, qui agit comme le centre principal auquel tous vos appareils se connectent.
- Les Clients : Votre ordinateur portable, téléphone, tablette ou tout autre appareil que vous souhaitez protéger, chaque client reçoit sa propre paire de clés cryptographiques et sa configuration.
- L'interface Web : Une application web légère (nous utiliserons WireGuard-UI) qui s'exécute sur votre serveur et vous offre un tableau de bord pour tout gérer.
Lorsqu'un client souhaite se connecter, il établit un tunnel chiffré direct vers le serveur, puis le serveur dirige le trafic Internet du client ou permet simplement l'accès aux ressources sur le réseau local du serveur, selon la manière dont vous le configurez.
Étape 1 : Installation de WireGuard sur un serveur Ubuntu
Tout d'abord, assurons-nous que votre système est à jour et dispose des outils nécessaires installés en utilisant la commande suivante, qui mettra à jour vos listes de paquets et mettra à niveau les logiciels obsolètes.
sudo apt update && sudo apt upgrade -y
Ensuite, installez WireGuard lui-même :
sudo apt install wireguard -y
Puisque WireGuard est intégré au noyau Linux (pour les noyaux 5.6 et supérieurs), cette commande installe principalement les outils en espace utilisateur nécessaires pour configurer et gérer les interfaces WireGuard.
Étape 2 : Activation du transfert IP sur Ubuntu
Par défaut, Ubuntu ne transfère pas les paquets entre les interfaces réseau, ce qui est une fonctionnalité de sécurité : votre serveur ne fonctionnera pas comme un routeur sauf si vous lui indiquez explicitement de le faire, mais pour un serveur VPN, nous avons besoin de cette fonctionnalité.
Lorsque votre téléphone se connecte au VPN et tente de visiter un site web, le serveur doit transférer cette requête de l'interface WireGuard vers son interface réseau publique, puis renvoyer la réponse.
Pour activer le transfert IP de manière permanente, nous devons éditer un fichier de configuration système :
sudo nano /etc/sysctl.conf
Recherchez cette ligne (elle pourrait être commentée avec un # au début) :
#net.ipv4.ip_forward=1
Supprimez le # pour le décommenter, ou ajoutez la ligne si elle n'existe pas :
net.ipv4.ip_forward=1
Enregistrez le fichier puis appliquez les modifications sans redémarrer :
sudo sysctl -p
Étape 3 : Configurer le pare-feu et le routage pour WireGuard
Votre serveur VPN doit accepter les connexions entrantes sur le port utilisé par WireGuard (par défaut, le port UDP 51820). Il doit également acheminer correctement le trafic entre l'interface VPN et votre interface réseau publique.
Tout d'abord, identifions votre interface réseau publique :
ip route | grep default
Vous verrez une sortie comme :
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100
Le nom de l'interface ici est `eth0`, mais il peut être différent sur votre système, il pourrait être `ens3`, `enp0s3`, ou quelque chose de similaire.
Configurez maintenant le pare-feu ufw (le pare-feu par défaut d'Ubuntu) :
# Allow SSH (if you haven't already)
sudo ufw allow 22/tcp
Allow WireGuard
sudo ufw allow 51820/udp
Allow the web interface (we'll use port 5000)
sudo ufw allow 5000/tcp
Ensuite, nous devons ajouter une règle NAT (Traduction d'Adresse Réseau) qui indique à votre serveur de faire passer le trafic VPN comme s'il provenait du serveur lui-même lorsqu'il le transmet à Internet.
sudo nano /etc/ufw/before.rules
Ajoutez ces lignes en haut du fichier, juste après les commentaires d'en-tête, mais avant la ligne *filter et remplacez eth0 par le nom réel de votre interface :
# NAT table rules for WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT
Voici ce que cela signifie :
*nat: Nous travaillons avec la table NAT.-s 10.0.0.0/24: Pour les paquets provenant de notre réseau VPN (10.0.0.0/24 est le sous-réseau que nous attribuerons aux clients VPN).-o eth0: Sortie par l'interface eth0.-j MASQUERADE: Réécrit l'IP source pour qu'elle soit l'IP publique du serveur.
Enregistrez et quittez, puis activez et rechargez UFW :
sudo ufw enable
sudo ufw reload
Étape 4 : Installation de WireGuard-UI sur le serveur Ubuntu
Voici maintenant la partie intéressante, la configuration de l'interface web en utilisant WireGuard-UI, qui est une application web propre et simple écrite en Go.
Tout d'abord, créez un répertoire pour WireGuard-UI :
sudo mkdir -p /opt/wireguard-ui
cd /opt/wireguard-ui
Ensuite, téléchargez la dernière version de WireGuard-UI depuis la page des releases de GitHub, mais au moment de la rédaction, la commande wget obtient une version stable récente :
sudo wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz
Une fois téléchargé, extrayez-le et rendez-le exécutable :
sudo tar -xzf wireguard-ui-v0.6.2-linux-amd64.tar.gz
sudo chmod +x wireguard-ui
Avant de démarrer l'interface, créons un service systemd afin qu'il se lance automatiquement au démarrage.
sudo nano /etc/systemd/system/wireguard-ui.service
Collez cette configuration :
[Unit]
Description=WireGuard UI
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Enregistrez et quittez, puis activez et démarrez le service :
sudo systemctl daemon-reload
sudo systemctl enable wireguard-ui
sudo systemctl start wireguard-ui
Vérifiez qu'il fonctionne :
sudo systemctl status wireguard-ui
Étape 5 : Accéder à l'interface Wireguard
Ouvrez votre navigateur web et allez à l'URL suivante, assurez-vous de remplacer YOUR_SERVER_IP par l'adresse IP publique réelle de votre serveur.
http://YOUR_SERVER_IP:5000
Vous verrez une page de connexion, où vous pouvez utiliser les identifiants par défaut suivants :
Username: admin
Password: admin
Important : Changez-les immédiatement après vous être connecté. Cliquez sur votre nom d'utilisateur en haut à droite, puis sur « Paramètres » et mettez à jour votre mot de passe.
Étape 6 : Configuration de votre serveur WireGuard
Une fois que vous êtes connecté, vous serez dirigé vers le tableau de bord de WireGuard-UI. Pour commencer à configurer votre serveur, cliquez sur « Serveur WireGuard » dans la barre latérale gauche et définissez le nom de l'interface sur 10.0.0.1/24 (l'interface WireGuard par défaut), et le port d'écoute sur 51820.
Dans le champ Post Up Script, saisissez :
iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
et dans le champ Post Down Script, entrez :
iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Assurez-vous de remplacer eth0 par le nom réel de votre interface réseau si elle est différente et de définir Address à 10.0.0.1/24, qui sera l'adresse IP interne VPN du serveur.
Lorsque vous cliquez sur Appliquer la configuration, WireGuard créera l'interface wg0, écoutera les connexions VPN sur le port 51820, attribuera à votre serveur son IP VPN et configurera les règles de pare-feu pour acheminer correctement le trafic VPN.
L'interface utilisateur générera également automatiquement les clés privées et publiques de votre serveur. Après avoir appliqué les paramètres, l'interface devrait s'afficher comme Active, indiquant que votre serveur WireGuard est en cours d'exécution.
Étape 7 : Ajouter votre premier client WireGuard
Maintenant, ajoutons un appareil à votre VPN, qui pourrait être votre ordinateur portable, votre téléphone ou tout autre appareil client. Dans la barre latérale gauche, cliquez sur « Clients », puis cliquez sur « Ajouter un nouveau client ».
Donnez au client un nom descriptif tel que « Mon ordinateur portable » ou « iPhone », et saisissez éventuellement un e-mail pour aider à identifier l'appareil plus tard. Cliquez sur « Auto » pour attribuer automatiquement la prochaine adresse IP disponible (probablement 10.0.0.2).
Pour les IP autorisées, saisissez 0.0.0.0/0, ::/0, ce qui garantit que tout le trafic du client est acheminé via le VPN ; si vous voulez seulement accéder au réseau interne du serveur, vous pouvez à la place spécifier ce sous-réseau (par exemple, 10.0.0.0/24).
Une fois que tout est configuré, cliquez sur « Soumettre » et l'interface web générera automatiquement une configuration complète de WireGuard pour ce client, y compris sa propre paire de clés cryptographiques.
Étape 8 : Connecter votre appareil client
Vous devez maintenant transférer la configuration sur votre appareil et WireGuard-UI facilite cela avec des codes QR pour les appareils mobiles et des fichiers de configuration téléchargeables pour les ordinateurs.
Pour les appareils mobiles (téléphone/tablette) :
- Installez l'application WireGuard depuis votre magasin d'applications (elle est disponible à la fois pour iOS et Android).
- Dans l'interface web WireGuard-UI, trouvez votre client nouvellement créé et cliquez sur l'icône du code QR.
- Ouvrez l'application WireGuard sur votre téléphone, appuyez sur le bouton
"+", et sélectionnez “Créer à partir d'un code QR“. - Scannez le code QR affiché dans votre navigateur.
- Donnez un nom à votre connexion et appuyez sur « Créer un tunnel ».
C'est tout ! Basculez l'interrupteur pour vous connecter, et votre appareil mobile route désormais tout son trafic à travers votre serveur VPN.
Pour ordinateur de bureau/ordinateur portable :
- Installez WireGuard depuis wireguard.com/install.
- Dans l'interface WireGuard-UI, cliquez sur l'icône de téléchargement à côté de votre client pour télécharger le fichier
.conf. - Ouvrez l'application WireGuard sur votre ordinateur, cliquez sur “Importer le(s) tunnel(s) depuis un fichier“, et sélectionnez le fichier de configuration téléchargé.
- Cliquez sur « Activer » pour vous connecter.
Étape 9 : Tester votre VPN
Assurons-nous que tout fonctionne correctement. Tout d'abord, pendant que votre VPN est déconnecté, visitez whatismyipaddress.com et prenez note de l'adresse IP affichée.
Ensuite, connectez-vous à votre VPN WireGuard et actualisez la page, votre adresse IP devrait maintenant afficher l’adresse IP publique de votre serveur au lieu de votre adresse originale, confirmant que le trafic est acheminé via le VPN.
Pour vérifier davantage que le DNS fonctionne correctement, vous pouvez exécuter la commande suivante sur votre appareil connecté :
ping google.com
Si vous voyez des réponses, votre VPN dirige le trafic correctement.
Pour voir les connexions actives sur votre serveur, connectez-vous en SSH et exécutez :
sudo wg show
Vous verrez une sortie comme :
interface: wg0
public key: [your server's public key]
private key: (hidden)
listening port: 51820
peer: [client's public key]
endpoint: [client's IP]:random_port
allowed ips: 10.0.0.2/32
latest handshake: 45 seconds ago
transfer: 2.50 MiB received, 15.23 MiB sent
Cela montre que votre client est connecté, quand il a communiqué pour la dernière fois avec le serveur, et combien de données ont été transférées.
Étape 10 : Utilisez HTTPS pour WireGuard-UI
En ce moment, lorsque vous accédez à votre interface Web WireGuard à http://YOUR_SERVER_IP:5000, vos identifiants de connexion et toutes les données de configuration circulent sur Internet en texte clair et toute personne interceptant le trafic entre votre navigateur et le serveur pourrait voir votre mot de passe administrateur et potentiellement détourner votre session.
La solution consiste à placer votre interface web derrière un proxy inverse avec HTTPS activé. Un proxy inverse se situe devant votre application, gère toutes les connexions HTTPS chiffrées provenant des clients, puis transmet les requêtes à votre application via le réseau local où l'interception n'est pas un problème.
Nous allons utiliser Nginx (serveur web haute performance) comme notre proxy inverse et Let’s Encrypt pour obtenir un certificat SSL gratuit afin que vous puissiez accéder à votre interface WireGuard à https://vpn.yourdomain.com au lieu d'une adresse IP avec HTTP.
Installer le serveur Web Nginx
Tout d'abord, vous devez créer un enregistrement DNS pour votre domaine (https://vpn.yourdomain.com) qui pointe vers l'adresse IP de votre serveur, puis installer le serveur web Nginx.
sudo apt update
sudo apt install nginx -y
Après l'installation, vous pouvez visiter http://vpn.votredomaine.com dans votre navigateur et vous verrez la page d'accueil par défaut de Nginx, ce qui signifie que Nginx fonctionne et est accessible depuis Internet.
Installer Certbot pour Let's Encrypt
Ensuite, installez Let’s Encrypt, qui est une autorité de certification gratuite fournissant des certificats SSL et certbot est un outil qui automatise le processus d'obtention et de renouvellement de ces certificats.
sudo apt install certbot python3-certbot-nginx -y
Le paquet python3-certbot-nginx comprend un plugin qui peut configurer automatiquement Nginx pour vous, rendant le processus beaucoup plus simple.
Configurer Nginx en tant que proxy inverse
Maintenant, créons une configuration Nginx qui redirige les requêtes de https://vpn.votredomaine.com vers votre application WireGuard-UI exécutée sur localhost:5000.
Créer un nouveau fichier de configuration.
sudo nano /etc/nginx/sites-available/wireguard-ui
Collez cette configuration (remplacez vpn.yourdomain.com par votre domaine réel) :
server {
listen 80;
listen [::]:80;
server_name vpn.yourdomain.com;
# This will be used by Certbot for the SSL certificate challenge
location /.well-known/acme-challenge/ {
root /var/www/html;
}
# Redirect all other HTTP traffic to HTTPS
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vpn.yourdomain.com;
# SSL certificate paths (Certbot will fill these in)
ssl_certificate /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem;
# Modern SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Security headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# Proxy settings
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
# WebSocket support (if WireGuard-UI uses it)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Forward real client information
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
Activez maintenant cette configuration en créant un lien symbolique :
sudo ln -s /etc/nginx/sites-available/wireguard-ui /etc/nginx/sites-enabled/
Testez votre configuration Nginx pour les erreurs de syntaxe :
sudo nginx -t
Vous devriez voir :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Si vous voyez des erreurs, revenez en arrière et vérifiez votre fichier de configuration pour des fautes de frappe.
Obtenez un certificat SSL
Une fois que tout est correctement configuré, il est maintenant temps d'exécuter la commande certbot qui obtiendra automatiquement un certificat SSL de Let’s Encrypt et configurera Nginx pour l'utiliser.
sudo certbot --nginx -d vpn.yourdomain.com
Le processus entier prend environ 30 secondes, et une fois terminé, vous verrez un message de succès :
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem
Rechargez maintenant Nginx pour tout appliquer :
sudo systemctl reload nginx
Renouvellement automatique du certificat
Les certificats Let's Encrypt ne sont valides que pendant 90 jours, ce qui est intentionnel afin d'encourager le renouvellement régulier et de limiter les dommages potentiels en cas de compromission d'une clé privée.
Heureusement, Certbot configure automatiquement un minuteur de renouvellement lors de son installation, et vous pouvez confirmer que le service de renouvellement est actif en exécutant :
sudo systemctl status certbot.timer
et vous devriez le voir répertorié comme actif (en cours d'exécution), ce minuteur vérifie deux fois par jour et renouvellera automatiquement tout certificat qui est à moins de 30 jours d'expiration.
Pour vérifier que tout fonctionne sans effectuer un renouvellement réel, exécutez :
sudo certbot renew –dry-run
Si le test se termine avec succès, le renouvellement automatique de votre certificat est entièrement configuré, et vous n’aurez pas à vous inquiéter de l’expiration de vos certificats.
Mettez à jour votre pare-feu
Puisque nous accédons maintenant à WireGuard-UI via Nginx sur le port HTTPS standard (443), nous devons autoriser cela dans notre pare-feu et pouvons éventuellement fermer l'accès direct au port 5000.
sudo ufw allow 443/tcp
Optionnellement, si vous voulez empêcher l'accès direct à WireGuard-UI sur le port 5000 (forçant tout le monde à utiliser l'interface HTTPS), vous pouvez supprimer cette règle :
sudo ufw delete allow 5000/tcp
Rechargez le pare-feu :
sudo ufw reload
Étape 11 : Configurer WireGuard-UI pour n'écouter que sur localhost
Puisque Nginx gère désormais toutes les connexions externes, nous devrions configurer WireGuard-UI pour n'accepter que les connexions provenant de la machine locale, ce qui empêche quiconque d'y accéder directement sur le port 5000, même s'ils découvrent que le port est ouvert.
Arrêtez le service WireGuard-UI :
sudo systemctl stop wireguard-ui
Modifiez le fichier de service :
sudo nano /etc/systemd/system/wireguard-ui.service
Modifiez la ligne ExecStart pour ne se lier qu'à localhost :
[Unit]
Description=WireGuard UI
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
Environment="BIND_ADDRESS=127.0.0.1:5000"
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Enregistrez et quittez, puis rechargez systemd et redémarrez le service :
sudo systemctl daemon-reload
sudo systemctl start wireguard-ui
sudo systemctl status wireguard-ui
Enfin, ouvrez votre navigateur et allez à :
https://vpn.yourdomain.com
Vous devriez voir une icône de cadenas dans la barre d'adresse de votre navigateur, vous pouvez cliquer sur l'icône du cadenas pour voir les détails du certificat. Vous verrez qu'il a été émis par Let's Encrypt et qu'il est valable pendant 90 jours.
Résumé
À présent, vous avez déployé avec succès un serveur WireGuard VPN entièrement opérationnel avec une interface de gestion sécurisée basée sur le web. Au lieu de gérer manuellement les clés, les fichiers de configuration et les règles de routage, WireGuard-UI vous offre un tableau de bord simple pour ajouter de nouveaux appareils, générer des codes QR et surveiller les connexions actives.






