VPN / Sécurité

📚 Installation WireGuard VPN Serveur Client Linux — Guide Complet

Guide complet WireGuard : génération de clés, configuration serveur, profils clients, NAT, VPN site-to-site, QR code pour smartphone et diagnostic.

WireGuardVPNUDP 51820Clés asymétriquesNATSite-to-siteQR code mobileDebian

Pourquoi WireGuard ?

CritèreOpenVPNWireGuard
Code source~600 000 lignes~4 000 lignes (audit facile)
PerformanceBonneExcellente (dans le noyau Linux)
ConfigurationComplexe (PKI, CA, certs)Simple (paire de clés)
ReconnexionLente (~30s)Quasi-instantanée
ProtocoleSSL/TLS (TCP ou UDP)UDP uniquement (WireGuard)
Port par défaut1194 UDP51820 UDP
Intégration noyauNon (userspace)Oui (Linux ≥ 5.6)
Cas d'usage idéalPKI existante, révocationAccès distant simple et rapide
ℹ️
WireGuard fonctionne avec des paires de clés asymétriques (similaire à SSH). Chaque pair (serveur ou client) génère sa propre paire clé privée/publique. La clé publique est échangée entre les pairs — aucune CA ni certificat nécessaire.

Étape 1 — Installation

01-install-wg.sh
#!/bin/bash

# ── Debian 12 / Ubuntu 22.04+ ────────────────────────────────
apt update
apt install -y wireguard wireguard-tools

# Vérifier l'installation
wg --version
modinfo wireguard   # Vérifier que le module noyau est disponible

echo "[OK] WireGuard installé"

Étape 2 — Générer les clés serveur

02-gen-server-keys.sh
#!/bin/bash

# Créer le répertoire de configuration
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
cd /etc/wireguard

# Générer la paire de clés du SERVEUR
wg genkey | tee server_private.key | wg pubkey > server_public.key
chmod 600 server_private.key

# Afficher les clés (à noter)
echo "Clé privée serveur : $(cat server_private.key)"
echo "Clé publique serveur : $(cat server_public.key)"

# Générer une clé pré-partagée (couche de sécurité supplémentaire)
wg genpsk > preshared.key
chmod 600 preshared.key

echo "[OK] Clés serveur générées dans /etc/wireguard/"

Étape 3 — Configuration du serveur

/etc/wireguard/wg0.conf — Serveur
# ════════════════════════════════════════════
#  CONFIGURATION SERVEUR WIREGUARD
#  Fichier : /etc/wireguard/wg0.conf
# ════════════════════════════════════════════

[Interface]
# Clé privée du serveur
PrivateKey = <COLLER_SERVER_PRIVATE_KEY_ICI>

# Adresse IP du serveur dans le tunnel VPN
Address = 10.0.0.1/24

# Port d'écoute WireGuard
ListenPort = 51820

# ── Activation du NAT au démarrage ───────────────────────────
# Remplacer eth0 par votre interface WAN
PostUp   = iptables -A FORWARD -i %i -j ACCEPT
PostUp   = iptables -A FORWARD -o %i -j ACCEPT
PostUp   = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# ════════════════════════════════════════════
#  CLIENT 1 — Jean Dupont (laptop)
# ════════════════════════════════════════════
[Peer]
# Clé publique du client 1
PublicKey = <COLLER_CLIENT1_PUBLIC_KEY_ICI>

# Clé pré-partagée (optionnel mais recommandé)
PresharedKey = <COLLER_PRESHARED_KEY_ICI>

# IP autorisée pour ce client dans le tunnel
AllowedIPs = 10.0.0.2/32

# ════════════════════════════════════════════
#  CLIENT 2 — Marie Martin (smartphone)
# ════════════════════════════════════════════
[Peer]
PublicKey = <COLLER_CLIENT2_PUBLIC_KEY_ICI>
PresharedKey = <COLLER_PRESHARED_KEY_ICI>
AllowedIPs = 10.0.0.3/32

# ════════════════════════════════════════════
#  CLIENT 3 — Site distant (routeur)
# ════════════════════════════════════════════
[Peer]
PublicKey = <COLLER_SITE_DISTANT_PUBLIC_KEY_ICI>
AllowedIPs = 10.0.0.4/32, 192.168.2.0/24   # IP tunnel + LAN distant

Étape 4 — Activation du routage et démarrage

04-start-server.sh
#!/bin/bash

# ── Activer le routage IP (indispensable pour NAT) ────────────
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# ── Protéger la clé privée ────────────────────────────────────
chmod 600 /etc/wireguard/wg0.conf

# ── Démarrer WireGuard ────────────────────────────────────────
wg-quick up wg0

# ── Activer au démarrage du système ──────────────────────────
systemctl enable wg-quick@wg0

# ── Ouvrir le port dans UFW ───────────────────────────────────
ufw allow 51820/udp

# ── Vérifier l'état ───────────────────────────────────────────
wg show

echo "[OK] WireGuard démarré sur UDP 51820"

Étape 5 — Générer les clés client et le fichier de config

05-gen-client.sh
#!/bin/bash
# Générer une configuration client WireGuard

CLIENT_NAME=${1:-"client-jean"}
CLIENT_IP=${2:-"10.0.0.2"}
SERVER_IP="vpn.entreprise.fr"   # IP publique ou FQDN du serveur
OUTPUT_DIR="/root/wg-clients"
mkdir -p $OUTPUT_DIR

