Set-OPS-Public/underlay.yml.example
Daniel Allaire e5ce2b93b1 devis switch : le SDN prend le routage tenant, le devis se vide
Trois décisions appliquées : une zone EVPN par tenant, routage ET filtrage
inter-zone à ce niveau, inter-tenant obligatoirement par l'OPNsense.

`underlay.routage_tenants` (`switch` par défaut, `sdn`) : en SDN le devis
cesse d'émettre VLAN tenants, SVI et ACL, et les retire des trunks. Chez
Chezlepro les trunks passent de quinze VLAN à deux — seul du VXLAN circule,
que le commutateur transporte sans le lire.

Le MTU devient une garde : `make underlay` refuse un transport sous 1550 en
mode SDN, en disant pourquoi — sous ce seuil le ping passe et les transferts
échouent.

Le partage des responsabilités est écrit dans docs/sdn-evpn.md : qui route,
qui filtre, pour chaque nature de trafic. Deux conséquences nommées —
l'inter-tenant ne peut plus être oublié (il traverse une bordure en block par
défaut), et le commutateur ne voit plus rien du trafic tenant.

Point ouvert : le registre des flux n'a aucun mot-clé pour un flux
inter-tenant. Défaut sûr, mais on ne peut pas déclarer d'exception légitime.

Preuves : 24 OK, 0 échec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 08:26:21 -04:00

124 lines
6.3 KiB
Text

