From 39fab4c465a06a2147c850b6215c62c4dc1c0ba0 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Mon, 3 Aug 2026 09:26:33 -0400 Subject: [PATCH] =?UTF-8?q?wiki=20:=20la=20page=20r=C3=A9seau=20enseignait?= =?UTF-8?q?=20le=20mod=C3=A8le=20p=C3=A9rim=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elle décrivait les SVI par zone, les ACL d'isolation inter-tenant et un tableau de dialectes limité aux masques d'ACL. Rien de tout ça n'est vrai d'une fabric en SDN — et c'est le point d'entrée pédagogique : on y apprenait à construire le mauvais réseau, avec la conviction de suivre la documentation. Elle présente maintenant les deux mondes côte à côte (`routage_tenants` : `switch` ou `sdn`), avec ce qui change et surtout ce qui ne change pas — le `.1` d'une passerelle ne change pas d'adresse, il change de porteur. Ajouté : le devis de la frontière, absent de la page alors qu'il dérive du même registre des flux ; le lien de transit et le piège de la route de retour, qui a coûté une passe de déploiement ; les fabrics et le fait qu'un devis est une configuration qu'on applique, pas un inventaire ; le MTU minimal en SDN. Et la leçon des dialectes, qui vaut au-delà de Set-OPS : trois formes ont été supposées, deux étaient fausses, et la pire ne levait aucune erreur — `allowed vlan add` ne retranchait rien sur un port qui autorisait déjà tout. Une commande acceptée n'est pas une commande qui fait ce qu'on croit. Preuves : 24 OK, 0 échec. Co-Authored-By: Claude Opus 5 --- docs/audit/preuve-2026-08-03.md | 6 +-- wiki/Multi-instance-et-fédération.md | 80 +++++++++++++++++++++------- 2 files changed, 65 insertions(+), 21 deletions(-) diff --git a/docs/audit/preuve-2026-08-03.md b/docs/audit/preuve-2026-08-03.md index bc3c699..eb4514f 100644 --- a/docs/audit/preuve-2026-08-03.md +++ b/docs/audit/preuve-2026-08-03.md @@ -28,10 +28,10 @@ | P13 | Invariants structurels/doctrinaux | AFF-015, AFF-022, AFF-037, AFF-038, AFF-062 | ✅ OK | LICENSE, socle dossier, pas de couches paralleles, SSH clef-only, nftables off : OK. | | P14 | Pas de chemin lab/ code en dur | AFF-097 | ✅ OK | Aucun chemin instance/inventories/lab/group_vars code en dur. | | P15 | Modele public socle valide | AFF-022, AFF-099 | ✅ OK | Modele public socle : domaines/serveurs/applications/bases valides. | -| P16 | Inventaire Ansible complet (--list) | AFF-030 | ✅ OK | 14 hotes, 32 groupes (inventaire dechiffre et parse). | +| P16 | Inventaire Ansible complet (--list) | AFF-030 | ✅ OK | 14 hotes, 29 groupes (inventaire dechiffre et parse). | | P17 | Tous les modeles valident (registres + underlay) | AFF-022, AFF-099 | ✅ OK | Les 1 modele(s) decouvert(s) valident. | -| P18 | Gabarit de voute complet | AFF-026 | ✅ OK | Gabarit de voute complet : 24 secret(s) exige(s), tous presents. | -| P19 | Le GUI couvre le schema du plan | AFF-002, AFF-095 | ✅ OK | GUI : les 28 champ(s) des plans reels sont editables (2 plan(s) inspecte(s)), registres toleres : nomenclature. | +| P18 | Gabarit de voute complet | AFF-026 | ✅ OK | Gabarit de voute complet : 21 secret(s) exige(s), tous presents. | +| P19 | Le GUI couvre le schema du plan | AFF-002, AFF-095 | ✅ OK | GUI : les 27 champ(s) des plans reels sont editables (2 plan(s) inspecte(s)), registres toleres : nomenclature. | | P20 | Adressage 100% derive du seed (aucun stocke) | AFF-001, AFF-003 | ✅ OK | 2 nomenclature(s) : adressage 100% derive du seed index. | | P21 | Federation : aucun index en collision | AFF-001 | ✅ OK | Federation coherente : 2 instance(s) federee(s), aucun index en collision. | | P22 | Plan de recette a jour (genere du wiki) | AFF-002 | ✅ OK | Plan de recette à jour (19 sections). | diff --git a/wiki/Multi-instance-et-fédération.md b/wiki/Multi-instance-et-fédération.md index 2ac9a5c..ecce929 100644 --- a/wiki/Multi-instance-et-fédération.md +++ b/wiki/Multi-instance-et-fédération.md @@ -41,24 +41,47 @@ chevauchement possible : VLAN `1000+index×10+zone` (les VLAN de deux index diff **Garde-fous.** `federe: false` exclut un bac à sable local du réseau convergé. La **preuve P21** échoue si deux instances fédérées partagent un `index`. -**Le devis du commutateur.** `make devis-reseau` **dérive** des nomenclatures fédérées la config -à coller dans le switch : les VLAN par zone, les **SVI** (`ip address …`, passerelles) et les -**ACL d'isolation** (default-deny inter-tenant — un tenant ne parle qu'à lui-même, le reste passe -par OPNsense). C'est le pendant matériel de l'isolation logique. +**Qui route les tenants : deux mondes.** L'adressage dérive toujours du seed `index`, mais +*qui* l'applique se déclare — `underlay.routage_tenants` : -**Le dialecte de CLI.** Toutes les CLI de switch ne se ressemblent pas. Set-OPS génère par défaut -du **Cisco** (`cisco`), mais connaît aussi le **Binardat** (`binardat`), qui diffère sur deux -pièges qui font *passer un VLAN mais fuir un tenant* : +| | `switch` | `sdn` | +|---|---|---| +| Passerelle d'une zone | **SVI** sur le commutateur L3 | **anycast** sur chaque hyperviseur | +| Isolation inter-tenant | ACL de commutateur | **VRF** (une zone EVPN par tenant) | +| Sur le fil | VLAN étiquetés par zone | **VXLAN** — aucun VLAN de tenant ne circule | +| Inter-tenant | bloqué par ACL | sort du VRF → **passe par la frontière** | + +Le `.1` d'une passerelle ne change pas d'adresse d'un monde à l'autre : il **change de +porteur**. C'est la même dérivation, appliquée ailleurs. + +**Le devis du commutateur.** `make devis-reseau` dérive la config à coller. En mode `switch` : +VLAN par zone, SVI, ACL d'isolation. En mode `sdn` : rien de tout ça — le commutateur redevient +un **transport IP** qui achemine du VXLAN sans le lire, et le devis dit à sa place pourquoi ces +sections ont disparu. + +**Le devis de la frontière.** `make devis-opnsense` dérive la politique de bordure du **même** +registre des flux — les flux `pair: externe`, que le pare-feu d'hôte saute justement parce +qu'ils relèvent de la bordure. Rien n'y est saisi : ni port, ni adresse, ni nom d'hôte. + +**Le dialecte de CLI.** Toutes les CLI de commutateur ne se ressemblent pas. Set-OPS génère par +défaut du **Cisco**, mais connaît aussi le **Binardat**, qui diffère sur des détails capables de +faire *passer un VLAN mais fuir un tenant* : | | Cisco | Binardat | |---|---|---| | Masque d'ACL | **inversé** (wildcard `0.0.255.255`) | **normal** (`255.255.0.0`) | | Commentaire d'ACL | `remark …` | **absent** (omis) | +| Route statique | `ip route ` | **CIDR** : `ip route 0.0.0.0/0 ` | -*(Le SVI `ip address … 255.255.255.0` est en masque normal sur les deux — rien à changer.)* -Choisir le dialecte : `make devis-reseau DIALECTE=binardat`, la variable d'environnement -`SETOPS_DIALECTE=binardat` (défaut permanent), ou l'option `--dialecte`. La GUI (vue Réseau, -lecture seule) suit l'environnement. **Le dépôt public reste générique** (`cisco`). +*(Le SVI `ip address … 255.255.255.0` est en masque normal sur les deux.)* Le dialecte est un +**intrant** — section *Fabric* du panneau — surchargeable par `--dialecte` ou `SETOPS_DIALECTE`. +**Le dépôt public reste générique** (`cisco`). + +> **La leçon qui vaut au-delà de Set-OPS.** Trois de ces formes ont été *supposées* avant d'être +> confrontées au matériel ; deux étaient fausses. La pire ne levait aucune erreur : +> `switchport trunk allowed vlan **add** …` *ajoute* à la liste courante, et sur un port neuf +> qui autorise déjà tout, elle ne retranchait rien. La configuration avait l'air d'isoler et +> n'isolait pas. **Une commande acceptée n'est pas une commande qui fait ce qu'on croit.** **L'underlay — le sous-sol.** Les VLAN tenant (`1000+index×10+zone`) sont les *overlays*. En dessous vit la **fabric physique** partagée par toute la flotte : management des switches et de @@ -68,12 +91,33 @@ d'aucun `index`. On la décrit dans `underlay.yml`, qui vit dans le dépôt de * plan par `instance/`. Ce lien ne suit pas `make instance-utiliser` : la fabric reste celle de l'hébergeur, quel que soit le tenant actif. Gabarit : `underlay.yml.example`. -| Underlay | VLAN | Sous-réseau | -|---|---|---| -| management (switches, Proxmox, OOB) | 10 | `10.0.0.0/24` | -| stockage / iSCSI | 20 | `10.0.1.0/24` | -| ceph-public | 30 | `10.0.2.0/24` | -| ceph-cluster | 31 | `10.0.3.0/24` | +| Underlay | VLAN | Sous-réseau | Fabric | +|---|---|---|---| +| management (commutateurs, Proxmox, OOB) | 10 | `10.0.0.0/24` | principale | +| **transit** vers la frontière | 40 | `10.0.4.0/29` | principale | +| stockage / iSCSI | 20 | `10.0.1.0/24` | stockage | +| ceph-public | 30 | `10.0.2.0/24` | stockage | +| ceph-cluster | 31 | `10.0.3.0/24` | stockage | + +Deux choses à retenir de cette table. + +**Les fabrics.** Tous les réseaux ne partagent pas les mêmes câbles. Le stockage jumbo peut +vivre sur ses propres commutateurs ; le devis de l'une ne déclare alors rien de l'autre, et le +dit — `HORS PERIMETRE`. Un devis est une configuration qu'on applique, pas un inventaire. + +**Le transit.** C'est le lien entre le routeur et la frontière, et **sans lui la flotte n'a ni +sortie ni chemin de retour**. Il vit dans l'underlay parce qu'il est *partagé* : la frontière +route vers tous les tenants par ce même saut, il ne peut donc dériver d'aucun `index`. + +> **Le piège qui a coûté une passe de déploiement.** La route *aller* ne suffit pas. Sans route +> de **retour** vers le réseau d'administration, la réponse d'une VM sort par une autre +> interface que celle où l'état a été créé, et le pare-feu la jette **en silence** — ni réponse, +> ni message d'erreur. Symptôme déroutant : la passerelle répond au ping, aucun hôte derrière +> elle n'est joignable. On cherche une règle de pare-feu ; c'est une route manquante à l'autre +> bout. + +En mode `sdn`, ces réseaux transportent du VXLAN : leur **MTU doit atteindre 1550** au minimum, +sinon le ping passe et les transferts échouent. `make underlay` le refuse. `make underlay` l'affiche et le **valide** : VLAN < 1000 et sous-réseaux hors des supernets tenant (`10.(10+index).0.0/16`) — **aucune collision possible** avec les overlays. `make @@ -87,7 +131,7 @@ règle ; elle est *sautée* si aucun `underlay.yml` n'est défini. | Set-OPS | Équivalents ailleurs | |---|---| | un moteur, N tenants | **multi-tenancy** SaaS, *cloud accounts/projects* | -| isolation par VLAN/adressage | VRF, VLAN, *namespaces* Kubernetes, VPC | +| isolation par VRF (zone EVPN) | VRF matériel, VPC, *namespaces* Kubernetes | | découverte par convention | *convention over configuration* (Rails, etc.) | | tenants NetBox | modèle de source de vérité multi-tenant |