Sécuriser un VPS en cloud public avec Wireguard

Sécuriser un VPS en cloud public avec Wireguard

Sommaire

Cet article explique pas à pas comment protéger un VPS hébergé sur un cloud public en mettant en place un tunnel VPN chiffré via WireGuard. Après avoir présenté les prérequis matériels et logiciels, nous verrons comment installer et configurer WireGuard sur le serveur, sécuriser les flux réseau avec UFW, puis établir la connexion côté client. L’objectif : restreindre l’accès aux services critiques du VPS uniquement aux machines connectées via le VPN, réduisant ainsi considérablement la surface d’attaque et les risques d’intrusion.

Pré-requis

  • Un VPS en cloud public avec une console KVM (au cas ou on foire la conf)

    Vous pouvez en louer une chez Hostinger via ce lien de parrainage (promo -20%): VPS 8go

  • Une distribution Linux (je me base sur Ubuntu)

Installation de Wireguard

L’installation de WireGuard est simple et rapide sur Ubuntu, car le paquet est directement disponible dans les dépôts officiels.
Cette étape installe les binaires nécessaires pour faire fonctionner le VPN, ainsi que les modules noyau requis pour gérer le chiffrement et les interfaces réseau virtuelles.

sudo apt install wireguard

Configuration de Wireguard sur le VPS

La configuration commence par la génération d’une paire de clés : une clé privée et une clé publique.
La clé privée reste strictement sur le serveur, tandis que la clé publique sera partagée avec les pairs pour établir le tunnel chiffré.
Ces clés sont indispensables pour authentifier et sécuriser les échanges entre les machines.

wg genkey | tee private_key | wg pubkey > public_key

WireGuard permet aussi de générer une clé pré-partagée (pre-shared key) en plus des clés publiques et privées.
Cette clé ajoute une couche de chiffrement symétrique supplémentaire par-dessus le chiffrement asymétrique existant, rendant plus difficile toute tentative d’attaque par force brute ou interception.
Bien qu’elle ne soit pas obligatoire, son utilisation est fortement conseillée pour renforcer la sécurité.

wg genpsk > preshared_key

Passons à la configuration du VPN.
Le fichier de configuration se trouve dans /etc/wireguard/wg0.conf

sudo vim /etc/wireguard/wg0.conf

Ici l’objectif est minimal, on doit simplement encapsuler le VPS dans le tunnel VPN, la configuration est donc extrêmement simple.

NETWORK_INTERFACE est trouvée en faisant ip a et en cherchant l’interface qui correspond à l’adresse IP du VPS qui est exposée sur Internet.

Le mode MASQUERADE permet de faire basculer les requêtes arrivant par NETWORK_INTERFACE vers l’interface VPN.

PUBLIC_KEY_POSTE_TRAVAIL est crée en réalisant les mêmes étapes que précédemment sur le poste de travail (sauf la clé partagée évidemment, qui est … partagée)

[Interface]
Address = 10.0.0.1/24
SaveConfig = false
ListenPort = {{PORT}}
PrivateKey = {{PRIVATE_KEY_VPS}}
PostUp = iptables -t nat -A POSTROUTING -o {{NETWORK_INTERFACE}} -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o {{NETWORK_INTERFACE}} -j MASQUERADE
MTU = 1420

# Poste de travail
[Peer]
PublicKey = {{PUBLIC_KEY_POSTE_TRAVAIL}}}}
PresharedKey = {{PRESHARED_KEY}}
AllowedIPs = 10.0.0.100/32

Address: Adresse dans le réseau VPN

SaveConfig: false, pour ne pas que la configuration soit écrasée.

ListenPort: Port de wireguard (defaut à 51280)

PrivateKey: La clé privée générée précédemment qui permettra au VPS de chiffrer ses communications

PostUp: Commande jouée lorsque l’on lance le service Wireguard.

PostDown: Commande jouée lorsque l’on éteint le service Wireguard.

MTU: Taille max d’un paquet avant fragmentation (défaut à 1420)

Peer: Déclaration d’un pair (interlocuteur si on veut) dans le VPN. Un [peer] par machine qui va se connecter.

PublicKey: Clé publique du pair (obtenue précédemment sur le poste de travail)

PresharedKey: Clé partagée entre le pair et le VPS, elle peut être différente pour chaque pair.

AllowedIPs: Permet de router les IPs dans cette liste vers le pair. Cela peut être uniquement l’IP du pair, mais cela peut aussi être avec d’autres configurations possibles, le réseau local du pair en 192.168.0.0, ou tout le traffic de la machine avec 0.0.0.0. Ici on mettra l’IP VPN du poste de travail.

On sauvegarde le fichier puis on redémarre le service Wireguard pour appliquer les modifications.

sudo systemctl enable wg-quick@wg0
sudo systemctl restart wg-quick@wg0

Configuration de ufw