# Générer les clés du client
CLIENT_PRIVATE=$(wg genkey)
CLIENT_PUBLIC=$(echo $CLIENT_PRIVATE | wg pubkey)
PRESHARED=$(cat /etc/wireguard/preshared.key)
SERVER_PUBLIC=$(cat /etc/wireguard/server_public.key)

echo "Clé publique client ($CLIENT_NAME) : $CLIENT_PUBLIC"
echo "→ Ajouter dans /etc/wireguard/wg0.conf section [Peer]"
echo ""

# Créer le fichier de configuration client
cat > "$OUTPUT_DIR/${CLIENT_NAME}.conf" << CLIENTEOF
[Interface]
# Clé privée du client
PrivateKey = $CLIENT_PRIVATE

# Adresse IP du client dans le tunnel
Address = ${CLIENT_IP}/24

# DNS via le tunnel (serveur DNS interne ou public)
DNS = 192.168.1.10, 8.8.8.8

[Peer]
# Clé publique du serveur WireGuard
PublicKey = $SERVER_PUBLIC

# Clé pré-partagée (sécurité supplémentaire)
PresharedKey = $PRESHARED

# Adresse et port du serveur VPN
Endpoint = ${SERVER_IP}:51820

# Tout le trafic via le VPN (0.0.0.0/0)
# Pour accès au LAN seulement : AllowedIPs = 192.168.1.0/24
AllowedIPs = 0.0.0.0/0, ::/0

# Maintien de la connexion (NAT keepalive)
PersistentKeepalive = 25
CLIENTEOF

echo "[OK] Config client générée : $OUTPUT_DIR/${CLIENT_NAME}.conf"
echo "     Pour ajouter le client au serveur :"
echo "     wg set wg0 peer $CLIENT_PUBLIC allowed-ips ${CLIENT_IP}/32"
echo "     wg-quick save wg0"

Étape 6 — Ajouter un client à chaud (sans redémarrage)

06-add-peer-hot.sh
# Ajouter un nouveau pair sans arrêter WireGuard

CLIENT_PUBKEY="<COLLER_LA_CLE_PUBLIQUE_DU_CLIENT>"
CLIENT_IP="10.0.0.4"
PRESHARED=$(cat /etc/wireguard/preshared.key)

# Ajouter le pair dynamiquement
wg set wg0 peer $CLIENT_PUBKEY     preshared-key /etc/wireguard/preshared.key     allowed-ips ${CLIENT_IP}/32

# Sauvegarder la configuration (ajoute le [Peer] dans wg0.conf)
wg-quick save wg0

# Vérifier
wg show wg0

VPN site-to-site — Deux bureaux connectés

site-to-site.txt
Scénario : Bureau A (192.168.1.0/24) ←→ Bureau B (192.168.2.0/24)

BUREAU A — Serveur WireGuard (IP publique : 203.0.113.1)
/etc/wireguard/wg0.conf :
  [Interface]
  PrivateKey = <bureau_a_private>
  Address    = 10.10.0.1/30
  ListenPort = 51820
  PostUp     = ip route add 192.168.2.0/24 dev wg0
  PostDown   = ip route del 192.168.2.0/24 dev wg0

  [Peer]
  PublicKey  = <bureau_b_public>
  Endpoint   = 198.51.100.2:51820      # IP publique Bureau B
  AllowedIPs = 10.10.0.2/32, 192.168.2.0/24

BUREAU B — Client WireGuard
/etc/wireguard/wg0.conf :
  [Interface]
  PrivateKey = <bureau_b_private>
  Address    = 10.10.0.2/30

  [Peer]
  PublicKey           = <bureau_a_public>
  Endpoint            = 203.0.113.1:51820   # IP publique Bureau A
  AllowedIPs          = 10.10.0.1/32, 192.168.1.0/24
  PersistentKeepalive = 25

Générer un QR code pour smartphone

qrcode-mobile.sh
# Installer qrencode
apt install -y qrencode

# Afficher le QR code dans le terminal (scanner avec l'app WireGuard)
qrencode -t ansiutf8 < /root/wg-clients/client-jean.conf

# Ou générer en image PNG
qrencode -t png -o /root/wg-clients/client-jean.png     < /root/wg-clients/client-jean.conf

echo "[OK] QR code généré — scanner avec l'application WireGuard mobile"

Commandes de diagnostic

CommandeDescription
wg showÉtat complet : interfaces, pairs, trafic, dernière prise de contact
wg show wg0 peersListe des pairs avec leur clé publique
wg show wg0 latest-handshakesDernière connexion de chaque pair (0 = jamais connecté)
wg show wg0 transferTrafic envoyé/reçu par pair
wg-quick up wg0Démarrer l'interface WireGuard
wg-quick down wg0Arrêter l'interface WireGuard
wg-quick save wg0Sauvegarder la config runtime dans wg0.conf
ip addr show wg0Vérifier l'adresse IP du tunnel
ping 10.0.0.2Tester la connectivité avec un client VPN
tcpdump -i wg0Capturer le trafic déchiffré dans le tunnel
💡
Application mobile : WireGuard est disponible sur iOS et Android. Pour connecter un smartphone, générer le fichier .conf client, créer un QR code avec qrencode, et scanner depuis l'application WireGuard. La connexion s'établit en moins d'une seconde.
⚠️
Sécurité des clés : La clé privée WireGuard ne doit JAMAIS transiter en clair (email, chat). Transférer les fichiers .conf via SCP/SFTP chiffré, ou générer les clés directement sur la machine cliente et n'échanger que la clé publique.
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google