Un pare-feu, pas deux
Debian 13 fournit nftables avec un /etc/nftables.conf et un service qui le charge. AlmaLinux 10 fournit firewalld au-dessus de nftables, et son service lit ce que /etc/sysconfig/nftables.conf inclut. Choisissez-en un. Exécuter firewalld en parallèle d'un ensemble de règles écrit à la main produit un ensemble de règles que ni l'un ni l'autre n'a écrit.
systemctl disable --now firewalld # AlmaLinux, if going manual
systemctl enable --now nftablesL'ensemble de règles
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ssh_flood {
type ipv4_addr
flags dynamic, timeout
timeout 1h
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
ip6 nexthdr ipv6-icmp accept
tcp dport 22 ct state new add @ssh_flood { ip saddr limit rate over 6/minute } drop
tcp dport 22 accept
tcp dport { 80, 443 } accept
udp dport 443 accept
counter comment "dropped by policy"
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}Les parties que les gens se trompent :
- ICMPv6 est accepté en bloc exprès. La découverte de voisinage et packet-too-big vivent là, et les filtrer à la main casse IPv6 d'une manière qui se présente comme un bug d'application pendant une journée et demie.
- L'ensemble
ssh_floodajoute toute adresse dépassant six nouvelles connexions par minute à une liste de temporisation d'une heure. Pas d'analyseur de journaux, pas de cron, pas de second démon. - Pour IPv6, dupliquez l'ensemble avec
type ipv6_addret la règle avecip6 saddr. Les ensembles sont mono-famille. udp dport 443est là pour QUIC. Supprimez-le si vous ne le servez pas.
Chargez-le sans vous verrouiller dehors
systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.confLa première commande planifie une unité transitoire qui efface l'ensemble de règles en deux minutes et imprime son nom. Ouvrez une nouvelle session. Si ça marche, arrêtez la minuterie :
systemctl stop run-u1234.timerSi ça ne marche pas, attendez, et la machine vous laisse rentrer toute seule. Un ensemble de règles vide signifie aucun filtrage, alors terminez le travail plutôt que de le laisser là pendant la nuit.
Vérifiez ce qu'il fait réellement
nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood-a affiche les poignées, ce qui permet de retirer une seule règle sans réécrire le fichier :
nft delete rule inet filter input handle 12Les compteurs répondent à la question que personne ne pose : une règle à zéro après une semaine est soit fausse, soit inutile, et les deux valent la peine d'être connus.
Trace
Quand un paquet refuse de se comporter comme l'ensemble de règles le dit :
nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor traceSupprimez la règle de trace après. Elle est bon marché plutôt que gratuite.
Ce qu'un pare-feu hôte n'est pas pour
Il filtre la politique, pas les inondations. Les attaques volumétriques sont arrêtées à la périphérie bien avant d'atteindre votre port, et une règle sur l'instance ne ferait que dépenser votre CPU sur des paquets déjà traités. Détails sur protection DDoS.
Persistez-le
nft list ruleset > /etc/nftables.conf
systemctl restart nftablesRemettez le shebang et la ligne flush ruleset en haut du fichier exporté. Sans eux, le prochain chargement ajoute à l'ensemble de règles en cours au lieu de le remplacer, et chaque règle que vous avez apparaît deux fois.