# WireGuard — accès distant au lab VPN **WireGuard** sur storage-01 (rôle Ansible `wireguard`) : permet d'accéder au portail Guacamole (et au lab entier pour les admins) **depuis Internet**, sans exposer la moindre page web en clair. Un seul port ouvert : **`51820/udp`**. ``` Client (WireGuard app) ──kaya.freeboxos.fr:51820/udp──▶ Freebox ──▶ s01 (wg0 10.99.0.1) │ nftables filtre par pair ▼ portail.lab.local (invités) ou tout le LAN cluster (admins) ``` ## Réseau - Tunnel : `10.99.0.0/24` (s01 = `10.99.0.1`) - **Split tunnel** : seuls `192.168.10.0/24` + `10.99.0.0/24` passent dans le VPN — le reste du trafic du client sort par sa connexion normale - DNS du tunnel : dnsmasq s01 (`10.99.0.1`) → `*.lab.local` résolu comme à la maison - **Redirection Freebox requise** : `51820/udp` → `funk-s01` (ports début/fin identiques) ## Classes d'accès (filtrage nftables, rôle `gateway`) | `access` | Droits | Usage | |---|---|---| | `full` | Tout le LAN cluster + SSH s01 | Admin (toi) | | `portal` | **Uniquement** `portail.lab.local` (Traefik :80) + DNS | Invités | Pairs actuels : `alkatrazz` (full, `10.99.0.10`), `invite-01` (portal, `10.99.0.50`). ## Distribuer un profil client Les profils sont générés dans **`/etc/wireguard/clients/.conf`** sur s01 : ```bash # fichier à envoyer (contient la clé privée du client — canal privé !) scp root@192.168.1.200:/etc/wireguard/clients/invite-01.conf . # ou QR code à scanner avec l'app mobile WireGuard ssh root@192.168.1.200 "dnf install -y qrencode && qrencode -t ansiutf8 < /etc/wireguard/clients/invite-01.conf" ``` Côté client : app WireGuard (Windows/macOS/Android/iOS) → importer le `.conf` ou scanner le QR → activer → ouvrir `http://portail.lab.local`. ## Ajouter un pair 1. Générer une paire de clés (poste admin, `wg` non requis) : ```bash openssl genpkey -algorithm X25519 -out /tmp/peer.pem openssl pkey -in /tmp/peer.pem -outform DER | tail -c 32 | base64 # clé PRIVÉE openssl pkey -in /tmp/peer.pem -pubout -outform DER | tail -c 32 | base64 # clé publique rm /tmp/peer.pem ``` 2. Clé privée → vault (`make vault-edit`) dans `vault_wireguard_peer_private_keys` 3. Entrée dans `wireguard_peers` (`ansible/host_vars/storage-01/vars.yml`) : name, ip libre dans `10.99.0.0/24`, public_key, access 4. `ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags wireguard,gateway` 5. Distribuer `/etc/wireguard/clients/.conf` **Retirer un pair** : supprimer des deux endroits (host_vars + vault) → re-apply idem. ## Exploitation / debug ```bash ssh root@192.168.1.200 wg show # handshakes, transfert par pair systemctl status wg-quick@wg0 # état du service journalctl -u wg-quick@wg0 -n 20 ``` ## Pièges 1. **Pas de handshake** (`wg show` vide côté serveur) : vérifier la redirection Freebox `51820/udp → funk-s01` et que le client utilise bien `kaya.freeboxos.fr:51820`. 2. **Connecté mais `portail.lab.local` ne résout pas** : le DNS du tunnel doit être `10.99.0.1` (champ DNS du profil). dnsmasq doit être en `bind-dynamic` avec `interface=wg0` (fait par le rôle `dnsmasq`) — sinon il ignore wg0. 3. **Invité qui « voit » d'autres services** : impossible par design — le filtrage est dans nftables (forward), pas dans Guacamole. Vérifier `access: portal` dans host_vars. 4. Les clés privées clients sont dans le **vault** ET dans `/etc/wireguard/clients/` sur s01 — ne jamais les committer en clair, ni les envoyer par un canal public.