pare-feu proxmox : un flux ICMP devient une regle, au lieu d etre saute

Le type ICMP (echo-request) etait range parmi les ports derives et le flux
saute : le ping de supervision n avait pas de regle, et web-frontal-01 passe
en REJECT est devenu mort pour Icinga. icmp_type dans le devis, icmp-type
vers l API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-09-28 15:01:04 -04:00
parent 4ce296f3d5
commit 35831608d0
2 changed files with 25 additions and 2 deletions

View file

@ -1,5 +1,25 @@
# CHANGELOG — Set-OPS
## 2026-09-28 (11) — Première VM filtrée par Proxmox, et le ping de supervision qu'aucune règle ne portait
**Activée : `web-frontal-01` de Technolibre** (`--vm 123603101`), pare-feu `enable=1`,
`policy_in=REJECT`, groupes `cli-metrique`, `srv-debian`, `srv-web-frontal`. Vérifié flux par
flux : SSH du poste, rapports de santé et de sauvegarde acceptés, `node_exporter` joint par
`obs-01`, SSH depuis la flotte (autorisé par `srv-debian`, déclaré), port 80 ouvert à l'edge
seul (rien n'y écoute encore : aucun site). Icinga : tout vert — sauf un critique NOUVEAU.
**`ping4` : 100 % de pertes.** Le ping de supervision EST déclaré (`serveur_debian`,
`echo-request` depuis `serveur_icinga`), mais `_ports()` ne garde que les nombres : le type
ICMP était rangé parmi les « ports dérivés » et le flux sauté. Aucune règle, donc `REJECT`.
`_cibles()` rend désormais un flux ICMP en règle `proto: icmp` + `icmp_type`, que
l'applicateur transmet (`icmp-type`) et compare. Appliqué : `srv-debian` des deux locataires
accepte `echo-request` depuis `srv-icinga` ; `ping4` revenu OK (0,20 ms).
**Vérifié avant d'aller plus loin** : le « sans source » `serveur_icinga:5665` que recense le
devis est le flux de `serveur_backup`, qu'aucun locataire ne porte — les rapports passifs,
eux, ont leurs règles (`cli-backup`, `srv-debian`). Et le recensement ne déclare plus sauté
un flux ICMP qu'il rend.
## 2026-09-28 (10) — Le pare-feu est-ouest de Proxmox ne filtrait aucune VM des locataires
**Mesuré.** Pare-feu du datacenter actif, `firewall=1` sur les cartes des 26 VM de Chezlepro

View file

@ -196,7 +196,7 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict:
if pairs == ["localhost"]:
continue # boucle locale : aucune regle inter-noeud
if not _resoudre_sources(data, fl.get("pair"), tous, ips):
sans_source.append(f"{groupe}:{','.join(_ports(fl))}")
sans_source.append(f"{groupe}:{','.join(str(c.get('dport') or c.get('icmp_type')) for c in _cibles(fl))}")
continue
# UNE REGLE PAR ROLE SOURCE. Un flux dont le pair liste quatre roles
# donne quatre regles, chacune renvoyant a l'IPSet de son role : la
@ -245,7 +245,10 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict:
# Sans cette regle, la premiere VM passee en `policy_in=REJECT` se ferme
# derriere l'outil qui vient de la configurer. Meme source unique que
# les nftables et la frontiere : l'intrant `nftables_admin_ssh`.
if "22" in _ports(fl) and admin_de(nom):
# `_ports` seulement pour TCP/UDP : appele sur un flux ICMP, il rangeait le
# type parmi les « ports derives sautes » — un flux pourtant rendu.
if (str(fl.get("protocole", "tcp")).lower() != "icmp"
and "22" in _ports(fl) and admin_de(nom)):
utilises.add(f"t{n['index']}-admin")
regles.append({
"action": "ACCEPT", "sens": "IN",