#!/usr/sbin/nft -f # GENERE par scripts/resoudre_flux.py depuis les meta/flux.yml — hote site-mon-01. # Deploye par le role `nftables_baseline` en tant que /etc/nftables.conf. # Remplace UNIQUEMENT les tables setops (pas de `flush ruleset` : préserve les # tables etrangeres — DNAT/forward de conteneurs, par exemple). # # `setops_filter` est le gabarit de REPLI, pose quand aucun ruleset resolu # n'existe encore. Les deux fichiers sont des ALTERNATIVES, jamais des couches — # mais `nft -f` AJOUTE sans purger, et le repli survivait donc a la bascule. # Deux chaines `input` sur le meme hook, toutes deux en `policy drop` : le # paquet traverse les DEUX, et seule l'intersection de leurs `accept` passait. # Mesure du 2026-08-10 sur Technolibre : l'AC etait debout, sa regle 8443 posee # et acceptante, l'ICMP passait en 0,15 ms — et le TCP expirait, arrete par le # `policy drop` du repli. Chaque fichier retire donc desormais la table de # l'autre, et la bascule converge dans les deux sens. table inet setops_flux {} delete table inet setops_flux table inet setops_filter {} delete table inet setops_filter table inet setops_flux { chain input { type filter hook input priority 0; policy drop; iif "lo" accept comment "socle: communications locales" ct state established,related accept comment "socle: connexions etablies et associees" ct state invalid drop comment "socle: paquets invalides" ip protocol icmp accept comment "socle: diagnostic et erreurs reseau IPv4" ip6 nexthdr icmpv6 accept comment "socle: diagnostic et erreurs reseau IPv6" ip saddr { 10.31.0.0/24 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.31.0/24 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.31.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.32.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.33.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.34.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.35.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.36.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.37.1/32 } tcp dport 22 accept comment "administration: Garde anti-lockout, intrant nftables_admin_ssh" ip saddr { 10.31.36.11 } tcp dport 9100 accept comment "client_metrique: Scrape des métriques par Prometheus (node_exporter en HTTPS)." ip saddr { 10.31.31.11, 10.31.32.11, 10.31.33.11, 10.31.33.21, 10.31.34.11, 10.31.35.11, 10.31.36.11, 10.31.37.11, 10.31.37.21 } tcp dport 22 accept comment "serveur_debian: Plan de gestion : administration et déploiement Ansible par SSH (inter-nœud ; l'accès depuis l'extérieur..." icmp type destination-unreachable icmp code frag-needed accept comment "serveur_debian: ICMP « fragmentation nécessaire » entrant : sans lui, un distant ne peut pas nous demander de réduire no..." ip saddr { 10.31.36.11 } icmp type echo-request accept comment "serveur_debian: La supervision verifie que ce noeud repond (hostalive). Sans lui, elle le tient pour mort et supprime ses no..." ip saddr { 10.31.0.0/24, 10.31.31.0/24, 10.31.31.1/32, 10.31.32.1/32, 10.31.33.1/32, 10.31.34.1/32, 10.31.35.1/32, 10.31.36.1/32, 10.31.37.1/32, 10.31.37.11 } tcp dport 3000 accept comment "serveur_grafana: Interface web : servie via l'edge la ou il y en a un, joignable depuis le plan d'administration partout —..." ip saddr { 10.31.32.11, 10.31.33.11, 10.31.36.11 } tcp dport 5665 accept comment "serveur_icinga: Rapport passif de chaque detenteur d'etat sur SON depot distant : le depot du site heberge du chiffre et ne..." ip saddr { 10.31.35.11 } tcp dport 5665 accept comment "serveur_icinga: Le depot de sauvegarde depose ses resultats passifs (portee : process-check-result sur « sauvegarde: * »)." ip saddr { 10.31.31.11, 10.31.32.11, 10.31.33.11, 10.31.33.21, 10.31.34.11, 10.31.35.11, 10.31.36.11, 10.31.37.11, 10.31.37.21 } tcp dport 5665 accept comment "serveur_icinga: Rapport passif de sante de chaque noeud (unites systemd en echec)." ip saddr { 10.31.0.0/24, 10.31.31.0/24, 10.31.31.1/32, 10.31.32.1/32, 10.31.33.1/32, 10.31.34.1/32, 10.31.35.1/32, 10.31.36.1/32, 10.31.37.1/32, 10.31.37.11 } tcp dport 8080 accept comment "serveur_icingaweb2: Interface web servie via l'edge (TLS terminé à l'edge ; SSO possible via oauth2-proxy), et joignable d..." ip saddr { 10.31.31.11, 10.31.32.11, 10.31.33.11, 10.31.33.21, 10.31.34.11, 10.31.35.11, 10.31.36.11, 10.31.37.11, 10.31.37.21 } tcp dport 3100 accept comment "serveur_loki: Réception des journaux poussés par Alloy (client_journal) en HTTPS (http_tls_config, cert step-ca)." ip saddr { 10.0.4.1, 10.0.4.11, 10.31.0.1, 10.31.0.11, 10.31.31.1, 10.31.32.1, 10.31.33.1, 10.31.34.1, 10.31.35.1, 10.31.36.1, 10.31.37.1, 10.31.50.11, 10.31.60.2 } tcp dport 3100 accept comment "serveur_loki: Journaux des hyperviseurs. La machine qui PORTE les VM ecrivait ses journaux nulle part ailleurs que sur son p..." ip saddr { 10.0.4.1, 10.0.4.11, 10.31.0.1, 10.31.0.11, 10.31.31.1, 10.31.32.1, 10.31.33.1, 10.31.34.1, 10.31.35.1, 10.31.36.1, 10.31.37.1, 10.31.50.11, 10.31.60.2 } tcp dport 1514 accept comment "serveur_loki: Journaux de la frontiere, en TLS mutuel. Elle n'accueille aucun agent et n'emet que du syslog ; sans ce flux,..." tcp dport 25 accept comment "serveur_postfix: SMTP entrant : courrier externe (MX) et notifications internes (client_smtp)." ip saddr { 10.31.33.11, 10.31.36.11 } tcp dport 5432 accept comment "serveur_postgresql: Connexions applicatives à PostgreSQL (verify-full ; pg_hba hostssl)." ip saddr { 10.31.36.11 } tcp dport 9187 accept comment "serveur_postgresql: Metriques PostgreSQL lues par l'observatoire, en HTTPS verifie. Series, pas verdicts : ce qui derive len..." # L'INTERNE PARLE, LA BORDURE SE TAIT (2026-08-28). # # Ce qui n'est pas accepte plus haut est REFUSE A VOIX HAUTE, et ce n'est pas # le refus qui informe : c'est ce qu'il fait au TIMEOUT. Sous `drop`, un # silence voulait dire trois choses incompatibles — aucune machine, aucune # route, ou une politique. Deux erreurs de diagnostic en une journee le # 2026-08-28, dont une qui a fait appliquer un pare-feu pour reparer une # ABSENCE. Quand la politique parle, le silence ne veut plus dire qu'une # chose : il n'y a personne, ou il n'y a pas de chemin. # # `admin-prohibited` ET NON `tcp reset` : un RST est indiscernable d'un port # ferme sans service. Ce message-ci dit qu'une POLITIQUE a refuse — c'est la # seule forme qui distingue « on ne veut pas de toi » de « il n'y a rien ». # # POURQUOI C'EST PRUDENT ICI ET PAS A LA FRONTIERE : la bordure reste en # `block`, donc rien d'indeclare ne franchit le perimetre. Ce reject ne # repond jamais a l'Internet — il ne parle qu'a des pairs qui ont deja # l'adresse de cette machine dans leur `/etc/hosts` genere. L'obscurite # etait donc deja nulle entre nous : le `drop` coutait du diagnostic sans # rien acheter. Mesure du 2026-08-27 a la frontiere, qui explique l'autre # moitie du choix : 982 000 entrees par jour, dont 82 %% un balayage # Internet contre le port VNC. Repondre a chacune serait un vecteur # d'amplification, source usurpee comprise. reject with icmpx type admin-prohibited comment "socle: refus des entrees non autorisees" } # LA CHAINE `forward` RESTE MUETTE, et ce n'est pas un oubli : elle porte le # trafic qui TRAVERSE cet hote, pas celui qui lui est destine. Y repondre # ferait parler cette machine AU NOM d'une destination qui n'est pas elle — # un refus qu'on attribuerait au mauvais endroit, c'est-a-dire exactement le # defaut qu'on corrige dans `input`. chain forward { type filter hook forward priority 0; policy drop; ct state established,related accept comment "transit: connexions etablies et associees" iifname "docker0" accept comment "transit: trafic depuis le pont docker0" oifname "docker0" accept comment "transit: trafic vers le pont docker0" } chain output { type filter hook output priority 0; policy accept; } }