# Underlay — la fabric physique partagee par les instances federees.
#
# Cluster-global : ces reseaux portent TOUTE la flotte, ils n'appartiennent a aucun
# tenant et ne derivent d'aucun `index`. Ils vivent dans le *sous-sol* du modele.
#
# Copier dans le depot de l'HEBERGEUR (celui qui possede les switches), puis le monter :
# ln -s ../OPS-<hebergeur>/underlay.yml underlay.yml
# Le moteur l'ignore (gitignore) : c'est une donnee de site, versionnee chez son proprietaire.
# Surchargeable par SETOPS_UNDERLAY=/chemin/underlay.yml. Absent => le devis switch
# omet simplement la section underlay (retro-compatible).
#
# Regles (prouvees par P23 / `make underlay`) :
# - VLAN < 1000 : franchement SOUS la plage tenant (VLAN tenant = 1000+index*10+zone).
# - sous_reseau : ne chevauche aucun supernet tenant (10.(10+index).0.0/16, index >= 1).
# => la plage 10.0.0.0/16 .. 10.10.0.0/16 est libre pour l'underlay.
# - passerelle : OPTIONNELLE. Presente => un SVI est genere (routage inter-VLAN).
# Storage/Ceph restent en general L2 pur (pas de passerelle).
---
underlay:
# FABRICS PHYSIQUES. Chaque reseau appartient a une fabric (`principal` par defaut).
# Deux fabrics ne partagent aucun cable : le devis d'une fabric ne declare ni ne
# transporte les VLAN d'une autre, et leurs spanning-tree sont independants.
# Cas typique : le stockage jumbo (iSCSI, Ceph) sur ses propres switches 10G.
#
# Switch qui porte le routage : SVI de zone, ACL d'isolation, routes. Sans MLAG,
# UN SEUL switch route ; les autres restent en L2 pur et reçoivent la partie B du
# devis. Dupliquer les SVI sur plusieurs switches creerait autant de conflits
# d'adresses qu'il y a de zones. Doit nommer un hote declare dans `hotes:`.
routeur: switch-01
# Qui route entre les zones d'un tenant : `switch` (SVI sur le commutateur, defaut)
# ou `sdn` (une zone EVPN par tenant, portant son VRF sur les hyperviseurs).
# En `sdn` : aucun VLAN de tenant ne circule sur le fil, le devis switch cesse
# d'emettre VLAN tenants / SVI / ACL, et les reseaux de transport doivent avoir un
# MTU >= 1550 (VXLAN ajoute 50 octets) — `make underlay` le refuse sinon.
#routage_tenants: switch
# Isolation inter-tenant par ACL de commutateur. `true` par defaut.
# Mettre `false` quand le materiel ne sait pas lier une ACL a une interface de
# routage : le devis cesse alors d'emettre des ACL qui ne seraient jamais liees.
# Mieux vaut aucune regle qu'une regle inoperante qu'on croit active.
# A `false`, l'isolation repose entierement sur les nftables d'hote — et le plan de
# gestion de la fabric perd sa protection RESEAU contre les tenants.
#acl_inter_tenant: true
# Dialecte de CLI du commutateur (cisco | binardat). Propriete du MATERIEL :
# decide la forme des masques d'ACL, des routes et du spanning-tree.
dialecte: cisco
# Spanning-tree de la fabric principale. `topologie` documente le cablage :
# `etoile` = rayons depuis le routeur (aucun lien redondant, donc aucune boucle),
# `anneau`/`maille` = liens redondants, RSTP devient indispensable. Le routeur est
# toujours designe pont racine : l'arbre logique suit alors le cablage physique.
stp:
mode: rstp # rstp | mstp | pvst
topologie: etoile # etoile | anneau | maille
reseaux:
- nom: management
description: Switches, mgmt Proxmox, OOB/IPMI
vlan: 10
sous_reseau: 10.0.0.0/24
passerelle: 10.0.0.1 # SVI (retirer pour du L2 pur)
mtu: 1500
- nom: stockage-iscsi
fabric: stockage # switches dedies, hors fabric principale
description: iSCSI MPIO
vlan: 20
sous_reseau: 10.0.1.0/24
mtu: 9000 # jumbo
- nom: ceph-public
fabric: stockage # switches dedies, hors fabric principale
description: Clients <-> MON/OSD
vlan: 30
sous_reseau: 10.0.2.0/24
mtu: 9000
- nom: ceph-cluster
fabric: stockage # switches dedies, hors fabric principale
description: OSD <-> OSD (replication, backfill, recovery)
vlan: 31
sous_reseau: 10.0.3.0/24
mtu: 9000
# Transit vers la frontiere nord/sud (pare-feu de bordure). OPTIONNEL, mais sans lui
# la flotte n'a ni sortie ni chemin de retour vers l'administration.
# Il vit dans l'underlay parce qu'il est PARTAGE : la frontiere route vers TOUS les
# supernets tenants par ce meme saut — il ne peut donc deriver d'aucun `index`.
# `passerelle_sortie` = adresse du pare-feu sur le lien ; c'est elle qui fait emettre
# la route par defaut et les routes de retour (section 5 de `make devis-reseau`).
# Prevoir large : /29 laisse la place aux deux pare-feux pendant une transition.
- nom: transit-frontiere
description: Lien routeur est-ouest (switches L3) <-> frontiere nord/sud
vlan: 40
sous_reseau: 10.0.4.0/29
passerelle: 10.0.4.1 # SVI du switch L3
passerelle_sortie: 10.0.4.2 # pare-feu de bordure = sortie par defaut de la flotte
mtu: 1500
# Hotes fixes documentes (optionnel) : IP hors DHCP, verifiees dans leur reseau.
# PORTS PHYSIQUES (optionnel). Sans eux, le devis emet des marqueurs
# `<PORT-VERS-...>` a remplacer a la main — et le travail est perdu a chaque
# regeneration. Declares ici, le devis sort applicable tel quel.
# hyperviseurs : ports terminaux vers Proxmox (portfast)
# frontiere : port(s) vers le pare-feu de bordure (portfast)
# rayons : {switch d'acces: port}, cote ROUTEUR uniquement
# montante : port vers le routeur, cote SWITCH D'ACCES uniquement
# `make underlay` refuse un port declare deux fois sur un meme equipement, un rayon
# vers un switch inconnu, et une confusion rayons/montante.
hotes:
# Le switch designe `routeur` porte le SVI de management : son adresse de gestion
# EST la passerelle du reseau. `make underlay` refuse les deux valeurs divergentes.
- nom: switch-01
reseau: management
ip: 10.0.0.1
ports:
hyperviseurs: [Te1/0/1, Te1/0/2, Te1/0/3]
frontiere: [Gi1/0/23]
rayons: { switch-02: Te1/0/47, switch-03: Te1/0/48 }
- nom: switch-02
reseau: management
ip: 10.0.0.3
ports:
montante: Te1/0/48
hyperviseurs: [Te1/0/1, Te1/0/2, Te1/0/3]
- { nom: switch-03, reseau: management, ip: 10.0.0.4 }