VPN WireGuard
Hors DR critique. Gérer les peers WireGuard pour accès distant LAN/DMZ depuis mobile et laptop nomade.
Contexte
WireGuard server: instance wg0 sur OPNsense (10.0.1.1, port UDP 51820), tunnel 10.10.10.0/24. Chaque peer reçoit IP statique dans ce range.
Persistance SOPS: chaque peer ajouté est sauvegardé dans infra/ansible/inventory/secrets/opnsense.yml sous opnsense_wireguard_clients. Survit aux destroy/recreate OPNsense — task opnsense:config les re-pousse auto.
Convention nommage: peer prefix iac- (ASCII strict requis par WG OPNsense, pas d’emoji).
Prérequis
- OPNsense up + WG keys gen (
09-opnsense-configétape 5 smart) - API key OPNsense valide (étape 4 smart)
wireguard-tools+qrencodeinstallés côté admin host:sudo apt install -y wireguard-tools qrencode
Verify: which wg qrencode
Ajouter un peer
task vpn:add-peer NAME=mobile-sacha IP=10.10.10.5
Étapes auto:
- Génère keypair X25519 (privkey + pubkey)
- POST
/api/wireguard/client/addClient→ crée peeriac-mobile-sachaattaché àwg0 - Compose
.conf(Interface privkey + Peer endpoint sta4ck.eu:51820) - Écrit conf + PNG QR dans
~/minfra-output/wg-peers/mobile-sacha.{conf,png} - Persist SOPS via
wg_sops_peer.sh add(privkey + pubkey + IP chiffrés) reconfigureservice WG OPNsense
Verify: ls ~/minfra-output/wg-peers/mobile-sacha.conf
Connecter le mobile
- Install app WireGuard (Android Play Store / iOS App Store)
- Ouvre app → + → Scanner depuis QR code
- Affiche QR PNG:
cat ~/minfra-output/wg-peers/mobile-sacha.png(ou ouvre fichier dans visionneuse) - Scan → tunnel importé
- Active → mobile route via OPNsense → accès LAN+DMZ
Verify: depuis mobile, ouvre https://vision.minfra.in/ → doit charger
Lister peers actifs
KEY=$(sops -d --extract '["opnsense_api_key"]' infra/ansible/inventory/secrets/opnsense.yml)
SEC=$(sops -d --extract '["opnsense_api_secret"]' infra/ansible/inventory/secrets/opnsense.yml)
curl -sk -u "$KEY:$SEC" -X POST -d '{}' https://10.0.1.1/api/wireguard/client/searchClient | jq '.rows[] | {name, tunneladdress}'
Verify: curl -sk -u “$KEY:$SEC” https://10.0.1.1/api/wireguard/general/get | grep enabled
Supprimer un peer
task vpn:delete-peer NAME=mobile-sacha
Retire API OPNsense + retire SOPS (idempotent). Le mobile reste configuré mais ne pourra plus se connecter.
Verify: curl -sk -u “$KEY:$SEC” -X POST -d ’{}’ https://10.0.1.1/api/wireguard/client/searchClient | grep -v “iac-mobile-sacha”
Vérifier état tunnel (côté serveur OPNsense)
ssh -i ~/.ssh/id_ed25519_minfra root@10.0.1.1 'wg show wg0'
Doit lister les peers avec latest handshake récent quand mobile connecté.
Verify: ssh root@10.0.1.1 ‘configctl service list | grep -i wireguard’
Tester depuis 4G
- Désactive WiFi sur mobile
- Active tunnel WireGuard mobile
- Ouvre https://vision.minfra.in/ → doit charger via tunnel
traceroute mariage-as.sta4ck.eumobile → premier hop = 10.10.10.1 (OPNsense)
Verify: depuis 4G+VPN, curl https://vision.minfra.in/ retourne 200
Suite logique
- Authentik OIDC → cookie SSO partagé même cross-VPN
- Split-tunnel config (AllowedIPs limité à 10.0.0.0/16 pour éviter router tout traffic mobile)
Hors périmètre
- WireGuard pre-shared key (psk) supplémentaire (Ed25519 suffit homelab)
- Site-to-site VPN (uniquement mobile/laptop peers)
- 2FA TOTP avant tunnel (Authentik handle ça en couche app)