Base di conoscenza

Una baseline nftables sensata

Un ruleset default-drop che consente ciò di cui un'istanza ha realmente bisogno, limita la velocità di SSH e non ti chiude fuori mentre lo stai ancora scrivendo.

Un firewall, non due

Debian 13 include nftables con /etc/nftables.conf e un servizio che lo carica. AlmaLinux 10 include firewalld sopra nftables, e il suo servizio legge ciò che /etc/sysconfig/nftables.conf include. Scegline uno. Far girare firewalld insieme a un ruleset scritto a mano produce un ruleset che nessuno dei due ha scritto.

systemctl disable --now firewalld     # AlmaLinux, if going manual
systemctl enable --now nftables

Il ruleset

#!/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;
  }
}

Le parti che la gente sbaglia:

  • ICMPv6 è accettato del tutto di proposito. Il neighbor discovery e packet-too-big vivono entrambi lì, e filtrarli a mano rompe IPv6 in modi che sembrano un bug dell'applicazione per un giorno e mezzo.
  • Il set ssh_flood aggiunge qualsiasi indirizzo che supera sei nuove connessioni al minuto a una lista di timeout di un'ora. Nessun parser di log, nessun cron job, nessun secondo demone.
  • Per IPv6, duplica il set con type ipv6_addr e la regola con ip6 saddr. I set sono a famiglia singola.
  • udp dport 443 è lì per QUIC. Eliminalo se non lo servi.

Caricalo senza chiuderti fuori

systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.conf

Il primo comando pianifica una unit transitoria che pulisce il ruleset in due minuti e stampa il suo nome. Apri una nuova sessione. Se funziona, ferma il timer:

systemctl stop run-u1234.timer

Se non funziona, aspetta, e la macchina ti fa rientrare da sola. Un ruleset vuoto significa nessun filtraggio, quindi finisci il lavoro piuttosto che lasciarlo lì per la notte.

Controlla cosa sta facendo realmente

nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood

-a stampa gli handle, che è come si rimuove una singola regola senza riscrivere il file:

nft delete rule inet filter input handle 12

I contatori rispondono alla domanda che nessuno fa: una regola a zero dopo una settimana è o sbagliata o non necessaria, ed entrambe le cose valgono la pena di essere conosciute.

Tracciamento

Quando un pacchetto rifiuta di comportarsi come dice il ruleset:

nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor trace

Elimina la regola di trace dopo. È economica, non gratuita.

A cosa non serve un firewall host

Filtra policy, non flood. Gli attacchi volumetrici vengono eliminati al confine molto prima di raggiungere la tua porta, e una regola sull'istanza spenderebbe solo CPU su pacchetti già gestiti. Dettagli su protezione DDoS.

Persistilo

nft list ruleset > /etc/nftables.conf
systemctl restart nftables

Rimetti lo shebang e la riga flush ruleset in cima al file esportato. Senza di essi il prossimo caricamento aggiunge al ruleset in esecuzione invece di sostituirlo, e ogni regola che hai appare due volte.

Pronto quando lo sei

Scegli una città. Scegli una dimensione. Paga in criptovaluta.

Nessun modulo su chi sei, nessuna attesa per l'approvazione di una persona, nessuna chiamata per verificare nulla. La fattura viene saldata e le credenziali arrivano nella tua casella di posta.