mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 13:14:42 +02:00
feat(wireguard): accès distant au lab via VPN (Freebox 51820/udp → s01) (#80)
- rôle wireguard : serveur wg0 (10.99.0.0/24) sur storage-01, profils clients générés dans /etc/wireguard/clients/ (fichier .conf / QR code) - gateway : filtrage nftables par pair — full (tout le lab) / portal (uniquement Traefik :80 = portail Guacamole), masquerade VPN→cluster - dnsmasq : bind-dynamic + écoute wg0 → *.lab.local résolu dans le tunnel - pairs initiaux : alkatrazz (full), invite-01 (portal) - vault : clés WireGuard + reprise de l'archive Authentik (remplace #78) - doc : admin/infra/wireguard.md (onboarding pair, pièges, exploitation) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
fbec998c21
commit
bc0e1dd53e
13 changed files with 388 additions and 123 deletions
82
admin/infra/wireguard.md
Normal file
82
admin/infra/wireguard.md
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
# 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/<name>.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/<name>.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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue