network
rocky
tutos
vpn
wireguard
WireGuard VPN sur Rocky Linux 9
Installation et configuration de WireGuard sur Rocky Linux 9.
Composant
Version
Rocky Linux
9.x
WireGuard
Kernel intégré
Durée estimée : 30 minutes
Avantages de WireGuard
Critère
WireGuard
OpenVPN
Performance
Excellente
Bonne
Complexité
Simple
Complexe
Code
~4000 lignes
~100000 lignes
Cryptographie
Moderne (ChaCha20)
Configurable
Audit
Facile
Difficile
Architecture
┌─────────────────┐ ┌─────────────────┐
│ Client VPN │ │ Serveur VPN │
│ 10.0.0.2/32 │◄────────►│ 10.0.0.1/32 │
│ wg0 │ :51820 │ wg0 │
└─────────────────┘ └─────────────────┘
│
┌───────▼───────┐
│ LAN interne │
│ 192.168.1.0/24│
└───────────────┘
1. Installation
# WireGuard est dans le kernel Linux 5.6+
dnf install -y wireguard-tools
# Vérifier
modprobe wireguard
lsmod | grep wireguard
2. Configuration Serveur
Générer les clés
cd /etc/wireguard
umask 077
# Clé privée serveur
wg genkey | tee server_private.key | wg pubkey > server_public.key
# Afficher pour utilisation
cat server_private.key
cat server_public.key
Configuration serveur
vim /etc/wireguard/wg0.conf
[Interface]
# Adresse VPN du serveur
Address = 10.0.0.1/24
# Port d'écoute
ListenPort = 51820
# Clé privée du serveur
PrivateKey = <CONTENU_DE_server_private.key>
# NAT pour accès Internet via VPN
PostUp = firewall-cmd --add-masquerade
PostUp = firewall-cmd --add-port=51820/udp
PostDown = firewall-cmd --remove-masquerade
PostDown = firewall-cmd --remove-port=51820/udp
# OU avec iptables
# 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
# Clients (ajoutés après)
[Peer]
# Client 1
PublicKey = <CLE_PUBLIQUE_CLIENT1>
AllowedIPs = 10.0.0.2/32
[Peer]
# Client 2
PublicKey = <CLE_PUBLIQUE_CLIENT2>
AllowedIPs = 10.0.0.3/32
Activer le forwarding IP
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-wireguard.conf
sysctl -p /etc/sysctl.d/99-wireguard.conf
Démarrer WireGuard
systemctl enable --now wg-quick@wg0
systemctl status wg-quick@wg0
# Vérifier
wg show
ip a show wg0
3. Configuration Client (Linux)
Générer les clés client
cd /etc/wireguard
umask 077
wg genkey | tee client_private.key | wg pubkey > client_public.key
Configuration client
vim /etc/wireguard/wg0.conf
[Interface]
# Adresse VPN du client
Address = 10.0.0.2/32
# Clé privée du client
PrivateKey = <CONTENU_DE_client_private.key>
# DNS via VPN (optionnel)
DNS = 10.0.0.1
[Peer]
# Serveur VPN
PublicKey = <CLE_PUBLIQUE_SERVEUR>
# Endpoint (IP publique du serveur)
Endpoint = vpn.example.com:51820
# Tout le trafic via VPN
AllowedIPs = 0.0.0.0/0
# Ou uniquement le réseau VPN + LAN distant
# AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
# Keepalive (important si client derrière NAT)
PersistentKeepalive = 25
Connecter
wg-quick up wg0
wg show
# Tester
ping 10 .0.0.1
4. Client Windows
Télécharger WireGuard : https://www.wireguard.com/install/
Créer un nouveau tunnel
Coller la configuration :
[Interface]
PrivateKey = <CLE_PRIVEE_CLIENT>
Address = 10.0.0.3/32
DNS = 10.0.0.1
[Peer]
PublicKey = <CLE_PUBLIQUE_SERVEUR>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Activer le tunnel
5. Client Mobile (Android/iOS)
Installer l'app WireGuard
Scanner un QR code ou importer la config
Générer un QR code
dnf install -y qrencode
qrencode -t ansiutf8 < /etc/wireguard/client.conf
6. Script d'ajout de client
#!/bin/bash
# add-wg-client.sh
CLIENT_NAME = $1
CLIENT_IP = $2
if [ -z " $CLIENT_NAME " ] || [ -z " $CLIENT_IP " ] ; then
echo "Usage: $0 <client_name> <client_ip>"
echo "Example: $0 laptop 10.0.0.5"
exit 1
fi
cd /etc/wireguard
# Générer les clés
wg genkey | tee ${ CLIENT_NAME } _private.key | wg pubkey > ${ CLIENT_NAME } _public.key
CLIENT_PRIVATE = $( cat ${ CLIENT_NAME } _private.key)
CLIENT_PUBLIC = $( cat ${ CLIENT_NAME } _public.key)
SERVER_PUBLIC = $( cat server_public.key)
# Créer la config client
cat > ${ CLIENT_NAME } .conf << EOF
[Interface]
PrivateKey = $CLIENT_PRIVATE
Address = ${CLIENT_IP}/32
DNS = 10.0.0.1
[Peer]
PublicKey = $SERVER_PUBLIC
Endpoint = $(curl -s ifconfig.me):51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
# Ajouter le peer au serveur
cat >> wg0.conf << EOF
[Peer]
# $CLIENT_NAME
PublicKey = $CLIENT_PUBLIC
AllowedIPs = ${CLIENT_IP}/32
EOF
# Recharger
wg syncconf wg0 <( wg-quick strip wg0)
echo "Configuration client créée: ${ CLIENT_NAME } .conf"
qrencode -t ansiutf8 < ${ CLIENT_NAME } .conf
7. Commandes de gestion
# Status
wg show
wg show wg0
# Activer/Désactiver
wg-quick up wg0
wg-quick down wg0
# Recharger sans déconnecter
wg syncconf wg0 <( wg-quick strip wg0)
# Ajouter un peer à chaud
wg set wg0 peer <PUBLIC_KEY> allowed-ips 10 .0.0.5/32
# Supprimer un peer
wg set wg0 peer <PUBLIC_KEY> remove
8. Firewall
# Port WireGuard
firewall-cmd --permanent --add-port= 51820 /udp
# NAT/Masquerade
firewall-cmd --permanent --add-masquerade
# Forward
firewall-cmd --permanent --add-rich-rule= 'rule family="ipv4" source address="10.0.0.0/24" masquerade'
firewall-cmd --reload
9. Accès au LAN interne
Pour permettre aux clients VPN d'accéder au LAN :
# Sur le serveur, dans PostUp
PostUp = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
PostUp = iptables -A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Sur le client, dans AllowedIPs
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
Vérification
# Interface
ip a show wg0
# Connexions
wg show
# Ping
ping 10 .0.0.2
# Trafic
wg show wg0 transfer
Dépannage
Problème
Solution
Handshake failed
Vérifier clés, endpoint, port
No route
Vérifier AllowedIPs
Pas d'Internet
Vérifier NAT, ip_forward
# Debug
journalctl -u wg-quick@wg0 -f
dmesg | grep wireguard
tcpdump -i eth0 port 51820
Changelog
Date
Modification
2024-12
Création initiale