UFW (Uncomplicated Firewall) est un pare-feu simple à configurer pour gérer les règles d’accès réseau sur Linux.
Par défaut, il bloque tout le trafic entrant, ce qui empêche le VPN de fonctionner.
Nous allons donc autoriser spécifiquement le port {{PORT}} en UDP, le protocole utilisé par WireGuard, puis recharger les règles pour les appliquer immédiatement.

On va également autoriser le trafic SSH sur le port 22 par le tunnel VPN.

sudo ufw allow {{PORT}}/udp
sudo ufw allow in on wg0 to any port 22 proto tcp
sudo ufw reload

Configuration de Wireguard sur le poste de travail

Pour alimenter la configuration du VPS, les actions suivantes ont déjà été réalisées sur le poste de travail:

  • installation
  • génération de clés publiques et privées

Créons maintenant la configuration du tunnel VPN de l’autre coté.

sudo vim /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.100/24
SaveConfig = false
ListenPort = {{PORT}}
PrivateKey = {{PRIVATE_KEY_POSTE_TRAVAIL}}
MTU = 1420

# VPS
[Peer]
PublicKey = {{PUBLIC_KEY_VPS}}}}
PresharedKey = {{PRESHARED_KEY}}
AllowedIPs = 10.0.0.1/32
Endpoint = {{IP_VPS}}:{{PORT}}
PersistentKeepalive = 25

Endpoint: Adresse externe du VPN sur le VPS, pour le joindre.

PersistentKeepalive: Intervalle de temps en secondes entre deux paquets de keepalive. Pour maintenir la connexion en cas d’inactivité.

Test de connexion

Depuis le poste de travail (ici sous Linux), on va lancer le service Wireguard.

sudo wg-quick up /etc/wireguard/wg0.conf

Puis on va pinger le VPS via le tunnel VPN.

ping -c 3 10.0.0.1

Depuis le VPS, on va pinger le poste de travail via le tunnel VPN.

ping -c 3 10.0.0.100

On peut vérifier l’état du tunnel WireGuard avec la commande suivante.

sudo wg show

Autre clients Wireguard

Il existe d’autres clients wireguard sous Windows, Mac, iOS et Android. Ils fonctionnent de la même manière, bien souvent, il faut via l’interface utilisateur charger le fichier de configuration que nous venons de créer. Et c’est tout.

Troubleshooting

  1. Vérifier que le port UDP est ouvert sur le VPS

  2. Vérifier que le port UDP est ouvert coté hébergeur (firewall)

  3. Vérifier que Wireguard est bien géré par le VPS: lsmod | grep wireguard

  4. Vérifier que sysctl net.ipv4.ip_forward renvoie 1

  5. Vérifier que l’interface réseau du VPS choisie est bien celle par défaut: ip route | grep default

  6. Vérifier si le traffic arrive au moins jusqu’au VPS pour s’il est bloqué par le pare-feu de l’hébergeur.

    Sur le VPS:

    tcpdump -i {{NETWORK_INTERFACE}} udp port {{PORT}}
    

    Sur le poste de travail:

    echo "test" | nc -uv {{IP_VPS}} {{PORT}}
    

    Si une ligne apparait coté VPS c’est que le traffic arrive au moins jusqu’au VPS, et donc le problème est sur la configuration de wireguard, pas sur le réseau.

  7. Vérifier d’éventuelles coquilles dans la copie des clés publiques, privées et partagées. (Ca arrive même aux meilleurs…)

  8. Vérifier que le port {{PORT}} est ouvert sur le VPS. ss -ulpn | grep {{PORT}}

  9. Vérifier que iptables est installé sur le VPS, et actif iptables -L

  10. Vérifier que le mode MASQUERADE est bien présent lorsque wireguard est allumé iptables -t nat -L -n -v | grep MASQUERADE

  11. Vérifier que Wireguard est bien allumé coté poste de travail car si la configuration est incorrecte, il se déconnecte automatiquement.

Conclusion

Vous avez mis en place un tunnel WireGuard minimaliste mais robuste, puis restreint l’accès aux services critiques du VPS à travers l’interface VPN.

Ce modèle:

  • réduit drastiquement la surface d’exposition sur Internet,
  • reste performant grâce à WireGuard et sa configuration épurée.

Étapes suivantes possibles:

  • Ajouter d’autres pairs (10.0.0.3/32, 10.0.0.4/32, etc.).
  • Étendre au double-stack IPv6 si nécessaire.
  • Automatiser les déploiements via Ansible/Terraform et gabarits de configuration.
  • Pour des clients mobiles, générer des profils dédiés et, si besoin, des QR codes adaptés.

Avec ce socle, votre VPS n’expose plus que le port UDP du VPN; tout le reste passe par le tunnel chiffré, ce qui élève significativement le niveau de sécurité opérationnelle.

Partager :