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 nftablesDe 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_addren de regel metip6 saddr. Sets zijn single-family. udp dport 443is 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.confHet 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.timerAls 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 12Counters 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 traceVerwijder 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 nftablesZet 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.