Wissensdatenbank

Eine vernünftige nftables-Grundlage

Ein Default-Drop-Regelsatz, der erlaubt, was eine Instanz wirklich braucht, SSH rate-limitiert und Sie nicht aussperrt, während Sie noch daran schreiben.

Eine Firewall, nicht zwei

Debian 13 liefert nftables mit einer /etc/nftables.conf und einem Dienst, der sie lädt. AlmaLinux 10 liefert firewalld auf nftables, und sein Dienst liest, was /etc/sysconfig/nftables.conf einbezieht. Wählen Sie eine. firewalld neben einem handgeschriebenen Regelsatz zu betreiben erzeugt einen Regelsatz, den keiner von Ihnen geschrieben hat.

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

Der Regelsatz

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

Die Teile, die die Leute falsch machen:

  • ICMPv6 wird absichtlich pauschal akzeptiert. Neighbour Discovery und Packet-Too-Big leben beide dort, und das manuelle Filtern bricht IPv6 auf eine Weise, die sich anderthalb Tage lang als Anwendungsfehler präsentiert.
  • Die ssh_flood-Menge fügt jede Adresse, die sechs neue Verbindungen pro Minute überschreitet, einer Timeout-Liste von einer Stunde hinzu. Kein Log-Parser, kein Cron-Job, kein zweiter Daemon.
  • Für IPv6 duplizieren Sie die Menge mit type ipv6_addr und die Regel mit ip6 saddr. Mengen sind single-family.
  • udp dport 443 ist für QUIC da. Löschen Sie es, wenn Sie es nicht bedienen.

Laden, ohne sich auszusperren

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

Der erste Befehl plant eine transiente Unit, die den Regelsatz in zwei Minuten leert, und gibt ihren Namen aus. Öffnen Sie eine neue Sitzung. Wenn es funktioniert, stoppen Sie den Timer:

systemctl stop run-u1234.timer

Wenn es nicht funktioniert, warten Sie, und die Maschine lässt Sie von selbst wieder herein. Ein leerer Regelsatz bedeutet keine Filterung, also machen Sie die Arbeit fertig, anstatt sie über Nacht stehen zu lassen.

Prüfen, was es tatsächlich tut

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

-a gibt Handles aus, wie eine einzelne Regel entfernt wird, ohne die Datei neu zu schreiben:

nft delete rule inet filter input handle 12

Zähler beantworten die Frage, die niemand stellt: Eine Regel, die nach einer Woche auf Null steht, ist entweder falsch oder unnötig, und beides ist wissenswert.

Tracing

Wenn ein Paket sich weigert, sich so zu verhalten, wie der Regelsatz es sagt:

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

Löschen Sie die Trace-Regel danach. Sie ist billig, nicht kostenlos.

Wofür eine Host-Firewall nicht ist

Sie filtert Richtlinie, nicht Fluten. Volumetrische Angriffe werden am Rand abgeworfen, lange bevor sie Ihren Port erreichen, und eine Regel auf der Instanz würde nur Ihre CPU für Pakete ausgeben, die bereits behandelt wurden. Details zum DDoS-Schutz.

Persistieren

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

Setzen Sie die Shebang- und die flush ruleset-Zeile wieder an den Anfang der exportierten Datei. Ohne sie hängt der nächste Ladevorgang an den laufenden Regelsatz an, anstatt ihn zu ersetzen, und jede Regel, die Sie haben, erscheint doppelt.

Bereit, wenn Sie es sind

Wählen Sie eine Stadt. Wählen Sie eine Größe. Bezahlen Sie in Coins.

Keine Formulare darüber, wer Sie sind, kein Warten auf einen Menschen, der Sie genehmigt, kein Anruf zur Verifizierung. Die Rechnung wird beglichen, und die Zugangsdaten landen in Ihrem Posteingang.