Proč je nftables v roce 2026 standardem linuxového firewallu
Pokud stále spravujete pravidla firewallu pomocí příkazu iptables, je nejvyšší čas to přehodnotit. Vážně. Od roku 2014, kdy bylo nftables začleněno do jádra Linuxu (verze 3.13), prošel tento framework obrovským vývojem. A v roce 2026? Je to už výchozí firewallové řešení na všech hlavních distribucích — Debian 12+, Ubuntu 22.04+, RHEL 9/10, Fedora 39+ i AlmaLinux 9.
Co je na tom vtipné — ten příkaz iptables, který na těchto systémech spouštíte, je ve skutečnosti iptables-nft. Tedy kompatibilní vrstva, která tiše překládá starou syntaxi do nftables pravidel. Vlastně už nftables používáte, jen o tom možná nevíte.
Podle bezpečnostních statistik z roku 2025 bylo 79 % útoků na linuxové servery provedeno bez malwaru. Útočníci jednoduše zneužívali chybné konfigurace a ukradené přihlašovací údaje. Správně nakonfigurovaný firewall s principem default-deny je proto ta úplně první a nejdůležitější vrstva ochrany.
V tomto průvodci projdeme celý proces — od instalace nftables přes migraci z iptables, praktickou konfiguraci produkčního firewallu, pokročilé techniky jako rate limiting a geo-blocking, až po integraci s Dockerem a Podmanem. Tak pojďme na to.
Instalace a základní nastavení nftables
Instalace podle distribuce
Na většině moderních distribucí je nftables už předinstalováno. Pokud ne (nebo si nejste jistí), nainstalujte ho a aktivujte službu:
# Debian / Ubuntu
sudo apt install nftables
sudo systemctl enable --now nftables
# RHEL / AlmaLinux / Rocky Linux / Fedora
sudo dnf install nftables
sudo systemctl enable --now nftables
# Arch Linux
sudo pacman -S nftables
sudo systemctl enable --now nftables
Ověření instalace a verze
Po instalaci si ověřte, že všechno běží jak má:
# Zobrazení verze
nft --version
# nft v1.1.1 (Broken Joe)
# Zobrazení aktuální sady pravidel
sudo nft list ruleset
# Ověření, že služba běží
sudo systemctl status nftables
Důležité: Vypněte ostatní firewallové služby
Tohle je věc, na kterou se často zapomíná. Na jednom systému by měla běžet pouze jedna firewallová služba. Pokud chcete používat nftables přímo, musíte vypnout firewalld a iptables:
# Zastavení a deaktivace firewalld (pokud je nainstalován)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask firewalld
# Zastavení a deaktivace iptables (pokud je nainstalován)
sudo systemctl stop iptables
sudo systemctl disable iptables
Poznámka: Na RHEL/Fedora systémech můžete alternativně ponechat firewalld, který od verze 0.6.0 používá nftables jako výchozí backend. V tom případě ale spravujte pravidla přes firewall-cmd a nesahejte na nftables přímo — jinak si koledujete o problémy.
Architektura nftables: Tabulky, řetězce a pravidla
Tady je asi největší konceptuální rozdíl oproti iptables. V iptables máte předdefinované tabulky (filter, nat, mangle) a řetězce (INPUT, OUTPUT, FORWARD). V nftables neexistují žádné výchozí struktury. Vůbec nic. Všechno si vytváříte sami od nuly.
Na první pohled to může vypadat jako zbytečná práce navíc. Ale upřímně? Ta flexibilita za to stojí.
Rodiny adres (Address Families)
Každá tabulka patří k jedné rodině adres:
- ip — pouze IPv4 (výchozí)
- ip6 — pouze IPv6
- inet — IPv4 i IPv6 současně (doporučeno pro většinu nasazení)
- arp — ARP pakety
- bridge — přemostěný provoz
- netdev — ingress/egress na úrovni síťového zařízení
Pro většinu serverových scénářů používejte rodinu inet. Zpracovává IPv4 i IPv6 v jediné sadě pravidel, takže nemusíte udržovat dvě oddělené konfigurace.
Typy řetězců a háčky (Hooks)
Základní (base) řetězce se připojují k háčkům v Netfilteru:
- input — pakety určené pro lokální systém
- output — pakety generované lokálním systémem
- forward — pakety směrované přes systém
- prerouting — pakety před rozhodnutím o směrování (pro NAT)
- postrouting — pakety po rozhodnutí o směrování (pro NAT)
Regulární řetězce (bez háčku) slouží k organizaci pravidel pomocí příkazů jump a goto. Berte je jako funkce, které voláte z hlavních řetězců.
Priorita řetězců
Priorita určuje pořadí vyhodnocování řetězců se stejným háčkem. Nižší číslo = vyšší priorita. Tady jsou běžné hodnoty:
- -300 — raw (conntrack bypass)
- -200 — mangle
- -100 — dstnat (DNAT)
- 0 — filter (výchozí pro filtrování)
- 100 — srcnat (SNAT/masquerade)
Praktická konfigurace produkčního firewallu
Dost bylo teorie. Tady je kompletní produkční konfigurace firewallu pro webový server s SSH přístupem. Tohle je základ, ze kterého vycházím na většině svých serverů. Uložte si to do souboru /etc/nftables.conf:
#!/usr/sbin/nft -f
# Vyčištění stávající sady pravidel
flush ruleset
# Hlavní firewallová tabulka (IPv4 + IPv6)
table inet firewall {
# Sada důvěryhodných IP adres pro SSH
set ssh_allowed {
type ipv4_addr
flags interval
elements = {
10.0.0.0/8,
172.16.0.0/12,
192.168.0.0/16
}
}
# Sada blokovaných IP adres (dynamicky aktualizovatelná)
set blocklist {
type ipv4_addr
flags dynamic, timeout
timeout 24h
}
# Vstupní řetězec — filtrování příchozího provozu
chain input {
type filter hook input priority 0; policy drop;
# Povolení loopback rozhraní
iif "lo" accept
# Zablokování adres z blacklistu
ip saddr @blocklist drop
# Povolení navázaných a souvisejících spojení
ct state established,related accept
# Zahození neplatných paketů
ct state invalid drop
# ICMP — povolení pingu a nezbytných zpráv
ip protocol icmp icmp type {
echo-request,
echo-reply,
destination-unreachable,
time-exceeded
} accept
# ICMPv6 — nezbytné pro fungování IPv6
ip6 nexthdr icmpv6 icmpv6 type {
echo-request,
echo-reply,
nd-neighbor-solicit,
nd-neighbor-advert,
nd-router-solicit,
nd-router-advert,
destination-unreachable,
packet-too-big,
time-exceeded
} accept
# SSH — pouze z důvěryhodných sítí
tcp dport 22 ip saddr @ssh_allowed accept
# HTTP a HTTPS — veřejně přístupné
tcp dport { 80, 443 } accept
# Logování zamítnutých paketů (s omezením frekvence)
limit rate 5/minute burst 10 packets log prefix "nft-dropped: " level info
# Vše ostatní je zahozeno (policy drop)
}
# Výstupní řetězec — povolení odchozího provozu
chain output {
type filter hook output priority 0; policy accept;
}
# Forward řetězec — zakázání přesměrování
chain forward {
type filter hook forward priority 0; policy drop;
}
}
# NAT tabulka (pokud server funguje jako brána)
# table inet nat {
# chain prerouting {
# type nat hook prerouting priority -100; policy accept;
# }
# chain postrouting {
# type nat hook postrouting priority 100; policy accept;
# # Masquerade pro lokální síť
# oifname "eth0" masquerade
# }
# }
Všimněte si pár věcí. Dynamický blocklist s 24hodinovým timeoutem je velmi užitečný — můžete do něj přidávat IP adresy automaticky (třeba z fail2ban nebo vlastního skriptu) a po 24 hodinách se samy odstraní. Set ssh_allowed omezuje SSH přístup jen na důvěryhodné sítě, což je v produkci naprosto zásadní.
Aktivace a ověření konfigurace
# Validace konfigurace bez aplikace
sudo nft -c -f /etc/nftables.conf
# Aplikace konfigurace
sudo nft -f /etc/nftables.conf
# Ověření aktivních pravidel
sudo nft list ruleset
# Bezpečnostní pojistka — automatický flush po 5 minutách
# (spusťte z konzole, ne přes SSH!)
sudo nft -f /etc/nftables.conf && sleep 300 && sudo nft flush ruleset
Ta poslední bezpečnostní pojistka je geniální trik pro vzdálené servery. Pokud se novými pravidly zamknete, po 5 minutách se všechno automaticky vyčistí a zase se dostanete dovnitř. Sám jsem se díky tomu zachránil víc, než bych chtěl přiznat.
Migrace z iptables na nftables
Pokud přecházíte z existující konfigurace iptables, mám dobrou zprávu — tým Netfilter vytvořil překladové nástroje, které migraci výrazně zjednodušují. Nemusíte přepisovat všechno ručně.
Krok 1: Záloha stávajících pravidel
Než cokoliv začnete měnit, zálohujte. Vždycky.
# Záloha IPv4 pravidel
sudo iptables-save > ~/iptables-backup-v4.rules
# Záloha IPv6 pravidel
sudo ip6tables-save > ~/iptables-backup-v6.rules
Krok 2: Překlad jednotlivých pravidel
Nástroj iptables-translate převede jedno pravidlo iptables na syntaxi nftables. Je to skvělý způsob, jak se naučit novou syntaxi — prostě vezmete pravidlo, které znáte, a podíváte se, jak vypadá v nftables:
# Příklad překladu
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Výstup: nft add rule ip filter INPUT tcp dport 22 counter accept
iptables-translate -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
# Výstup: nft add rule ip filter INPUT ip saddr 192.168.1.0/24 tcp dport 80 counter accept
Krok 3: Hromadný překlad celé sady pravidel
# Překlad celé zálohy do nftables formátu
iptables-restore-translate -f ~/iptables-backup-v4.rules > ~/nftables-rules.nft
# Kontrola výsledného souboru
cat ~/nftables-rules.nft
# Aplikace přeložených pravidel
sudo nft -f ~/nftables-rules.nft
Krok 4: Přechod služeb
# Zastavení iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
# Aktivace nftables
sudo systemctl enable --now nftables
# Ověření
sudo nft list ruleset
Důležité upozornění: Po migraci používejte výhradně příkazy nft. Spouštění příkazů iptables na systému s nftables vede ke konfliktům — kompatibilní vrstva iptables-nft tiše překládá příkazy a vytváří duplicitní pravidla. A věřte mi, ladění duplicitních firewallových pravidel není zrovna příjemný páteční večer.
Pokročilé techniky: Sety, mapy a rate limiting
Sety — efektivní správa skupin adres a portů
Sety (množiny) jsou podle mě jedna z největších výhod nftables oproti iptables. A důvod je prostý — interně používají hashovací tabulky, takže vyhledávání probíhá v konstantním čase O(1). To znamená, že set s 10 000 adresami je stejně rychlý jako set s 10. U iptables byste potřebovali 10 000 pravidel a lineární průchod přes každý paket.
# Pojmenovaný set s IP adresami
nft add set inet firewall trusted_ips {
type ipv4_addr\;
flags interval\;
elements = { 10.0.0.0/8, 172.16.0.0/12 }\;
}
# Set s TCP porty
nft add set inet firewall allowed_ports {
type inet_service\;
elements = { 22, 80, 443, 8080 }\;
}
# Použití setů v pravidlech
nft add rule inet firewall input ip saddr @trusted_ips tcp dport @allowed_ports accept
Mapy — mapování hodnot na akce
Mapy (verdict maps) umožňují přiřadit různé akce různým hodnotám v jediném pravidle. Místo pěti pravidel pro pět portů máte jedno:
# Mapa portů na verdikty
nft add map inet firewall port_policy {
type inet_service : verdict\;
}
nft add element inet firewall port_policy {
22 : jump ssh_chain,
80 : accept,
443 : accept,
8080 : drop
}
# Použití mapy v pravidle
nft add rule inet firewall input tcp dport vmap @port_policy
Rate limiting — ochrana před DDoS a brute-force útoky
A teď k tomu opravdu zajímavému. nftables nabízí několik přístupů k omezení frekvence spojení a kombinace těchto technik dokáže zastavit většinu běžných útoků:
# Globální rate limit na SSH (max 10 nových spojení za minutu)
nft add rule inet firewall input tcp dport 22 ct state new \
limit rate 10/minute accept
# Per-IP rate limit pomocí meteru
nft add rule inet firewall input tcp dport 22 ct state new \
meter ssh_meter { ip saddr limit rate 3/minute burst 5 packets } accept
# Omezení současných spojení z jedné IP
nft add rule inet firewall input tcp dport 22 \
meter ssh_conn { ip saddr ct count over 2 } reject
# Dynamický blacklist — automatické blokování útočníků
nft add set inet firewall ssh_attackers {
type ipv4_addr\;
flags dynamic, timeout\;
timeout 1h\;
}
nft add rule inet firewall input tcp dport 22 ct state new \
meter ssh_rate { ip saddr limit rate over 10/minute } \
add @ssh_attackers { ip saddr timeout 1h } \
log prefix "nft-ssh-blocked: " drop
# Blokování adres v dynamickém blacklistu
nft add rule inet firewall input ip saddr @ssh_attackers drop
Ten dynamický blacklist na konci je obzvlášť silný. Kdokoliv překročí 10 pokusů o SSH spojení za minutu, automaticky skončí v blacklistu na hodinu. Žádný fail2ban, žádný externí skript — všechno se děje přímo v kernelu.
Geo-blocking — blokování provozu podle země
Pro blokování provozu podle geolokace můžete využít nástroj nft-geo-filter. Hodí se třeba v situacích, kdy víte, že vaše služba obsluhuje jen konkrétní region:
# Instalace nft-geo-filter
git clone https://github.com/rpthms/nft-geo-filter.git
cd nft-geo-filter
# Blokování provozu z konkrétních zemí
# (XX a YY nahraďte ISO-3166-1 kódy zemí)
sudo ./nft-geo-filter --table-family netdev --interface eth0 XX YY
# Povolení provozu pouze z vybraných zemí
sudo ./nft-geo-filter --table-family netdev --interface eth0 --allow CZ SK DE AT
# Výjimky pro konkrétní IP adresy
sudo ./nft-geo-filter --table-family netdev --interface eth0 --allow CZ \
--exceptions 203.0.113.50,198.51.100.25
Nástroj vytváří samostatnou nftables tabulku, takže nenarušuje vaši stávající konfiguraci. Pěkný detail.
Integrace nftables s Dockerem a Podmanem
Docker a nftables
Tohle byl dlouhou dobu bolestivý bod. Docker tradičně manipuloval s iptables pravidly a nftables ignoroval. Naštěstí od verze 29.0 Docker podporuje nftables jako experimentální backend. Aktivace je jednoduchá — stačí přidat do /etc/docker/daemon.json:
{
"firewall-backend": "nftables"
}
Po restartu Docker démona se iptables řetězce nahradí nftables pravidly. Docker si vytváří pravidla v tabulce s vlastní strukturou a pro bridge sítě generuje pravidla v síťovém jmenném prostoru hostitele.
Vlastní pravidla pro Docker kontejnery
V iptables jste mohli přidávat pravidla do řetězce DOCKER-USER. V nftables si vytvoříte vlastní tabulku s odpovídající prioritou (záporná hodnota zajistí vyhodnocení před Docker pravidly):
# Vlastní tabulka pro filtrování Docker provozu
table inet docker_filter {
# Řetězec s nižší prioritou než Docker (vyhodnotí se dříve)
chain docker_input {
type filter hook forward priority -10; policy accept;
# Blokování přístupu k interním službám zvenčí
iifname "eth0" oifname "docker0" tcp dport 3306 drop
iifname "eth0" oifname "docker0" tcp dport 6379 drop
# Povolení pouze HTTP/HTTPS z internetu
iifname "eth0" oifname "docker0" tcp dport { 80, 443 } accept
}
}
Podman a Netavark
Podman na tom je o něco lépe. Používá pro síťování Netavark, který od verze 1.10 podporuje nftables nativně. Pro aktivaci upravte konfiguraci v /etc/containers/containers.conf:
[network]
firewall_driver = "nftables"
Výhody nftables backendu v Netavarku:
- Rychlejší spouštění kontejnerů — nftables umožňuje dávkové vkládání pravidel
- Méně konfliktů — všechna pravidla jsou v tabulce
netavark - Čistší koexistence — rootless Podman nemodifikuje pravidla firewallu vůbec
Upozornění: Pokud používáte rootful Podman i Docker současně (což se občas stane v testovacích prostředích), Docker přidává iptables pravidlo blokující veškerý forwarding. Buď přidejte explicitní povolení pro Podman provoz, nebo — a to je asi rozumnější — používejte výhradně jeden kontejnerový runtime.
Monitorování, ladění a audit pravidel
Sledování provozu v reálném čase
nftables má vestavěný systém trasování, který je při ladění neocenitelný. Můžete sledovat, jak přesně jsou pakety zpracovávány:
# Aktivace trasování pro konkrétní provoz
nft add rule inet firewall input tcp dport 22 meta nftrace set 1
# Sledování trasovacích událostí v reálném čase
nft monitor trace
# Deaktivace trasování (odstraněním pravidla)
nft delete rule inet firewall input handle <číslo_handle>
Tip: nezapomeňte trasování po ladění zase vypnout. Nechávat ho zapnuté v produkci zbytečně zatěžuje systém.
Zobrazení statistik pravidel
# Přidání počítadel ke všem pravidlům
nft add rule inet firewall input tcp dport 22 counter accept
# Zobrazení pravidel s počítadly a handle čísly
nft -a list ruleset
nft list chain inet firewall input
# Vynulování počítadel
nft reset counters
Logování s omezením frekvence
# Logování odmítnutých paketů (max 5 za minutu)
nft add rule inet firewall input limit rate 5/minute burst 10 packets \
log prefix "nft-input-drop: " level warn counter
# Sledování logů
journalctl -k --grep="nft-" --follow
To omezení frekvence logování je důležité. Bez něj vám při DDoS útoku logy zaplaví disk rychleji, než stačíte mrknout.
Export a záloha pravidel
# Export aktuální sady pravidel
nft list ruleset > /root/nftables-backup-$(date +%Y%m%d).conf
# Export ve formátu JSON (pro programové zpracování)
nft -j list ruleset > /root/nftables-backup.json
# Obnova ze zálohy
nft -f /root/nftables-backup-20260320.conf
Výkonnostní srovnání: nftables vs. iptables
Jestli vás zajímají tvrdá data, tady jsou. Podle testů Red Hat a nezávislých výzkumů:
| Parametr | iptables | nftables |
|---|---|---|
| Škálovatelnost pravidel | Lineární degradace O(n) | Konstantní výkon se sety O(1) |
| Využití CPU | Vyšší | Nižší |
| Unifikace IPv4/IPv6 | Dva oddělené nástroje | Jeden framework (inet) |
| Atomické aktualizace | Ne — reload celé sady | Ano — přidání/odebrání bez přerušení |
| Vestavěné sety | Ne (vyžaduje ipset) | Ano — nativní podpora |
| Trasování a ladění | Omezené | Vestavěný nftrace |
| Budoucí vývoj | Zastaralé (legacy) | Aktivní vývoj |
Klíčový závěr? Při více než 120 individuálních pravidlech pro porty nebo adresy je nftables jednoznačně rychlejší díky hashovacím tabulkám v setech. Při menších sadách pravidel je výkon srovnatelný, ale nftables přináší výrazně lepší správu a čitelnost. A vzhledem k tomu, že iptables je oficiálně v režimu údržby bez nových funkcí, otázka „jestli" migrovat se mění na „kdy".
Nejčastější chyby při konfiguraci nftables
Než skončíme, projděme si chyby, na které narazíte skoro jistě (nebo jste na ně už narazili). Vycházím z vlastní zkušenosti i z hlášení na komunitních fórech:
- Chybějící pravidlo pro ESTABLISHED/RELATED — tahle klasika. Bez tohoto pravidla budou blokovány odpovědi na legitimní spojení. HTTP odpovědi, DNS odpovědi, prostě všechno. Vždy dávejte
ct state established,related acceptna začátek vstupního řetězce. - Míchání iptables a nftables — použití obou frameworků současně vytváří nekonzistentní sady pravidel. Po migraci se držte výhradně
nft. - Testování pouze z localhostu — pravidla INPUT se na loopback rozhraní neuplatňují. Takže si myslíte, že všechno funguje, a pak se divíte, proč se klienti nemohou připojit. Vždy testujte z externího stroje.
- Zapomenutí na IPv6 — pokud používáte rodinu
ipmístoinet, IPv6 provoz zůstává kompletně nefiltrován. To je bezpečnostní díra, kterou si nemůžete dovolit. - Příliš komplexní pravidla — místo desítek jednotlivých pravidel využijte sety a mapy. Budete mít lepší přehled a lepší výkon.
Často kladené otázky (FAQ)
Jaký je rozdíl mezi nftables a iptables?
nftables je nástupce iptables zabudovaný v jádře Linuxu od verze 3.13. Hlavní rozdíly: nftables používá jednotný framework pro IPv4 i IPv6, nabízí lepší výkon díky nativním setům a mapám, podporuje atomické aktualizace pravidel bez přerušení provozu a má čistší deklarativní syntaxi. iptables je považováno za zastaralé a na moderních distribucích je příkaz iptables ve skutečnosti jen kompatibilní vrstvou překládající do nftables.
Mohu používat nftables společně s firewalld?
Ano, ale s podmínkou. firewalld od verze 0.6.0 používá nftables jako výchozí backend. Pokud používáte firewalld, spravujte pravidla přes firewall-cmd a nesahejte na nftables tabulky přímo — jinak hrozí konflikty. Pokud chcete plnou kontrolu nad nftables, vypněte firewalld a spravujte si pravidla přímo přes nft a konfigurační soubor /etc/nftables.conf.
Jak zajistím, že se pravidla nftables načtou po restartu serveru?
Pravidla uložte do souboru /etc/nftables.conf a aktivujte systémovou službu příkazem systemctl enable nftables. Služba automaticky načte konfigurační soubor při startu systému. Po každé ruční změně pravidel si nezapomeňte exportovat aktuální stav příkazem nft list ruleset > /etc/nftables.conf.
Funguje nftables s Dockerem?
Docker od verze 29.0 experimentálně podporuje nftables backend. Pro aktivaci přidejte "firewall-backend": "nftables" do /etc/docker/daemon.json. Pro starší verze Dockeru můžete vytvořit vlastní nftables tabulku s pravidly pro forward řetězec, která se vyhodnotí před nebo po Docker pravidlech podle nastavené priority.
Jak bezpečně testovat nová pravidla firewallu na vzdáleném serveru?
Použijte bezpečnostní pojistku: spusťte příkaz sudo nft -f /etc/nftables.conf && sleep 300 && sudo nft flush ruleset. Tento příkaz aplikuje nová pravidla a po 5 minutách automaticky vyčistí celou sadu pravidel — pokud se zamknete, pravidla se sama odstraní. Můžete taky nejprve validovat konfiguraci příkazem nft -c -f /etc/nftables.conf, který zkontroluje syntaxi bez aplikace změn.