mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 12:44:41 +02:00
feat(wireguard): accès distant au lab via VPN (Freebox 51820/udp → s01)
- 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
5ecaadd100
commit
78ab7ae311
13 changed files with 388 additions and 109 deletions
|
|
@ -22,6 +22,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||||
- ✅ Ghostfolio opérationnel — `ghostfolio.lab.local`, namespace `ai`, suivi de portefeuille (PostgreSQL s01 + Redis in-cluster)
|
- ✅ Ghostfolio opérationnel — `ghostfolio.lab.local`, namespace `ai`, suivi de portefeuille (PostgreSQL s01 + Redis in-cluster)
|
||||||
- ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work`
|
- ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work`
|
||||||
- 🆕 Annuaire + portail consoles (2026-07-06) — **Authentik** (`auth.lab.local`, IdP OIDC) + **Guacamole** (`portail.lab.local`, consoles SSH web vers s01/g01 via user `console` sans sudo), namespace `auth`. Config initiale (admin Authentik, provider OIDC, connexions) : voir `admin/k8s/auth-portal.md`
|
- 🆕 Annuaire + portail consoles (2026-07-06) — **Authentik** (`auth.lab.local`, IdP OIDC) + **Guacamole** (`portail.lab.local`, consoles SSH web vers s01/g01 via user `console` sans sudo), namespace `auth`. Config initiale (admin Authentik, provider OIDC, connexions) : voir `admin/k8s/auth-portal.md`
|
||||||
|
- 🆕 WireGuard (2026-07-06) — accès distant au lab via `kaya.freeboxos.fr:51820/udp` (Freebox → s01), pairs `full` (admin) / `portal` (invités = portail Guacamole seul, filtrage nftables). Voir `admin/infra/wireguard.md`
|
||||||
- ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis
|
- ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis
|
||||||
|
|
||||||
Journal de progression : `PROGRESS.md` → `progress/YYYY-MM-DD.md`
|
Journal de progression : `PROGRESS.md` → `progress/YYYY-MM-DD.md`
|
||||||
|
|
@ -91,7 +92,7 @@ Les tags correspondent aux noms de rôles. Tous les rôles sont idempotents.
|
||||||
|
|
||||||
### Rôles — storage-01
|
### Rôles — storage-01
|
||||||
|
|
||||||
`hermes_user`, `common`, `gateway` (nftables + NAT), `dnsmasq`, `nfs_server`, `qdrant`, `postgresql`, `minio` (⚠️ rôle vide, service non déployé), `litellm`, `hermes_agent`, `rag`, `node_exporter`, `alertmanager_webhook`, `postfix_relay`, `hermes_auto_improve` (worker doc Hermes + trigger server :9095), `hermes_exec` (exécuteur d'actions vocales `hermes -z --yolo` derrière jeton, :9096), `console_user` (user `console` sans sudo pour le portail Guacamole)
|
`hermes_user`, `common`, `gateway` (nftables + NAT), `dnsmasq`, `nfs_server`, `qdrant`, `postgresql`, `minio` (⚠️ rôle vide, service non déployé), `litellm`, `hermes_agent`, `rag`, `node_exporter`, `alertmanager_webhook`, `postfix_relay`, `hermes_auto_improve` (worker doc Hermes + trigger server :9095), `hermes_exec` (exécuteur d'actions vocales `hermes -z --yolo` derrière jeton, :9096), `console_user` (user `console` sans sudo pour le portail Guacamole), `wireguard` (accès distant `51820/udp`, pairs full/portal — voir `admin/infra/wireguard.md`)
|
||||||
|
|
||||||
### Rôles — gpu-01
|
### Rôles — gpu-01
|
||||||
|
|
||||||
|
|
@ -123,6 +124,8 @@ Variables chiffrées dans `ansible/group_vars/all/vault.yml` :
|
||||||
- `vault_hermes_exec_token` — jeton d'auth de `hermes-exec` (actions vocales via Hermes ; même valeur dans le secret k8s `stt-server-secrets/hermes-exec-token`)
|
- `vault_hermes_exec_token` — jeton d'auth de `hermes-exec` (actions vocales via Hermes ; même valeur dans le secret k8s `stt-server-secrets/hermes-exec-token`)
|
||||||
- `vault_pg_authentik_password`, `vault_pg_guacamole_password` — bases PG du portail (mêmes valeurs dans les secrets k8s `auth/authentik-secret` et `auth/guacamole-secret`)
|
- `vault_pg_authentik_password`, `vault_pg_guacamole_password` — bases PG du portail (mêmes valeurs dans les secrets k8s `auth/authentik-secret` et `auth/guacamole-secret`)
|
||||||
- `vault_console_ssh_private_key` — clé privée SSH des connexions Guacamole (user `console` sur s01/g01)
|
- `vault_console_ssh_private_key` — clé privée SSH des connexions Guacamole (user `console` sur s01/g01)
|
||||||
|
- `vault_authentik_secret_key`, `vault_authentik_redis_password` — copies de sûreté des valeurs du secret k8s `auth/authentik-secret`
|
||||||
|
- `vault_wireguard_server_private_key`, `vault_wireguard_peer_private_keys` — clés WireGuard (serveur + dict par pair)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
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.
|
||||||
|
|
@ -1,102 +1,132 @@
|
||||||
$ANSIBLE_VAULT;1.1;AES256
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
63626530633434376333636639326132353064366166363136306366656434626262353435396430
|
61306339643263663766346630346361326334356330616562393134366139663764623130646534
|
||||||
3563386431623536653366333461376263643232393964330a313832333139643136356636396334
|
3237353162366637656164663538393563643835623632630a653666363536393731656663636631
|
||||||
38313365386166626264353664343533663130353466316535323663636433333962336534623963
|
32313834396237636632666565363934366230656233663430636331323637326133303036626231
|
||||||
6463646663353730640a303939646534663939356432396535386534653235636161333132663434
|
3562383638306337380a306635376533343431663833363537636139323862643838343731616236
|
||||||
37653365643537626538303336316637656539366636633331323264626336393539393264393264
|
66663439636562656139353934323162336530373931383635356634353761623765613933366436
|
||||||
66306363336434383064333565613933393439333133623364366361643434666363333437643662
|
62313364613736353639363339326334333131393934373932303665643938313338343238386665
|
||||||
34363538633236623361363065303135383732383530333962323365386232623039386566353730
|
64333165306536386466333838613132303361303533386335343030393663396331623064303539
|
||||||
30386237623333616531373630613736313961633936623934326636366531373337653365663039
|
61306235663032623066313861323837303638306532646639313637363534663231306231343761
|
||||||
65613466356466643438643937363961303137303534626432656435396531306235646661633634
|
36636664383433613763313139383565346262323163393262383561663366386334333064656338
|
||||||
64653361366430396534306233333139623632393563353638303730393935303830616264386133
|
35653232643430313635313964353234326465346435323530323639653361363061643966333666
|
||||||
61626166646665326430636461653663333639633336653237383764633138356165333066386361
|
37303862653861343664333332346461626266623763633730316132306332393832626433663261
|
||||||
37626538366236383362633032333834343566383135376430393635363830373135376334336236
|
33613664633839396662363162663030373936396534376334633364373236626233333965626236
|
||||||
32643263386337383632616630376133353337653033336463613832646435336563326332306231
|
34326261636438643039376363666630366238396134613063633634623337663039643666336466
|
||||||
33636639343632643966633031353063353735346431356166333838656636656134323166656361
|
33633264303566393765643564383539343933383334393130653964616265366630373863383332
|
||||||
62323337313062393633613237646463346561393465663062663232343937386235333430346633
|
64633731353531363531346466343533373437393562636663613933646434633535316232313062
|
||||||
34666532663365613665653735646638643765613366663638373030313534373237343331623264
|
64346231326538303733663631666634336230653861646561373362636139646663326661663637
|
||||||
63393738333634343435646565616563663863373865373761373336386433623166353638346436
|
64356239343862366562666664373234353761343430343330366436366663386463346164636135
|
||||||
39393830623333366639363262616437393838303634633037393466323734303637643539666536
|
63393862393562313232383836336536666361616332356131316438313861326365373163333635
|
||||||
35303665333864393730646639323532656635623163636138386639333535346339376365656235
|
65353233333665623432343463623364643964306239616633353637316336633865623030646162
|
||||||
63613264343631353034343465326632623633363930373866323663333236633031366630626364
|
39633965636661616431333739363036666536623439636139653962353630343435326639333630
|
||||||
36623835383463636632346330303439343262333932656534313261653961646462643563663638
|
64356466613962343463653733653436336363383964336131623266323661396638613234346365
|
||||||
37643764373039643534303338326335393866616435626261386463323364373565633939343632
|
35323464393137383862613564613264303135643736636438323935666633353737323062663266
|
||||||
39626163613639303930393330363232366461333134653831663736643237663530376137373266
|
38353164303137353734356530643834386134623663383530363037346431663464646230616234
|
||||||
62616539326335366138306136336432633931303637653137313761626261643866323764613064
|
38616235633739633939396634373539373634643235623265623533663563343932623636656431
|
||||||
62373738313732643639373737663439313837663334323665353030366239393732613865303837
|
38363731333039363835343938326536363138653337366236646163636638623838363066323937
|
||||||
34653537393739366538306339633237333565633866383730396664643132316662306138376666
|
37333037353937366531373763326637653839633037383237663132666262616364356335646638
|
||||||
30343139653538653431343938613531313138313733373962613432646434653635643765623538
|
64663036353339353637626635343435303932336237383962393036653632316565666165326136
|
||||||
66653932646464663166636535663666353764376136616334626463353033376434316130356638
|
37613566336363656264623730316465383835643361393631616638376463356435626662633334
|
||||||
63303264623461323737643363643062303237613665366161643933316161343235376131396162
|
61653662333633313730626538333766363466626530303062616338313936656437303261316235
|
||||||
36363538363138633333653634303734656232353461366131643635353662643732356538306434
|
38363764636632663936313730613738643930613562643664643963613930333132323364616166
|
||||||
65383365396439663963353239663730313339663361323730613834326432643738653632656463
|
64356437613938313062343066326234666366323364393362616435616337643334343730616561
|
||||||
33633961623633666361643834366662386266343836303565306666626238363661303563303365
|
30333332343935663833313933633631656336653166373034656461363561373434313465386637
|
||||||
33623531343763636334363432356537366566323362316335626366656330616235626538336263
|
32613435316131383638366661326535303865643062323464393865343635333866313939396532
|
||||||
36343736356566323966353166633662613531633835366536356366373136663730326236616266
|
39396638303462343162613233613834623635383064316635376331363139396536623362383435
|
||||||
38343436376666613835646463306662333561356330303961383934366235356631303565616663
|
38323066666234623231383433386366326466653837633763396463373865616438666263393931
|
||||||
33376236316263373734343635383361356361336366396265663336306337343965643063613861
|
63636531343133313930306464396530353765333038346564336165623161393964636337303930
|
||||||
32306431613338356131613562313732643765643731613838323566333231323761383161623237
|
33373230653035353933633863653036626431316236633730633630373737303734353231316638
|
||||||
38343235316239613338616639343665326639656463303435653732663963326434343930613661
|
38633536663265333766313636383835323636386434643939613436313038653838656335353731
|
||||||
34316334666563643133636264643739666337356431336261363833363561373034633834643031
|
35643132613062303130653132366364646334616231376464383866363033333638346139663935
|
||||||
32373538643037626466306364326235366363653539613330306665303630633031386361386431
|
39656337313638356462373631636135323135373963616566363866333230353736373662356564
|
||||||
30363434386336613134346365383138616136643638306333646164333737643932326233323033
|
62373631346139303063633236623438373533353431646462396432383837646239373537643064
|
||||||
61363065636331326432373162646235346133373139326636646331626465646238383966373963
|
37646138383234323638303932326632383161306333623437643363363736633763303439636562
|
||||||
61363533373764306431386661346332356333613866313331653966386633326230346131623737
|
38336463376230616132333731616238323934623137333939613332313264373938613163393638
|
||||||
63323937386338313531343064343539353631393738366232303534303038383137303033383138
|
36353864373630626464656435623633363331313538376533386566663333636164613063323534
|
||||||
63633639633935613564343933393164663233376561356334646466353030636531326534623864
|
34366238656637376462623230383965363661653938653932663130666264666466373062393730
|
||||||
35656335386231636466323366323532363839646332343339353763626630326333393361393365
|
64616531633464393335393931346266356365653037303432336632623762666638623338363963
|
||||||
66326234616434623535623832346230383162363065303436353036306133633534633031373136
|
32646261363939623762363865333062346336346234363832303463366333333736653664336436
|
||||||
36626137383531366531366137356230616239313734343438336332636563616637653733613265
|
37373965656334633933633630326139386438306535333938653734346133613165386664656530
|
||||||
32386463323435343438336231373330323663353334613364313531343737383532303766303666
|
62613765396536343735613330313637653466663237653139623336663934383362626630646139
|
||||||
64323365326239323739623436363666326366363434306631366435383332363938313039363063
|
65376135626330353262643536346236393531663531373439383363353631303065396538343837
|
||||||
39373739613766333261636332663366366135313363356237616266383434353536663061313634
|
61656336633237393663653833376461353430363766373963376332383235626364323766633737
|
||||||
38646266393565656331393030383439613235656666376361623333373031343262616461633034
|
61376564353537376236626436303738663530363865633331303433333539306433303662313966
|
||||||
31336437653362326362316364316536326336613937393365303331663466653238316262626334
|
62663830333734383939643662336362393564393733326438356436343037626264636338653261
|
||||||
37353061393231313931333633353530633834626263663161653761653233623936653339396162
|
32313837653566353364383635353534663765626333396561656134376338633834396135373030
|
||||||
34386362363232313033643134623536333132333666326135316535323237346333393063326262
|
38383833633263636537656465323539373362393234366238316663353061353635353536643035
|
||||||
66313563613865303530346433363862353637343434643537303933646338376539363164316439
|
63313964313634343564613763313936356430306637353564323734303230643932643733333762
|
||||||
62363936666334353766653533366139306538323037633766306361373062626266663163313764
|
34653063653535666331373864643938643838623961383533386630323431363336613633346532
|
||||||
32653736656235363130343939613131666533326163363664353966356634333663336565313231
|
37333439353538356264616630383431333238303637323235633966393066383331623465613037
|
||||||
37643566613930646131633635393636663064306533613930353735326139396634643731306331
|
36376433376536313335306232326435626361336232653237336436323936323663646337306263
|
||||||
34346432383337323336313037653931366435373263656261393630366662656134623531653330
|
61336261636566336563633633353833643763323132383865373039383765353232343066353566
|
||||||
30656665393835653434323665316138613561616466656638376233323766623936303061626335
|
35626161626633646235343733363333626161316635643366346437326539396135356233383566
|
||||||
31613365633362356164646265386637643061653132346436353634386633323566323165383162
|
36623464343966336434313934666263653030656135383766366636376161326633336435303661
|
||||||
61386437386163613534643762646334303032613661656365626564656466323734656436356366
|
38306362623030346530376639343162626637656437646266333665643639336434356636633534
|
||||||
64386436656631303766313663373962613736316530363734393763323166633132633630373331
|
36376337616161613130376132306630636230393264333261666235353438646433313633616431
|
||||||
62383630336334636165363331346632636232613832626636326661613561303763313830383061
|
33653163313763323965323336666630373465646538396539303065623163313565663864343733
|
||||||
38383732393063626338353963373132363133316562666136613964633861386636636436646434
|
38393438383632616665333332386432313465646230663566393139333761623336633136656436
|
||||||
31383138636161343333636466353732376664626363653135326339623862373563396534383663
|
33376562636264376134383535386366326262656137646361306265613532343133396135333663
|
||||||
37356461323563363333626530626432353737616431323563653764613535353131323038636264
|
61613462326662633038363537356137633131393736656338376539633831666331623963386361
|
||||||
63646536393462323538663530323739666266376333316331386666336531353539626562356166
|
66396537356135333639323663336165663430356665323137653137666264616666366333313236
|
||||||
30663137376432633434323131653939306238326362636238383766333666633434313635653132
|
38373337333833343866373537303366656235366534346262346666613137303534393836306366
|
||||||
30666463363632643432383337356633323137313934643761393733653233643530386134636130
|
37323262343730336137653665343634363931303335333032646631643036633933326463353338
|
||||||
36303833623661393631323339663263623032663531653162326534393163333835323936363531
|
31376638383564333639363238643863343665363637343161336435343165383738306264306435
|
||||||
32346639663730663038616234303330386236373662356661323365343536396136343737376330
|
64306638376266613163613633366561393337613935316536323862376136396162643463393837
|
||||||
61303061393133303231343039616632663633666464616134656462363934386465633561393035
|
34396338656564303966653434393733303935326636323562336531643266373762643039363664
|
||||||
64303338373838343438353236386332366433366664646163343931383463373934633831343365
|
65623964336434616663643962303739623839313066626139623037333163666137376562613230
|
||||||
37383064366238623366356330613237343562383662363437336265313065303531313335346566
|
32366132346139613232343039363263663965363730373334356363383336636561636363373061
|
||||||
37363065356538633830626637363161663937623236626437656438623736663336643164313436
|
31333033306433623030636332626264363835626330383265343937353566343065666636306135
|
||||||
35353933613265363138356335316465336137616537313264303838653362343661336464393431
|
36373033373066363666616636366130383130333964613039366238353633636661313233353330
|
||||||
66373238613534643837383063366438323139666530363736383366666664623434366164323238
|
61663137616431303633393462386262636332656164383934623162643235616536356337303265
|
||||||
63626461623033366463616339623863363136643764353962333835333762393038626130306262
|
66633235396431373336366364303165363261663132306432393931616463646130633437363132
|
||||||
39656238653863346366383434333961643239643939356630366462643138643362633433653765
|
38343738303434633138383336366661393131386362613634653435373633663431636536373631
|
||||||
32393332326333383737376263636165323834313034663666623131323237363262323562366433
|
66346465633365303934396233363030343633366566343334626230343361393139386464393735
|
||||||
64363138663964396563356337666361643732333237353165383532616339633137653566623464
|
65663031323964663233363837643930643865356334653165356139633838356361613533363262
|
||||||
34656331303334373937336331303863643962306231663436646266376130623530343464626536
|
32343861326437646363663834356330343132396161353764353330633865376464356462316432
|
||||||
39383836383762663666656132306331373365346561333735343561313764313431316236626365
|
31343635323232636132303838333538343063643462316263376264323663323435636133623733
|
||||||
62376231303733383931666562336336303636353236663333363066666636666533363761343430
|
33313034623566643138663136643735616563613865643731636465333537326464313266343262
|
||||||
65653436396237666236626638393061636631343134383131393438333264393364346133666436
|
31306435306434373537646131316362333836633563653063633131623065393238366330396539
|
||||||
65623264393166393830653032643661323030633137663339363330303533633339336232623535
|
34353638353732613237633238643032616538383939353061323561653065376365303538376562
|
||||||
33356264653432663761316530313538663536633238326238633864313338386334343365336335
|
34636632626362326562356666373934333931333631636136376436653266656333626138343364
|
||||||
62613462363130613938353631666438653164303763643963326162656332376265663965336537
|
62643066363066346133313362353962363134613239386334666433343265613262656463663862
|
||||||
66303232663037383035373664393635613932363232383664613330353665613638626261303033
|
35313035643963353166383835353135633862633137373862663766363838306134623735333234
|
||||||
63396238373961663635363730333762313135366237383532626338666230663665373863623030
|
36636435363765333230396337393239393065666261336335636436623164346237376237333133
|
||||||
36393766313562613033613564306235363637653966356135613230643839616537373963636431
|
38396137616233396664613539646135373266363661626230613263343135663661653134386638
|
||||||
34306263353636383531386133386462386539663637353338323665653134323733623462336164
|
64626666323762353937663562363434393961323562626230316266636630646331623136336164
|
||||||
38613431386362373637313731313265623537633232323034623730346230333339666432316538
|
36653237663239373338303963353065356531636438643638323133366537663565393637333937
|
||||||
61386235393564353030633864396166343833646564613330326234613963643366323737646134
|
62353835373964613066623137353631343035326466376362633764363733653335363730623138
|
||||||
66373638343361396363373436313739316164313164393038363132306130616436313366656433
|
64343130653932393962383732623038623535353831666166313135316330386561333762363566
|
||||||
35613234643865313266333134333863346133333539313636306463656537376661363064343731
|
62353337653331353561346461353261333635313533353932323631656362356135346539316239
|
||||||
62613237366234323835346466326439373165666135653338373635646235333936643435366564
|
31386138646134396564366264346662313165303931663664393136386565656533313031373236
|
||||||
65376264336161343665373330333966383836653539343164306666376364623438653832613232
|
38303736643133313464636435396632323938633430653462386236333163633064393339613635
|
||||||
65363039326130363938373738363536333332656331343566633663323061393932
|
37373763663939663239356535306339303365643136326237636331386135623663636238376235
|
||||||
|
39383732613538313362646430356166306465343264623432393535396132653737373262326630
|
||||||
|
65313239386661633439346236353266653736303733306538623135663464333130396431656334
|
||||||
|
38383534623763373134623162396333356235316639373935333339613437373135376463643036
|
||||||
|
35316662393765386137353334393465633964363763663036626339356164366566356161663332
|
||||||
|
38313466623337343361353932646137616465363763643033356439626132326264386364633839
|
||||||
|
36653163383733366535643866313237386632383137386666666661326637626436346136373135
|
||||||
|
63666466383836633334656133346137663961343939653433663463323732323762396139643137
|
||||||
|
62363339346338316631663937353763343938333561333861353335366633326664653663376535
|
||||||
|
33626337363466383833303162376334656266316662373666626630353365663037386131633363
|
||||||
|
66393166643533396663303834353032666361636566646235643064373064396636663363363564
|
||||||
|
37353662626166316132333066373537356166306138333538643465356238366363666434303833
|
||||||
|
64366361626163323431396533623936346332393962636363643862363765366633623839343665
|
||||||
|
65643935383631303138623939656634613334313331323362323037336436316465663961356261
|
||||||
|
31306134643539323635663539396564393135376130373238663439333938306332663539646166
|
||||||
|
32636238396134326134353636323030333864363263386162356364636331363766386338396638
|
||||||
|
65353861643939376166633033346262623239383431643066383132356661313463333262303064
|
||||||
|
63626264633961313062636362313030626164306434393165623064666266313130313931613237
|
||||||
|
35303266623231376636366364383264396163613234393836333465306531643066363033323235
|
||||||
|
62353730323266363364326437343335383566333532343538313434626263373061393461633933
|
||||||
|
33343432313333303536373163393861643639383235303130386332353266626634343666613862
|
||||||
|
30366662303931333932343236663736333965636436343633373435633361653139396232303437
|
||||||
|
36313061333835613838353138666635396661333166663033306365633933313961323233623932
|
||||||
|
64643130376364346337313838663935626661336137376663613236333262336466303866393663
|
||||||
|
36653362396262363266343261633235323735363863343166306236633036633639343034616635
|
||||||
|
63356463353365643063623736646664373031663936316664383338313764623935336662376364
|
||||||
|
38376366663161626530393634336133663162383535353934363035626638626464643465373935
|
||||||
|
61313334306665613334663733363537333336346164376131313231626566353566623462396636
|
||||||
|
61346362396534353737613365623730333530626561316663396466353433353237366630393538
|
||||||
|
31326132373664316665333336323134613736646561633064336333303932333432326264613830
|
||||||
|
356635396330333132373432663432323238
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,15 @@ hermes_data_dir: /srv/data/hermes
|
||||||
postgres_data_dir: /srv/data/postgres
|
postgres_data_dir: /srv/data/postgres
|
||||||
qdrant_data_dir: /srv/data/qdrant
|
qdrant_data_dir: /srv/data/qdrant
|
||||||
minio_data_dir: /srv/data/minio
|
minio_data_dir: /srv/data/minio
|
||||||
|
|
||||||
|
# Pairs WireGuard (clés privées : vault_wireguard_peer_private_keys.<name>)
|
||||||
|
# access: full = tout le lab (admin) | portal = portail Guacamole uniquement
|
||||||
|
wireguard_peers:
|
||||||
|
- name: alkatrazz
|
||||||
|
ip: 10.99.0.10
|
||||||
|
public_key: "uMlKJzEdnEyjUbY2m3RzJ+0/VWzshaHnug8MeDXFfFA="
|
||||||
|
access: full
|
||||||
|
- name: invite-01
|
||||||
|
ip: 10.99.0.50
|
||||||
|
public_key: "hMtM2Kn4ENhK1ENFUJQeNLwI1yy5V6o01HKi2zCUDA8="
|
||||||
|
access: portal
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,4 @@
|
||||||
- { role: hermes_auto_improve, tags: [hermes_auto_improve] }
|
- { role: hermes_auto_improve, tags: [hermes_auto_improve] }
|
||||||
- { role: hermes_exec, tags: [hermes_exec] }
|
- { role: hermes_exec, tags: [hermes_exec] }
|
||||||
- { role: console_user, tags: [console_user] }
|
- { role: console_user, tags: [console_user] }
|
||||||
|
- { role: wireguard, tags: [wireguard] }
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
# Géré par Ansible — ne pas modifier manuellement
|
# Géré par Ansible — ne pas modifier manuellement
|
||||||
|
|
||||||
# Écoute uniquement sur le LAN cluster
|
# Écoute sur le LAN cluster + tunnel WireGuard (DNS des clients VPN).
|
||||||
|
# bind-dynamic (et non bind-interfaces) : wg0 peut apparaître après le démarrage
|
||||||
interface={{ lan_interface }}
|
interface={{ lan_interface }}
|
||||||
bind-interfaces
|
interface=wg0
|
||||||
|
bind-dynamic
|
||||||
|
|
||||||
# Domaine local
|
# Domaine local
|
||||||
domain={{ dns_domain }}
|
domain={{ dns_domain }}
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,15 @@ table inet filter {
|
||||||
ip protocol icmp accept
|
ip protocol icmp accept
|
||||||
ip6 nexthdr icmpv6 accept
|
ip6 nexthdr icmpv6 accept
|
||||||
|
|
||||||
# SSH depuis le LAN domestique et le LAN cluster
|
# SSH depuis le LAN domestique, le LAN cluster et le tunnel WireGuard
|
||||||
tcp dport 22 ip saddr { 192.168.1.0/24, 192.168.10.0/24 } accept
|
tcp dport 22 ip saddr { 192.168.1.0/24, 192.168.10.0/24, 10.99.0.0/24 } accept
|
||||||
|
|
||||||
# DNS + DHCP (dnsmasq)
|
# WireGuard — handshake/transport (Freebox 51820/udp → funk-s01)
|
||||||
udp dport 53 ip saddr 192.168.10.0/24 accept
|
udp dport 51820 accept
|
||||||
tcp dport 53 ip saddr 192.168.10.0/24 accept
|
|
||||||
|
# DNS + DHCP (dnsmasq) — cluster + clients VPN (dnsmasq écoute aussi sur wg0)
|
||||||
|
udp dport 53 ip saddr { 192.168.10.0/24, 10.99.0.0/24 } accept
|
||||||
|
tcp dport 53 ip saddr { 192.168.10.0/24, 10.99.0.0/24 } accept
|
||||||
udp dport 67 iif {{ lan_interface }} accept
|
udp dport 67 iif {{ lan_interface }} accept
|
||||||
|
|
||||||
# NFS
|
# NFS
|
||||||
|
|
@ -73,6 +76,18 @@ table inet filter {
|
||||||
# 7777 = jeu/API ; 8888 = reliable messaging TCP (1.1) — bloqué = kick à ~60 s
|
# 7777 = jeu/API ; 8888 = reliable messaging TCP (1.1) — bloqué = kick à ~60 s
|
||||||
ip daddr 192.168.10.20 tcp dport { 7777, 8888 } ct state new,established,related accept
|
ip daddr 192.168.10.20 tcp dport { 7777, 8888 } ct state new,established,related accept
|
||||||
ip daddr 192.168.10.20 udp dport 7777 ct state new,established,related accept
|
ip daddr 192.168.10.20 udp dport 7777 ct state new,established,related accept
|
||||||
|
|
||||||
|
# WireGuard → lab : filtrage par pair (host_vars wireguard_peers)
|
||||||
|
{% for peer in wireguard_peers | selectattr('access', 'equalto', 'full') | list %}
|
||||||
|
# {{ peer.name }} — accès complet
|
||||||
|
iif "wg0" ip saddr {{ peer.ip }} ct state new,established,related accept
|
||||||
|
{% endfor %}
|
||||||
|
{% for peer in wireguard_peers | selectattr('access', 'equalto', 'portal') | list %}
|
||||||
|
# {{ peer.name }} — portail Guacamole uniquement (Traefik)
|
||||||
|
iif "wg0" ip saddr {{ peer.ip }} ip daddr 192.168.10.200 tcp dport 80 ct state new,established,related accept
|
||||||
|
{% endfor %}
|
||||||
|
# Retours vers le tunnel
|
||||||
|
oif "wg0" ct state established,related accept
|
||||||
}
|
}
|
||||||
|
|
||||||
chain output {
|
chain output {
|
||||||
|
|
@ -95,5 +110,9 @@ table ip nat {
|
||||||
|
|
||||||
# NAT masquerade pour le LAN cluster
|
# NAT masquerade pour le LAN cluster
|
||||||
oif {{ wan_interface }} ip saddr 192.168.10.0/24 masquerade
|
oif {{ wan_interface }} ip saddr 192.168.10.0/24 masquerade
|
||||||
|
|
||||||
|
# Clients VPN → LAN cluster : masquerade en IP s01 (retours garantis même si
|
||||||
|
# un nœud ne route pas 10.99.0.0/24)
|
||||||
|
oif {{ lan_interface }} ip saddr 10.99.0.0/24 masquerade
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
36
ansible/roles/wireguard/README.md
Normal file
36
ansible/roles/wireguard/README.md
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Rôle `wireguard`
|
||||||
|
|
||||||
|
Serveur **WireGuard** sur storage-01 : accès distant au lab (portail Guacamole, voire
|
||||||
|
tout le LAN cluster) via `kaya.freeboxos.fr:51820/udp` (redirection Freebox → funk-s01).
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
| Variable | Défaut | Rôle |
|
||||||
|
|---|---|---|
|
||||||
|
| `wireguard_port` | `51820` | Port UDP d'écoute (= redirection Freebox) |
|
||||||
|
| `wireguard_subnet` / `wireguard_server_ip` | `10.99.0.0/24` / `10.99.0.1` | Réseau du tunnel |
|
||||||
|
| `wireguard_endpoint` | `kaya.freeboxos.fr:51820` | Endpoint public côté clients |
|
||||||
|
| `wireguard_client_allowed_ips` | `192.168.10.0/24, 10.99.0.0/24` | Split tunnel (lab uniquement) |
|
||||||
|
| `wireguard_peers` | `[]` (host_vars) | Pairs : `{name, ip, public_key, access}` |
|
||||||
|
|
||||||
|
`access` : `full` (tout le lab — admin) ou `portal` (uniquement Traefik :80 → portail
|
||||||
|
Guacamole). Le filtrage est fait **par nftables** (rôle `gateway`), pas par WireGuard.
|
||||||
|
|
||||||
|
Secrets vault : `vault_wireguard_server_private_key`,
|
||||||
|
`vault_wireguard_peer_private_keys` (dict `name: clé`).
|
||||||
|
|
||||||
|
## Ajouter un pair
|
||||||
|
|
||||||
|
Procédure complète (clés openssl, vault, host_vars, QR code) :
|
||||||
|
**`admin/infra/wireguard.md`**. Résumé : générer une paire X25519, clé privée dans le
|
||||||
|
vault, entrée dans `wireguard_peers` (host_vars storage-01), ré-appliquer
|
||||||
|
`--tags wireguard,gateway`, distribuer `/etc/wireguard/clients/<name>.conf`.
|
||||||
|
|
||||||
|
## Caveats
|
||||||
|
|
||||||
|
- Les profils clients dans `/etc/wireguard/clients/` contiennent la **clé privée du
|
||||||
|
client** — à transmettre par canal raisonnable, jamais commités.
|
||||||
|
- Le DNS du tunnel = dnsmasq s01 (`10.99.0.1`) : nécessite `bind-dynamic` + `interface=wg0`
|
||||||
|
dans le rôle `dnsmasq`, et l'ouverture 53 depuis `10.99.0.0/24` dans `gateway`.
|
||||||
|
- Retirer un pair : le supprimer de `wireguard_peers` + du vault → re-apply
|
||||||
|
`--tags wireguard,gateway` (la règle nftables et le [Peer] disparaissent).
|
||||||
23
ansible/roles/wireguard/defaults/main.yml
Normal file
23
ansible/roles/wireguard/defaults/main.yml
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
wireguard_interface: wg0
|
||||||
|
wireguard_port: 51820
|
||||||
|
wireguard_subnet: 10.99.0.0/24
|
||||||
|
wireguard_server_ip: 10.99.0.1
|
||||||
|
wireguard_server_public_key: "NCneTVY6UlvaVY9L6dgP+w+w8pheQS30d08NHn9jBk8="
|
||||||
|
# Clé privée serveur : vault_wireguard_server_private_key
|
||||||
|
|
||||||
|
# Endpoint public que les clients contactent (redirection Freebox 51820/udp → funk-s01)
|
||||||
|
wireguard_endpoint: "kaya.freeboxos.fr:{{ wireguard_port }}"
|
||||||
|
|
||||||
|
# DNS poussé aux clients = dnsmasq de s01 (résout *.lab.local → Traefik)
|
||||||
|
wireguard_client_dns: "{{ wireguard_server_ip }}"
|
||||||
|
|
||||||
|
# Split tunnel : seuls le LAN cluster et le tunnel passent dans le VPN,
|
||||||
|
# le reste du trafic client sort par sa connexion normale
|
||||||
|
wireguard_client_allowed_ips: "192.168.10.0/24, {{ wireguard_subnet }}"
|
||||||
|
|
||||||
|
# Pairs — définis dans host_vars/storage-01/vars.yml (clés privées dans le vault :
|
||||||
|
# vault_wireguard_peer_private_keys.<name>). access :
|
||||||
|
# full → tout le LAN cluster (admin)
|
||||||
|
# portal → uniquement le portail web Guacamole (Traefik :80) — invités
|
||||||
|
wireguard_peers: []
|
||||||
5
ansible/roles/wireguard/handlers/main.yml
Normal file
5
ansible/roles/wireguard/handlers/main.yml
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
- name: Restart wireguard
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: "wg-quick@{{ wireguard_interface }}"
|
||||||
|
state: restarted
|
||||||
42
ansible/roles/wireguard/tasks/main.yml
Normal file
42
ansible/roles/wireguard/tasks/main.yml
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
- name: Install wireguard-tools
|
||||||
|
ansible.builtin.dnf:
|
||||||
|
name: wireguard-tools
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Deploy wg0 server config
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: wg0.conf.j2
|
||||||
|
dest: "/etc/wireguard/{{ wireguard_interface }}.conf"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0600'
|
||||||
|
notify: Restart wireguard
|
||||||
|
|
||||||
|
- name: Create clients config directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/wireguard/clients
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0700'
|
||||||
|
|
||||||
|
# Profils clients prêts à distribuer (fichier .conf à envoyer / QR code —
|
||||||
|
# voir admin/infra/wireguard.md)
|
||||||
|
- name: Generate client configs
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: client.conf.j2
|
||||||
|
dest: "/etc/wireguard/clients/{{ item.name }}.conf"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0600'
|
||||||
|
loop: "{{ wireguard_peers }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.name }}"
|
||||||
|
no_log: true
|
||||||
|
|
||||||
|
- name: Enable and start wg-quick
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: "wg-quick@{{ wireguard_interface }}"
|
||||||
|
enabled: true
|
||||||
|
state: started
|
||||||
11
ansible/roles/wireguard/templates/client.conf.j2
Normal file
11
ansible/roles/wireguard/templates/client.conf.j2
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Profil WireGuard « {{ item.name }} » — accès {{ item.access }} au lab Funk
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = {{ vault_wireguard_peer_private_keys[item.name] }}
|
||||||
|
Address = {{ item.ip }}/32
|
||||||
|
DNS = {{ wireguard_client_dns }}
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = {{ wireguard_server_public_key }}
|
||||||
|
Endpoint = {{ wireguard_endpoint }}
|
||||||
|
AllowedIPs = {{ wireguard_client_allowed_ips }}
|
||||||
|
PersistentKeepalive = 25
|
||||||
13
ansible/roles/wireguard/templates/wg0.conf.j2
Normal file
13
ansible/roles/wireguard/templates/wg0.conf.j2
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Géré par Ansible — ne pas modifier manuellement
|
||||||
|
[Interface]
|
||||||
|
Address = {{ wireguard_server_ip }}/{{ wireguard_subnet.split('/')[1] }}
|
||||||
|
ListenPort = {{ wireguard_port }}
|
||||||
|
PrivateKey = {{ vault_wireguard_server_private_key }}
|
||||||
|
|
||||||
|
{% for peer in wireguard_peers %}
|
||||||
|
# {{ peer.name }} — accès {{ peer.access }}
|
||||||
|
[Peer]
|
||||||
|
PublicKey = {{ peer.public_key }}
|
||||||
|
AllowedIPs = {{ peer.ip }}/32
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue