Knowledge base

Een verstandige nftables-basislijn

Een standaard-drop-regelset die toestaat wat een instantie daadwerkelijk nodig heeft, SSH rate-limits en je niet buiten sluit terwijl je er nog aan schrijft.

One firewall, niet twee

Debian 13 levert nftables mee met een /etc/nftables.conf en een service die het laadt. AlmaLinux 10 levert firewalld boven op nftables, en de service leest wat /etc/sysconfig/nftables.conf opneemt. Kies er één. Het draaien van firewalld naast een handgeschreven regelset levert een regelset op die geen van jullie heeft geschreven.

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

De regelset

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

De onderdelen die mensen verkeerd doen:

  • ICMPv6 wordt met opzet volledig geaccepteerd. Neighbour discovery en packet-too-big leven beide daar, en het met de hand filteren ervan breekt IPv6 op manieren die zich anderhalve dag voordoen als een applicatiefout.
  • De ssh_flood-set voegt elk adres dat meer dan zes nieuwe verbindingen per minuut overschrijdt toe aan een time-outlijst van een uur. Geen logparser, geen cron-taak, geen tweede daemon.
  • Voor IPv6 dupliceer je de set met type ipv6_addr en de regel met ip6 saddr. Sets zijn single-family.
  • udp dport 443 is er voor QUIC. Verwijder het als je het niet serveert.

Laad het zonder jezelf buiten te sluiten

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

Het eerste commando plant een tijdelijke unit die de regelset binnen twee minuten wist en de naam ervan afdrukt. Open een verse sessie. Als het werkt, stop dan de timer:

systemctl stop run-u1234.timer

Als het niet werkt, wacht dan en de machine laat je vanzelf weer binnen. Een lege regelset betekent geen filtering, dus maak het karwei af in plaats van het daar een nacht te laten staan.

Controleer wat het daadwerkelijk doet

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

-a drukt handles af, wat de manier is om een enkele regel te verwijderen zonder het bestand te herschrijven:

nft delete rule inet filter input handle 12

Counters beantwoorden de vraag die niemand stelt: een regel die na een week op nul staat is ofwel fout ofwel overbodig, en beide zijn de moeite waard om te weten.

Tracen

Wanneer een pakket weigert zich te gedragen zoals de regelset zegt dat het zou moeten:

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

Verwijder de traceregel daarna. Het is goedkoop, maar niet gratis.

Waar een hostfirewall niet voor is

Het filtert beleid, geen overstromingen. Volumetrische aanvallen worden aan de rand al tegengehouden lang voordat ze je poort bereiken, en een regel op de instantie zou alleen je CPU uitgeven aan pakketten die al waren afgehandeld. Details over DDoS-beveiliging.

Maak het persistent

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

Zet de shebang en de flush ruleset-regel terug bovenaan het geëxporteerde bestand. Zonder beide voegt de volgende keer laden toe aan de draaiende regelset in plaats van deze te vervangen, en elke regel die je hebt verschijnt twee keer.

Klaar wanneer jij dat bent

Kies een stad. Kies een formaat. Betaal in munt.

Geen formulieren over wie je bent, geen wachten op een mens die je goedkeurt, geen telefoontje om iets te verifiëren. De factuur wordt betaald en de inloggegevens belanden in je inbox.