Post

WireGuard : VPN self-hosted en 10 minutes

WireGuard : VPN self-hosted en 10 minutes

OpenVPN c’est bien. WireGuard c’est mieux : 4000 lignes de code vs 100,000, des performances proches du natif, et une config qui tient dans un fichier. Voici comment déployer ton propre VPN en 10 minutes.

Pourquoi WireGuard

 WireGuardOpenVPNIPSec
Lignes de code~4,000~100,000~400,000
ProtocoleUDP uniquementTCP/UDPUDP
ChiffrementChaCha20, Curve25519ConfigurableConfigurable
VitesseProche du natif~30% perte~20% perte
Config1 fichierCertificats + configComplexe
Handshake1-RTTMulti-RTTMulti-RTT
Kernel moduleOui (depuis 5.6)UserspaceKernel

WireGuard est dans le noyau Linux depuis la version 5.6. Pas de daemon à gérer, pas de certificats à renouveller.

Installation

1
2
3
4
5
# Debian/Ubuntu
sudo apt install wireguard -y

# Vérifier le module kernel
lsmod | grep wireguard

Architecture

1
2
3
4
5
6
7
8
9
10
┌──────────────┐         ┌──────────────┐
│  Client      │  UDP    │  Serveur     │
│  (laptop)    │◄───────►│  (VPS)       │
│  10.0.0.2    │  51820  │  10.0.0.1    │
└──────────────┘         └──────┬───────┘
                                │
                        ┌───────▼───────┐
                        │  Internet     │
                        │  (via NAT)    │
                        └───────────────┘

Étape 1 — Serveur

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Générer les clés
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key

# Config serveur
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
PrivateKey = <SERVER_PRIVATE_KEY>
Address = 10.0.0.1/24
ListenPort = 51820
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

# Client 1
[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
EOF

# Activer le forwarding
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# Démarrer
sudo systemctl enable --now wg-quick@wg0

Étape 2 — Client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Générer les clés
wg genkey | tee client_private.key | wg pubkey > client_public.key

# Config client
cat > wg0.conf << 'EOF'
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <SERVER_IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF

# Connecter
sudo wg-quick up ./wg0

# Vérifier
wg show
curl ifconfig.me  # devrait afficher l'IP du serveur

Split tunneling

Pour ne passer que le trafic du LAN de l’entreprise (pas tout Internet) :

1
2
3
4
5
6
# Client config — AllowedIPs restreint
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <SERVER_IP>:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24  # uniquement ces réseaux
PersistentKeepalive = 25

Multi-clients

1
2
3
4
5
6
7
8
9
10
# Ajouter un client : générer clés + ajouter [Peer] sur le serveur
wg genkey | tee client2_private.key | wg pubkey > client2_public.key

# Ajouter dans /etc/wireguard/wg0.conf
[Peer]
PublicKey = <CLIENT2_PUBLIC_KEY>
AllowedIPs = 10.0.0.3/32

# Recharger sans couper la connexion existante
sudo wg set wg0 peer <CLIENT2_PUBLIC_KEY> allowed-ips 10.0.0.3/32

Sécurité

1
2
3
4
5
6
7
8
9
10
11
12
13
# Restreindre les permissions
chmod 600 /etc/wireguard/*.key /etc/wireguard/wg0.conf

# Firewall — n'autoriser que le port WireGuard
sudo ufw allow 51820/udp
sudo ufw allow in on wg0 from 10.0.0.0/24

# Vérifier les connexions actives
wg show

# Renouveler les clés (rotation périodique)
# WireGuard utilise un key rotation automatique (Noise Protocol)
# mais les clés statiques doivent être changées manuellement si compromis

Monitoring

1
2
3
4
5
6
7
8
9
10
11
# Status des peers
wg show

# Transfer de données par peer
wg show wg0 transfer

# Ping interne
ping 10.0.0.1

# Logs
journalctl -u wg-quick@wg0 -f

Cas d’usage terrain

  • Accès SSH distant : SSH sur le serveur via WireGuard au lieu d’exposer le port 22
  • Accès aux services self-hosted : Grafana, Gitea, etc. accessibles uniquement via VPN
  • Site-to-site : connecter deux réseaux LAN distants
  • Mobile : config Android/iOS avec QR code

Références :

Ton infrastructure n’a pas de VPN ? Contacte-moi pour le mettre en place.

This post is licensed under CC BY 4.0 by the author.