nommage : bifrost aux frontières, sleipnir à la fabric interne
`bifrost-0` et `bifrost-1` sont réservés aux deux frontières OPNsense — Bifröst est le pont vers l'extérieur. Les switches internes deviennent `sleipnir-01..03` : le cheval qui traverse les mondes, pas le pont qui en sort. La division du nom suit celle de l'architecture. Les deux boîtiers sont déclarés comme hôtes du lien de transit (10.0.4.2, 10.0.4.3) : hors flotte Ansible, la déclaration documente le lien et réserve les noms. Le /29 choisi plus tôt les loge tous les deux. Conséquence traitée : la partie B du devis aurait listé les deux pare-feux parmi les « switches d'accès ». Elle ne retient plus que les hôtes du réseau de management — un équipement déclaré ailleurs ne reçoit aucune ligne de configuration de switch. Le devis frontière nomme le boîtier quand il est déclaré. Preuves : 24 OK, 0 échec. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
7e852b5eef
commit
b613873c3a
4 changed files with 43 additions and 2 deletions
16
CHANGELOG.md
16
CHANGELOG.md
|
|
@ -1,5 +1,21 @@
|
|||
# CHANGELOG — Set-OPS
|
||||
|
||||
## 2026-08-01 (suite 6) — nommage : `bifrost` aux frontières, `sleipnir` à la fabric
|
||||
|
||||
`bifrost-0` et `bifrost-1` sont réservés aux deux frontières OPNsense — Bifröst est le pont
|
||||
vers l'extérieur. Les switches internes deviennent `sleipnir-01…03` : le cheval qui traverse
|
||||
les mondes, pas le pont qui en sort. La division du nom suit celle de l'architecture.
|
||||
|
||||
Les deux boîtiers sont déclarés comme hôtes du lien de transit (`10.0.4.2`, `10.0.4.3`) :
|
||||
hors flotte Ansible, la déclaration documente le lien et réserve les noms. Le `/29` choisi
|
||||
plus tôt les loge tous les deux, comme prévu.
|
||||
|
||||
Conséquence à traiter : la partie B du devis switch aurait listé les deux pare-feux parmi les
|
||||
« switches d'accès ». Elle ne retient désormais que les hôtes du **réseau de management** —
|
||||
un équipement déclaré ailleurs ne reçoit aucune ligne de configuration de switch.
|
||||
|
||||
Le devis frontière nomme le boîtier quand il est déclaré : `frontiere 10.0.4.2 (bifrost-0)`.
|
||||
|
||||
## 2026-08-01 (suite 5) — deux incohérences du devis switch
|
||||
|
||||
### Corrigé — le routeur avait deux adresses de gestion contradictoires
|
||||
|
|
|
|||
|
|
@ -88,6 +88,13 @@ sur ce lien :
|
|||
passerelle_sortie: 10.0.4.2 # la frontière = sortie par défaut de la flotte
|
||||
```
|
||||
|
||||
**Nommage.** `bifrost-0` et `bifrost-1` désignent les deux frontières — Bifröst est le pont
|
||||
vers l'extérieur. La fabric interne porte un autre nom, `sleipnir-01…03` : le cheval qui
|
||||
traverse les mondes, pas le pont qui en sort. Les deux boîtiers sont déclarés comme hôtes du
|
||||
lien de transit ; ils sont **hors flotte Ansible**, la déclaration ne sert qu'à documenter le
|
||||
lien et à réserver les noms. Le devis switch ne leur adresse aucune ligne — sa partie B ne
|
||||
retient que les hôtes du réseau de management.
|
||||
|
||||
Un `/29` plutôt qu'un `/30` : pendant une transition, deux pare-feux cohabitent sur le lien,
|
||||
et un `/30` n'offre que deux adresses. `make underlay` (**preuve P23**) refuse une sortie hors
|
||||
du lien, confondue avec le SVI, sans SVI, ou déclarée deux fois.
|
||||
|
|
|
|||
|
|
@ -79,6 +79,17 @@ def transit_underlay() -> dict | None:
|
|||
return underlay_mod.reseau_transit(underlay_mod.charger())
|
||||
|
||||
|
||||
def nom_frontiere(transit: dict | None) -> str:
|
||||
"""Nom du boitier de bordure, s'il est declare comme hote sur le lien de transit."""
|
||||
if not transit:
|
||||
return ""
|
||||
sortie = str(transit.get("passerelle_sortie") or "")
|
||||
for h in underlay_mod.hotes(underlay_mod.charger()):
|
||||
if h.get("reseau") == transit.get("nom") and str(h.get("ip")) == sortie:
|
||||
return str(h.get("nom") or "")
|
||||
return ""
|
||||
|
||||
|
||||
def prochain_saut(transit: dict | None) -> str:
|
||||
"""Prochain saut des routes tenants = le SVI du switch sur le lien de transit.
|
||||
|
||||
|
|
@ -224,6 +235,7 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict:
|
|||
"sous_reseau": (transit or {}).get("sous_reseau"),
|
||||
"svi_switch": saut,
|
||||
"adresse_frontiere": (transit or {}).get("passerelle_sortie"),
|
||||
"nom_frontiere": nom_frontiere(transit),
|
||||
} if transit else None,
|
||||
"reciproque_switch": [
|
||||
f"ip route {cidr} -> {saut} (retour vers l'administration)"
|
||||
|
|
@ -263,7 +275,9 @@ def rendre(devis: dict) -> str:
|
|||
if tr:
|
||||
out += [
|
||||
f"# lien '{tr['nom']}' {tr['sous_reseau']} — VLAN {tr['vlan']} a etiqueter",
|
||||
f"# switch {tr['svi_switch']} <-> frontiere {tr['adresse_frontiere']}",
|
||||
f"# switch {tr['svi_switch']} <-> frontiere"
|
||||
f" {tr['adresse_frontiere']}"
|
||||
+ (f" ({tr['nom_frontiere']})" if tr.get("nom_frontiere") else ""),
|
||||
]
|
||||
out += [
|
||||
"",
|
||||
|
|
|
|||
|
|
@ -93,7 +93,11 @@ def partie_acces(underlay: dict | None, tenants: list, vlans: str) -> list[str]:
|
|||
if not r_nom:
|
||||
return []
|
||||
mgmt = next((r for r in underlay_mod.reseaux(underlay) if r.get("passerelle")), None)
|
||||
autres = [h for h in underlay_mod.hotes(underlay) if h.get("nom") != r_nom]
|
||||
# UNIQUEMENT les hotes du reseau de management : les autres equipements declares
|
||||
# (frontieres sur le lien de transit, par exemple) ne sont pas des switches et ne
|
||||
# doivent recevoir aucune de ces lignes.
|
||||
autres = [h for h in underlay_mod.hotes(underlay)
|
||||
if h.get("nom") != r_nom and mgmt and h.get("reseau") == mgmt["nom"]]
|
||||
if not autres:
|
||||
return []
|
||||
out = [
|
||||
|
|
|
|||
Loading…
Reference in a new issue