wireguardvpnlinux
MDstable
NoteSnippetChecklistPlaybook
WireGuard — VPN moderne
Installer et configurer WireGuard : serveur, clients, routage et split-tunnel
snippetintermediate 2025-05-14 6 min read
wireguardvpnlinuxtunnelpeerwgsplit-tunnel
Concepts
WireGuard VPN moderne minimaliste haute performance kernel module depuis Linux 56Protocole UDP uniquement port 51820 par dfautCryptographie Curve25519 ECDH ChaCha20 Poly1305 BLAKE2s pas de ngociationModle peer-to-peer pas de notion serveur/client stricte au niveau protocolaireCls chaque interface a une paire cl prive/publique asymtriqueAvantages vs IPsec/OpenVPNConfiguration ultra-simple 50 lignes de configPerformances suprieures code kernel minimalRoaming natif le tunnel suit lIP du clientPas de certificates/CA grer PSK par dfautLimitationUDP uniquement peut tre bloqu par certains firewallsPas de NAT traversal automatique PersistentKeepalive requis derrire NATLogs minimes pas daudit trail natif
Installation
bash
# Debian/Ubuntu (kernel 5.6+ inclut WireGuard nativement)apt update && apt install wireguard wireguard-tools# RHEL/CentOS/Rocky 8+dnf install epel-releasednf install wireguard-tools# Arch Linuxpacman -S wireguard-tools# Vérifier le module kernellsmod | grep wireguardmodprobe wireguard
Génération des clés
bash
# Méthode recommandée — générer clé privée + publique en une commandewg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key# Afficher les cléscat /etc/wireguard/server_private.key # GARDÉE SECRÈTEcat /etc/wireguard/server_public.key # distribuée aux clients# Protéger les permissionschmod 600 /etc/wireguard/server_private.keychmod 600 /etc/wireguard/# Pour chaque clientwg genkey | tee /etc/wireguard/client1_private.key | wg pubkey > /etc/wireguard/client1_public.key# Preshared Key (optionnel — couche de sécurité supplémentaire par peer)wg genpsk > /etc/wireguard/client1_psk.key
Configuration serveur — /etc/wireguard/wg0.conf
bash
Variables
{{VPN_SERVER_IP}}
{{SERVER_PRIVATE_KEY}}
{{DNS_IP}}
{{CLIENT1_PUBLIC_KEY}}
{{CLIENT1_PSK}}
{{VPN_CLIENT1_IP}}
{{CLIENT2_PUBLIC_KEY}}
{{CLIENT2_PSK}}
{{VPN_CLIENT2_IP}}
{{SITE_B_PUBLIC_KEY}}
{{VPN_SITE_B_IP}}
{{SITE_B_LAN}}
{{SITE_B_PREFIX}}
{{SITE_B_WAN_IP}}
# /etc/wireguard/wg0.confInterface# Adresse IP du serveur dans le tunnel VPNAddress {{VPN_SERVER_IP}}/24# Port d'écoute UDPListenPort 51820# Clé privée du serveurPrivateKey {{SERVER_PRIVATE_KEY}}# DNS (optionnel — pour les clients full-tunnel)# DNS = {{DNS_IP}}# NAT : permettre aux clients VPN d'accéder à Internet via le serveur# Remplacer eth0 par l'interface WAN réellePostUp iptables -A FORWARD -i i -j ACCEPT; iptables -A FORWARD -o i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown iptables -D FORWARD -i i -j ACCEPT; iptables -D FORWARD -o i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE# ── Client 1 ──────────────────────────────────────────────Peer# Clé publique du clientPublicKey {{CLIENT1_PUBLIC_KEY}}# Preshared key (optionnel mais recommandé)PresharedKey {{CLIENT1_PSK}}# IP autorisée pour ce peer dans le VPNAllowedIPs {{VPN_CLIENT1_IP}}/32# ── Client 2 ──────────────────────────────────────────────PeerPublicKey {{CLIENT2_PUBLIC_KEY}}PresharedKey {{CLIENT2_PSK}}AllowedIPs {{VPN_CLIENT2_IP}}/32# ── Site-to-Site (LAN distant) ────────────────────────────PeerPublicKey {{SITE_B_PUBLIC_KEY}}# AllowedIPs inclut le LAN distant completAllowedIPs {{VPN_SITE_B_IP}}/32 {{SITE_B_LAN}}{{SITE_B_PREFIX}}Endpoint {{SITE_B_WAN_IP}}51820PersistentKeepalive 25
Configuration client — Full Tunnel (tout le trafic via VPN)
bash
Variables
{{VPN_CLIENT_IP}}
{{CLIENT_PRIVATE_KEY}}
{{DNS_IP}}
{{SERVER_PUBLIC_KEY}}
{{CLIENT_PSK}}
{{SERVER_WAN_IP}}
# /etc/wireguard/wg0.conf sur le clientInterfaceAddress {{VPN_CLIENT_IP}}/32PrivateKey {{CLIENT_PRIVATE_KEY}}DNS {{DNS_IP}} # optionnel — évite les DNS leaksPeerPublicKey {{SERVER_PUBLIC_KEY}}PresharedKey {{CLIENT_PSK}}Endpoint {{SERVER_WAN_IP}}51820# Full tunnel : TOUT le trafic passe par le VPNAllowedIPs 0000/0 /0# OBLIGATOIRE si le client est derrière NAT (box domestique, 4G...)PersistentKeepalive 25
Configuration client — Split Tunnel (uniquement le réseau privé)
bash
Variables
{{VPN_CLIENT_IP}}
{{CLIENT_PRIVATE_KEY}}
{{SERVER_PUBLIC_KEY}}
{{SERVER_WAN_IP}}
{{CORP_LAN_1}}
{{PREFIX_1}}
{{CORP_LAN_2}}
{{PREFIX_2}}
{{VPN_SUBNET}}
# /etc/wireguard/wg0.confInterfaceAddress {{VPN_CLIENT_IP}}/32PrivateKey {{CLIENT_PRIVATE_KEY}}PeerPublicKey {{SERVER_PUBLIC_KEY}}Endpoint {{SERVER_WAN_IP}}51820# Split tunnel : seul le trafic vers les réseaux privés passe par le VPNAllowedIPs {{CORP_LAN_1}}{{PREFIX_1}} {{CORP_LAN_2}}{{PREFIX_2}} {{VPN_SUBNET}}/24PersistentKeepalive 25
Démarrage et activation
bash
# Activer l'IP forwarding sur le serveur (persistant)echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confecho "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.confsysctl -p# Démarrer l'interface manuellementwg-quick up wg0# Arrêter l'interfacewg-quick down wg0# Activer au démarrage (systemd)systemctl enable wg-quick@wg0systemctl start wg-quick@wg0systemctl status wg-quick@wg0# Restart après modification de configwg-quick down wg0 && wg-quick up wg0# OU (recharge sans couper les connexions existantes)wg syncconf wg0 <wg-quick strip wg0
Gestion dynamique des peers
bash
Variables
{{CLIENT_PUBLIC_KEY}}
{{VPN_CLIENT_IP}}
{{CLIENT_WAN_IP}}
# Ajouter un peer à chaud (sans restart)wg set wg0 peer {{CLIENT_PUBLIC_KEY}} allowed-ips {{VPN_CLIENT_IP}}/32# Ajouter avec endpoint et keepalivewg set wg0 peer {{CLIENT_PUBLIC_KEY}}allowed-ips {{VPN_CLIENT_IP}}/32endpoint {{CLIENT_WAN_IP}}51820persistent-keepalive 25# Supprimer un peerwg set wg0 peer {{CLIENT_PUBLIC_KEY}} remove# Sauvegarder la config actuelle (inclut les peers ajoutés dynamiquement)wg showconf wg0 > /etc/wireguard/wg0.conf
Vérifications
bash
Variables
{{VPN_SERVER_IP}}
{{VPN_CLIENT_IP}}
{{CORP_HOST}}
# État de toutes les interfaces WireGuardwg show# Exemple de sortie :# interface: wg0# public key: abc123...# private key: (hidden)# listening port: 51820## peer: xyz789...# endpoint: 203.0.113.5:51820# allowed ips: 10.0.0.2/32# latest handshake: 1 minute, 30 seconds ago# transfer: 1.23 MiB received, 456 KiB sent# Configuration complète (avec clé privée en clair — attention)wg showconf wg0# Interface réseauip addr show wg0ip route show dev wg0# Vérifier la connectivité VPNping {{VPN_SERVER_IP}}ping {{VPN_CLIENT_IP}}# Tracer le chemintraceroute {{CORP_HOST}}
DNS Leak Prevention
bash
Variables
{{VPN_DNS_IP}}
{{WAN_IFACE}}
# Dans la config client, utiliser DNS du serveur VPNInterfaceDNS {{VPN_DNS_IP}}# Sur le serveur VPN — Pi-hole ou Unbound local# Vérifier les leaks sur : https://dnsleaktest.com# Pour IPv6 — désactiver si non utilisé (évite les leaks IPv6)InterfacePreUp ip6tables -A OUTPUT -o {{WAN_IFACE}} -j DROP # bloquer IPv6 sortant hors VPN
Génération QR code (mobile)
bash
# Générer un QR code pour importer la config sur mobileapt install qrencode# Depuis un fichier config clientqrencode -t ansiutf8 < /etc/wireguard/client1.conf# Afficher dans le terminalqrencode -t UTF8 < /etc/wireguard/client1.conf
Exemple script — Générer un nouveau client
bash
Variables
{{VPN_DNS_IP}}
{{SERVER_WAN_IP}}
#!/bin/bashCLIENT_NAME1VPN_CLIENT_IP2 # ex: 10.8.0.XWG_SERVER_CONF"/etc/wireguard/wg0.conf"# Générer les clés clientCLIENT_PRIVwg genkeyCLIENT_PUBecho "$CLIENT_PRIV" | wg pubkeyCLIENT_PSKwg genpsk# Afficher la config clientcat <<EOFInterfacePrivateKey $CLIENT_PRIVAddress $VPN_CLIENT_IP/32DNS {{VPN_DNS_IP}}PeerPublicKey cat /etc/wireguard/server_public.keyPresharedKey $CLIENT_PSKEndpoint {{SERVER_WAN_IP}}51820AllowedIPs 0000/0 /0PersistentKeepalive 25EOF# Ajouter le peer côté serveurwg set wg0 peer "$CLIENT_PUB" preshared-key <echo "$CLIENT_PSK" allowed-ips "$VPN_CLIENT_IP/32"echo "" >> $WG_SERVER_CONFecho "[Peer] # $CLIENT_NAME" >> $WG_SERVER_CONFecho "PublicKey = $CLIENT_PUB" >> $WG_SERVER_CONFecho "PresharedKey = $CLIENT_PSK" >> $WG_SERVER_CONFecho "AllowedIPs = $VPN_CLIENT_IP/32" >> $WG_SERVER_CONF
💡 Tip —
WireGuard ne maintient pas de connexion persistante — il n'envoie des paquets que lorsqu'il y a du trafic. Un client derrière NAT (box domestique, 4G, etc.) verra son mappage NAT expirer après quelques dizaines de secondes d'inactivité, rendant le tunnel injoignable depuis le serveur. Configurer PersistentKeepalive = 25 sur le client envoie un paquet keepalive UDP toutes les 25 secondes pour maintenir le mappage NAT actif.
OPS·BRAIN v1.027 notes · Networklocal