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:
parent
3676e69cd9
commit
4ce296f3d5
2 changed files with 24 additions and 7 deletions
|
|
@ -80,7 +80,9 @@ def _regle_cle(r: dict) -> tuple:
|
||||||
str(r.get("action") or "").upper(),
|
str(r.get("action") or "").upper(),
|
||||||
str(r.get("source") or ""),
|
str(r.get("source") or ""),
|
||||||
str(r.get("proto") or ""),
|
str(r.get("proto") or ""),
|
||||||
str(r.get("dport") or ""))
|
str(r.get("dport") or ""),
|
||||||
|
# Le devis dit `icmp_type`, l'API de Proxmox rend `icmp-type`.
|
||||||
|
str(r.get("icmp_type") or r.get("icmp-type") or ""))
|
||||||
|
|
||||||
|
|
||||||
def _prefixes_retires() -> tuple[str, ...]:
|
def _prefixes_retires() -> tuple[str, ...]:
|
||||||
|
|
@ -260,7 +262,8 @@ def appliquer(api: Cluster, p: dict) -> int:
|
||||||
for r in g["regles"]:
|
for r in g["regles"]:
|
||||||
corps = {"type": str(r.get("sens", "in")).lower(), "action": r["action"],
|
corps = {"type": str(r.get("sens", "in")).lower(), "action": r["action"],
|
||||||
"enable": 1, "comment": str(r.get("via") or g.get("role", ""))[:100]}
|
"enable": 1, "comment": str(r.get("via") or g.get("role", ""))[:100]}
|
||||||
for cle, champ in (("source", "source"), ("proto", "proto"), ("dport", "dport")):
|
for cle, champ in (("source", "source"), ("proto", "proto"), ("dport", "dport"),
|
||||||
|
("icmp_type", "icmp-type")):
|
||||||
if r.get(cle):
|
if r.get(cle):
|
||||||
corps[champ] = r[cle]
|
corps[champ] = r[cle]
|
||||||
_fait(api(f"/cluster/firewall/groups/{n}", "POST", corps), f"regle de {n}")
|
_fait(api(f"/cluster/firewall/groups/{n}", "POST", corps), f"regle de {n}")
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,21 @@ def _ports(fl: dict) -> list[str]:
|
||||||
return fixes
|
return fixes
|
||||||
|
|
||||||
|
|
||||||
|
def _cibles(fl: dict) -> list[dict]:
|
||||||
|
"""Ce qu'une regle vise : un port TCP/UDP, ou un TYPE ICMP.
|
||||||
|
|
||||||
|
L'ICMP N'A PAS DE PORT (2026-09-28). Un flux `protocole: icmp` porte son type dans
|
||||||
|
`port` (`echo-request`). `_ports` ne garde que les nombres : le type etait range parmi
|
||||||
|
les « ports derives » et le flux SAUTE. Le ping de supervision, pourtant declare par
|
||||||
|
`serveur_debian`, n'a donc jamais eu de regle ; la premiere VM passee en `REJECT` est
|
||||||
|
devenue « morte » pour Icinga (100 % de pertes) tout en servant parfaitement.
|
||||||
|
"""
|
||||||
|
if str(fl.get("protocole", "tcp")).lower() == "icmp":
|
||||||
|
p = fl["port"]
|
||||||
|
return [{"proto": "icmp", "icmp_type": str(t)} for t in (p if isinstance(p, list) else [p])]
|
||||||
|
return [{"proto": fl.get("protocole", "tcp"), "dport": port} for port in _ports(fl)]
|
||||||
|
|
||||||
|
|
||||||
def construire(tenants: list[tuple[str, str, dict]]) -> dict:
|
def construire(tenants: list[tuple[str, str, dict]]) -> dict:
|
||||||
"""Le devis, en structure. Un bloc par tenant federe."""
|
"""Le devis, en structure. Un bloc par tenant federe."""
|
||||||
flux_par_role = charger_flux()
|
flux_par_role = charger_flux()
|
||||||
|
|
@ -201,11 +216,11 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict:
|
||||||
if not admin_de(nom):
|
if not admin_de(nom):
|
||||||
continue
|
continue
|
||||||
utilises.add(cle)
|
utilises.add(cle)
|
||||||
for port in _ports(fl):
|
for cible in _cibles(fl):
|
||||||
regles.append({
|
regles.append({
|
||||||
"action": "ACCEPT", "sens": "IN",
|
"action": "ACCEPT", "sens": "IN",
|
||||||
"source": f"+{cle}", "via": "administration",
|
"source": f"+{cle}", "via": "administration",
|
||||||
"proto": fl.get("protocole", "tcp"), "dport": port,
|
**cible,
|
||||||
"raison": fl.get("raison", ""),
|
"raison": fl.get("raison", ""),
|
||||||
})
|
})
|
||||||
continue
|
continue
|
||||||
|
|
@ -217,12 +232,11 @@ def construire(tenants: list[tuple[str, str, dict]]) -> dict:
|
||||||
utilises.add(cle)
|
utilises.add(cle)
|
||||||
else:
|
else:
|
||||||
source, via = ",".join(srcs_pair), pair
|
source, via = ",".join(srcs_pair), pair
|
||||||
for port in _ports(fl):
|
for cible in _cibles(fl):
|
||||||
regles.append({
|
regles.append({
|
||||||
"action": "ACCEPT", "sens": "IN",
|
"action": "ACCEPT", "sens": "IN",
|
||||||
"source": source, "via": via,
|
"source": source, "via": via,
|
||||||
"proto": fl.get("protocole", "tcp"),
|
**cible,
|
||||||
"dport": port,
|
|
||||||
"raison": fl.get("raison", ""),
|
"raison": fl.get("raison", ""),
|
||||||
})
|
})
|
||||||
# GARDE ANTI-LOCKOUT. Le plan de gestion du tenant est resolu en
|
# GARDE ANTI-LOCKOUT. Le plan de gestion du tenant est resolu en
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue