89 lines
6.4 KiB
Text
89 lines
6.4 KiB
Text
|
|
#!/usr/sbin/nft -f
|
||
|
|
# GENERE par scripts/resoudre_flux.py depuis les meta/flux.yml — hote site-dnspub-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..."
|
||
|
|
udp dport 1053 accept comment "serveur_dns_public: Les resolveurs de l'Internet interrogent les zones publiques des locataires du site. Les reponses sont s..."
|
||
|
|
tcp dport 1053 accept comment "serveur_dns_public: Repli TCP : reponses tronquees par dnsdist (ANY, debit) et reponses signees trop grosses pour l'UDP."
|
||
|
|
ip saddr { 10.17.0.0/16, 10.23.0.0/16 } udp dport 53 accept comment "serveur_dns_public: NOTIFY des primaires des locataires du site : une zone publique a change. Le contenu d'une zone publique..."
|
||
|
|
ip saddr { 10.17.0.0/16, 10.23.0.0/16 } tcp dport 53 accept comment "serveur_dns_public: Repli TCP des notifications des primaires des locataires."
|
||
|
|
|
||
|
|
# 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; }
|
||
|
|
}
|