Comment installer WireGuard VPN + interface Web sur Ubuntu
Divulgation : Cet article contient des liens d’affiliation. Je peux toucher une commission lorsque vous achetez via ces liens, sans frais supplémentaires pour vous.
Lorsque vous vous connectez au WiFi d'un café ou que vous accédez à Internet depuis un réseau public, vos données transitent par des infrastructures que vous ne contrôlez pas. Toute personne située entre vous et les sites 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. Ainsi, 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 fait ce travail remarquablement bien. Contrairement aux anciennes technologies VPN qui nécessitent des centaines de milliers de lignes de code, WireGuard accomplit la même tâche avec environ 4 000 lignes, ce qui signifie moins de bugs, de meilleures performances et des audits de sécurité plus simples.
Mais voici le truc : bien que WireGuard soit simple en soi, gérer plusieurs clients VPN, générer des fichiers de configuration et garder une trace de 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 WireGuard VPN complet avec une interface web conviviale qui vous permet de tout gérer depuis votre navigateur, comme ajouter de nouveaux appareils, générer des codes QR pour les clients mobiles et surveiller les 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 consiste en des pairs – des appareils qui peuvent communiquer entre eux via des tunnels chiffrés.
Dans notre cas, nous aurons :
- Le Serveur : Votre machine Linux avec une adresse IP publique, qui agit comme le centre névralgique 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 fournit 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 redirige le trafic Internet du client ou permet simplement l'accès aux ressources du réseau local du serveur, selon la configuration que vous choisissez.
Étape 1 : Installer WireGuard sur un serveur Ubuntu
Tout d'abord, assurons-nous que votre système est à jour et dispose des outils nécessaires en utilisant la commande suivante, qui mettra à jour vos listes de paquets et mettra à niveau tout logiciel obsolète.
sudo apt update && sudo apt upgrade -y
Ensuite, installez WireGuard lui-même :
sudo apt install wireguard -y
Puisque WireGuard est intégré dans le 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é empêchant votre serveur d’agir comme un routeur sauf si vous le lui indiquez explicitement, 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 transmettre cette requête depuis 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 modifier 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 la modification 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.
Maintenant, configurons 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 de NAT (Traduction d’adresses 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 via l'interface eth0.-j MASQUERADE: Réécrit l’IP source pour qu’elle devienne 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 un serveur Ubuntu
Voici maintenant la partie intéressante : configurer 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 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 s'exécute 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 accédez à l'URL suivante, en vous assurant 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 pourrez 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 connecté, vous serez dirigé vers le tableau de bord de l'interface 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 Script Post Up, saisissez :
iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
et dans le champ Post Down Script, saisissez :
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 to 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 du pare-feu pour transférer correctement le trafic VPN.
L'interface 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 apparaître comme Active, ce qui indique que votre serveur WireGuard est opérationnel.
Étape 7 : Ajouter votre premier client WireGuard
Maintenant, ajoutons un appareil à votre VPN, qui peut ê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 passe par le VPN ; si vous souhaitez uniquement 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 WireGuard complète 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 grâce à 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 boutique d'applications (elle est disponible à la fois pour iOS et Android).
- Dans l'interface web WireGuard-UI, trouvez votre client récemment 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 utilise désormais votre serveur VPN pour tout son trafic.
Pour ordinateur de bureau/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 un ou plusieurs tunnels 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, tandis que votre VPN est déconnecté, rendez-vous sur whatismyipaddress.com et notez l'adresse IP affichée.
Ensuite, connectez-vous à votre VPN WireGuard et actualisez la page, votre adresse IP devrait désormais afficher l’adresse IP publique de votre serveur au lieu de votre adresse initiale, ce qui confirme que le trafic passe par 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 achemine correctement le trafic.
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 : Utiliser 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 éventuellement 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 des clients, puis transmet les requêtes à votre application sur le réseau local où l'interception n'est pas un problème.
Nous utiliserons Nginx (serveur web haute performance) comme proxy inverse et Let’s Encrypt pour obtenir un certificat SSL gratuit afin que vous puissiez accéder à votre interface WireGuard sur https://vpn.yourdomain.com au lieu d'une adresse IP en 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.yourdomain.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 inclut 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 s'exécutant sur localhost:5000.
Créer un nouveau fichier de configuration.
sudo nano /etc/nginx/sites-available/wireguard-ui
Collez cette configuration (remplacez vpn.votredomaine.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 détecter 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, retournez vérifier votre fichier de configuration pour des fautes de frappe.
Obtenir 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
L'ensemble du processus 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 valables que pendant 90 jours, ce qui est intentionnel afin d’encourager un renouvellement régulier et de limiter les dommages potentiels si une clé privée venait à être compromise.
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 dont l'expiration est imminente dans les 30 jours.
Pour vérifier que tout fonctionne sans effectuer de 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 ceci dans notre pare-feu et il est optionnel de fermer l'accès direct au port 5000.
sudo ufw allow 443/tcp
Optionnellement, si vous souhaitez 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 depuis la machine locale, ce qui empêche quiconque d'y accéder directement sur le port 5000, même s'il découvre 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 qu'elle se lie uniquement à 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.






