Uvod: Zašto je nftables standard za Linux vatrozide u 2026.
Ako još uvijek koristite iptables za upravljanje vatrozidom na svojim Linux poslužiteljima — bez uvrede, ali stvarno je krajnje vrijeme za promjenu. I ne govorim to samo zato što je "novo bolje". Same distribucije vas guraju u tom smjeru. Red Hat je službeno proglasio iptables zastarjelim u RHEL 9, a u RHEL 10 ga planiraju potpuno ukloniti. Debian 10+, Ubuntu 20.10+, Fedora, openSUSE — svi već koriste nftables kao zadani vatrozidni okvir.
Ali nftables nije samo iptables s ljepšom sintaksom. Daleko od toga. Radi se o potpuno novom motoru za obradu mrežnog prometa koji dolazi s ugrađenim podatkovnim strukturama — setovi koji rade O(1) pretraživanja, mape koje usmjeravaju pakete prema presudama, mjerači koji broje promet po IP adresi na razini jezgre. I sve to bez parsiranja logova, vanjskih skripti ili ponovnog pokretanja servisa. Kad sam prvi put vidio koliko se posla može obaviti bez ikakvih helper skripti, iskreno sam požalio što nisam prešao ranije.
U ovom vodiču prolazimo kroz sve — od osnovne konfiguracije do naprednih značajki poput verdict mapa, integracije s Dockerom i migracije s iptables. Svaki primjer je testiran i spreman za produkciju.
Ključne razlike između nftables i iptables
Prije nego krenemo u praksu, hajde da razjasnimo zašto je nftables bolji izbor. Razlike nisu kozmetičke — fundamentalno utječu na performanse i na to kako razmišljate o upravljanju pravilima.
Iptables koristi linearan model obrade. Svaki paket prolazi kroz svako pravilo redom dok ne pronađe podudaranje. Imate 200 pravila? Svaki paket prolazi kroz svih 200 provjera. To je onako... ne baš elegantno. S nftables, ugrađeni setovi koriste hash tablice u pozadini, što znači da se pretraživanje obavlja u konstantnom vremenu, neovisno imate li 5 ili 5000 elemenata.
Druga ključna razlika je atomičnost. Iptables API ne podržava inkrementalne promjene — za dodavanje jednog pravila, binary mora preuzeti čitav ruleset iz jezgre, modificirati ga i ponovo ga učitati. Zvuči bezopasno dok vam se jednog dana ne dogodi da u tom procesu na par sekundi ostanete bez vatrozida. Nftables koristi transakcijski model: sve promjene se primjenjuju odjednom ili nikako. Polupostavljene konfiguracije? Stvar prošlosti.
| Značajka | iptables | nftables |
|---|---|---|
| Performanse | Linearno O(n) | Optimizirano O(log n) / O(1) |
| IPv4/IPv6 | Odvojeni alati | Jedinstven alat (inet obitelj) |
| Setovi/Mape | Vanjski ipset | Ugrađeni |
| Atomičnost | Pravilo po pravilo | Transakcijski model |
| Debugiranje | Ograničeno | Napredno praćenje (tracing) |
| Zadane tablice | Unaprijed definirane | Prazan skup — korisnik stvara |
I onda tu je treća stvar koja me osobno najviše privukla: nftables nema unaprijed definiranih tablica ni lanaca. Iptables vam automatski stvori tablice filter, nat, mangle i raw s pripadajućim lancima INPUT, OUTPUT i FORWARD — i svi ti lanci se procesiraju sa svakim paketom čak i ako su potpuno prazni. Nftables vam dopušta da kreirate samo ono što vam treba. Čistije je, preglednije, a i jezgra se manje opterećuje.
Instalacija i osnovna konfiguracija
Instalacija na glavnim distribucijama
Na većini modernih distribucija nftables je već tu. Ako ga nekim čudom nemate, instalacija je trivijalna:
# Debian / Ubuntu
sudo apt update && sudo apt install nftables
# RHEL / CentOS / Fedora
sudo dnf install nftables
# Arch Linux
sudo pacman -S nftables
# Omogući i pokreni servis
sudo systemctl enable nftables
sudo systemctl start nftables
Provjera trenutnog stanja
Nakon instalacije, provjerite da servis radi i bacite oko na trenutni ruleset:
# Status servisa
sudo systemctl status nftables
# Pregled kompletnog ruleseta
sudo nft list ruleset
# Ako je prazan, to je normalno — nftables ne stvara zadana pravila
# Provjera verzije
nft --version
Struktura nftables: tablice, lanci i pravila
Razumijevanje hijerarhije nftables je ključno za učinkovitu konfiguraciju. Struktura je zapravo prilično intuitivna kad se jednom naviknete: tablice sadrže lance, a lanci sadrže pravila. To je to.
Obitelji adresa
Svaka tablica pripada jednoj obitelji adresa koja određuje koji promet obrađuje:
- inet — obrađuje i IPv4 i IPv6 promet (koristite ovo za većinu konfiguracija, uštedjet ćete si živce)
- ip — samo IPv4
- ip6 — samo IPv6
- arp — ARP paketi
- bridge — promet na bridge sučeljima
- netdev — ingress/egress na mrežnom sučelju (najranija točka filtriranja)
Za većinu poslužiteljskih konfiguracija koristite obitelj inet. Jednim skupom pravila pokrivate i IPv4 i IPv6, što vam značajno pojednostavljuje život. Nema više održavanja dva paralelna seta pravila.
Kreiranje tablica i lanaca
# Kreiraj tablicu za filtriranje
sudo nft add table inet filter
# Kreiraj bazni lanac za ulazni promet
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
# Kreiraj bazni lanac za prosljeđivanje
sudo nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
# Kreiraj bazni lanac za izlazni promet
sudo nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
Obratite pozornost na policy drop za ulazni lanac — to je vaš default-deny pristup. Samo promet koji izričito dopustite moći će proći. Izlazni promet obično dopuštamo jer, pa, poslužitelj treba komunicirati s vanjskim svijetom (ažuriranja, DNS upiti i slično).
Dodavanje pravila
# Dopusti loopback sučelje (obavezno!)
sudo nft add rule inet filter input iifname "lo" accept
# Dopusti uspostavljene i povezane veze
sudo nft add rule inet filter input ct state established,related accept
# Dopusti SSH (port 22)
sudo nft add rule inet filter input tcp dport 22 accept
# Dopusti HTTP i HTTPS
sudo nft add rule inet filter input tcp dport { 80, 443 } accept
# Dopusti ICMP ping
sudo nft add rule inet filter input icmp type echo-request accept
sudo nft add rule inet filter input icmpv6 type echo-request accept
# Logiraj odbačene pakete (opcionalno, ali korisno za debugiranje)
sudo nft add rule inet filter input counter log prefix "nft-drop: " drop
Kompletna konfiguracija vatrozida za produkcijski poslužitelj
Iskreno, dodavanje pravila jednog po jednog iz komandne linije je OK za testiranje, ali za produkciju želite konfiguracijsku datoteku. Evo potpune konfiguracije prikladne za web poslužitelj — koristim nešto vrlo slično ovome na svojih desetak poslužitelja:
#!/usr/sbin/nft -f
# Očisti postojeći ruleset
flush ruleset
# Definiraj varijable
define SSH_PORT = 22
define WEB_PORTS = { 80, 443 }
define TRUSTED_SSH = { 192.168.1.0/24, 10.0.0.0/8 }
table inet filter {
# Set za dinamičko blokiranje IP adresa
set blocklist {
type ipv4_addr
flags timeout
timeout 1h
}
# Set za praćenje SSH pokušaja
set ssh_meter {
type ipv4_addr
flags dynamic, timeout
timeout 5m
}
chain input {
type filter hook input priority 0; policy drop;
# Odbaci pakete s blokiranih IP adresa
ip saddr @blocklist counter drop
# Dopusti loopback
iifname "lo" accept
# Dopusti uspostavljene veze
ct state established,related accept
# Odbaci nevažeće veze
ct state invalid counter drop
# ICMP — dopusti ping s ograničenjem
icmp type echo-request limit rate 5/second accept
icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
# SSH — dopusti samo s pouzdanih mreža, s ograničenjem brzine
tcp dport $SSH_PORT ip saddr $TRUSTED_SSH \
meter ssh_limit { ip saddr limit rate 3/minute burst 5 packets } accept
# Web promet
tcp dport $WEB_PORTS accept
# Logiraj sve ostalo prije odbacivanja
counter log prefix "nft-input-drop: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
# NAT tablica (ako je potrebno za prosljeđivanje portova)
table inet nat {
chain prerouting {
type nat hook prerouting priority -100;
}
chain postrouting {
type nat hook postrouting priority 100;
}
}
Spremite to u /etc/nftables.conf i primijenite:
# Provjera sintakse bez primjene
sudo nft -c -f /etc/nftables.conf
# Primjena konfiguracije
sudo nft -f /etc/nftables.conf
# Provjera da je sve ispravno učitano
sudo nft list ruleset
Ono što bih ovdje posebno istaknuo je SSH ograničenje brzine putem metra (meter). Umjesto da vučete Fail2Ban (koji, da budemo fer, radi svoj posao, ali je još jedna stvar koju morate održavati), nftables može nativno pratiti broj pokušaja spajanja po IP adresi i automatski odbacivati višak. Postavka 3/minute burst 5 znači 3 nova SSH spajanja u minuti po IP adresi, s inicijalnim burst-om od 5 paketa za legitimne korisnike koji se prvi put spajaju. Za 90% slučajeva, to je sasvim dovoljno.
Napredne značajke: setovi, mape i verdict mape
Imenovani setovi
Setovi su, po mom mišljenju, ubojita značajka nftables. Omogućuju vam grupiranje IP adresa, portova ili bilo kojih podržanih tipova podataka u jedan element koji onda referencirate iz pravila:
# Kreiraj set za dopuštene IP adrese
sudo nft add set inet filter allowed_ips { type ipv4_addr \; }
# Dodaj elemente u set
sudo nft add element inet filter allowed_ips { 192.168.1.10, 192.168.1.20, 10.0.0.5 }
# Koristi set u pravilu
sudo nft add rule inet filter input ip saddr @allowed_ips accept
# Dinamički dodaj ili ukloni IP adrese bez mijenjanja pravila
sudo nft add element inet filter allowed_ips { 172.16.0.100 }
sudo nft delete element inet filter allowed_ips { 10.0.0.5 }
Ono što je ovdje fantastično — možete dinamički dodavati i uklanjati elemente bez ponovnog učitavanja pravila. Nema restarta, nema reload-a. Set interno koristi hash tablicu, pa pretraživanje ostaje brzo neovisno o broju elemenata. Bilo ih 10 ili 10.000, performanse su praktično iste.
Verdict mape (vmaps)
Verdict mape su onaj trenutak kad shvatite da nftables razmišlja drugačije od iptables. Umjesto da pišete pet pravila za pet portova, napravite jednu mapu koja određuje što se događa s kojim prometom:
# Kreiraj verdict mapu za upravljanje servisima po portovima
sudo nft add map inet filter port_policy { type inet_service : verdict \; }
# Popuni mapu
sudo nft add element inet filter port_policy { \
22 : accept, \
80 : accept, \
443 : accept, \
3306 : drop, \
8080 : jump web_filter \
}
# Koristi mapu u pravilu
sudo nft add rule inet filter input tcp dport vmap @port_policy
Jedan redak pravila zamjenjuje pet odvojenih. A kad trebate dodati novi port? Jednostavno dodate element u mapu, bez diranja postojećih pravila. Za produkciju s kompleksnijim ruleset-ovima, ovo je ogromna razlika u održivosti.
Intervalni setovi i konkatenacije
Nftables podržava i naprednije oblike setova — intervale i konkatenacije. Evo kako to izgleda u praksi:
# Set s rasponima IP adresa (zastavica interval)
sudo nft add set inet filter geo_block { type ipv4_addr \; flags interval \; }
sudo nft add element inet filter geo_block { 45.0.0.0/8, 185.0.0.0/8 }
# Konkatenacija — kombinacija IP adrese i porta
sudo nft add set inet filter svc_access { type ipv4_addr . inet_service \; }
sudo nft add element inet filter svc_access { 10.0.0.5 . 3306, 10.0.0.6 . 5432 }
sudo nft add rule inet filter input ip saddr . tcp dport @svc_access accept
Konkatenacije su posebno korisne za one scenarije gdje trebate fino granulirati pristup. Recimo, dopustiti pristup MySQL-u (port 3306) samo s aplikacijskog poslužitelja na 10.0.0.5, a PostgreSQL-u (port 5432) samo s 10.0.0.6. Bez konkatenacija, to bi bila dva odvojena pravila. S njima — jedan set, jedno pravilo.
Zaštita od mrežnih napada s nftables
Ograničavanje brzine (rate limiting)
Nftables dolazi s nativnim mehanizmima za rate limiting, što je nešto za što ste kod iptables-a često morali posezati za vanjskim alatima. Ključno za zaštitu od DDoS napada i brute-force pokušaja:
# Globalno ograničenje novih TCP veza
sudo nft add rule inet filter input ct state new limit rate 100/second burst 150 packets accept
# Ograničenje po izvorišnoj IP adresi (korisno za sprječavanje skeniranja portova)
sudo nft add rule inet filter input ct state new \
meter port_scan { ip saddr limit rate over 20/second } \
add @blocklist { ip saddr timeout 24h } drop
Taj drugi primjer je zlata vrijedan. Automatski dodaje IP adresu u blocklist na 24 sata ako generira više od 20 novih veza u sekundi. To je prilično jasan indikator skeniranja portova ili DDoS pokušaja, i sve se rješava na razini jezgre bez ikakvog vanjskog daemon-a.
Zaštita od SYN flood napada
# Dodaj u lanac za ulazni promet
sudo nft add rule inet filter input tcp flags syn ct state new \
limit rate over 50/second burst 100 packets drop
# Ili koristi SYN proxy za naprednu zaštitu
sudo nft add rule inet filter input tcp dport 80 tcp flags syn \
meter synflood { ip saddr limit rate 10/second burst 20 packets } accept
nftables i Docker: kompatibilnost i rješenja
Ah, Docker i vatrozidi. Ako ste ikad proveli sat vremena čudeći se zašto vam nftables pravila ne rade nakon što ste pokrenuli Docker kontejner, niste jedini. Docker je povijesno izgrađen oko iptables, pa prelazak na nftables zahtijeva malo dodatne pažnje.
Kako to funkcionira na modernim sustavima
Moderne distribucije koriste iptables-nft — što je u biti prevoditeljski sloj koji Docker-ove iptables naredbe pretvara u nftables pravila u pozadini. Docker i dalje koristi poznatu iptables sintaksu, ali pravila se zapravo provode kroz nftables motor. Funkcionira, ali zna stvoriti poprilično zbunjujuće situacije kad pregledavate ruleset i vidite tablice koje niste vi kreirali.
Docker 29+ s nativnom nftables podrškom
Docker verzija 29.0.0 uveo je eksperimentalnu nativnu nftables podršku. Konačno se možete potpuno riješiti iptables kompatibilnog sloja:
# Omogući nftables backend u Docker konfiguraciji
# /etc/docker/daemon.json
{
"firewall-backend": "nftables"
}
# Ponovno pokretanje Docker servisa
sudo systemctl restart docker
# VAŽNO: IP prosljeđivanje mora biti ručno omogućeno
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-docker-nft.conf
sudo sysctl -p /etc/sysctl.d/99-docker-nft.conf
Pažnja na jednu stvar koja me uhvatila nespremnog: u nftables načinu rada, Docker ne upravlja IP prosljeđivanjem automatski. Morate ga ručno upaliti. Također, poznati DOCKER-USER lanac ne postoji u nftables implementaciji. Umjesto toga, kreirate vlastite tablice s baznim lancima istog tipa i hook-a, pa koristite prioritet za kontrolu redoslijeda izvršavanja.
Pravila suživota s Dockerom
# Nikad ne modificirajte Docker-ove nftables tablice izravno!
# Docker očekuje potpunu kontrolu nad svojim tablicama.
# Umjesto toga, kreirajte vlastitu tablicu s višim prioritetom
table inet moja_pravila {
chain input {
type filter hook input priority -10; policy accept;
# Vaša pravila se izvršavaju PRIJE Docker-ovih
ip saddr @blocklist drop
}
}
# Pregled Docker-ovih nftables tablica (samo za čitanje)
sudo nft list tables | grep docker
nftables u Kubernetes okruženju
Kubernetes ekosustav također aktivno prelazi na nftables. Nftables način rada za kube-proxy uveden je kao alfa značajka u Kubernetes 1.29, a trenutno je u beta fazi. Očekuje se GA status u verziji 1.33.
Razlog je jasan i mjerljiv: iptables postaje usko grlo u velikim klasterima. Kube-proxy generira iptables pravila proporcionalno broju servisa, pa s tisućama servisa svaki paket mora proći kroz tisuce pravila. Nije teško pogoditi da to ne skalira dobro. S nftables, kube-proxy koristi setove i mape za O(1) pretraživanje — dramatična razlika u praksi.
# Konfiguracija kube-proxy za nftables način rada
# kube-proxy-config.yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: nftables
# Ili putem kubeadm konfiguracije
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: nftables
Imajte na umu da je Red Hat proglasio iptables zastarjelim u RHEL 9 i planira ga potpuno maknuti u RHEL 10. Ako vrtite Kubernetes klastere na RHEL-u, bolje je krenuti s migracijom sad nego čekati da vam postane jedina opcija pod pritiskom.
Migracija s iptables na nftables
Dobra vijest — ne morate sve pisati ispočetka. Nftables dolazi s alatima za automatsku konverziju vaše postojeće iptables konfiguracije:
# Prevedi jednu iptables naredbu u nftables
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Izlaz: nft add rule ip filter INPUT tcp dport 22 counter accept
# Prevedi kompletnu konfiguraciju
iptables-save | iptables-restore-translate > /etc/nftables-migrirano.conf
# Pregledaj konvertiranu konfiguraciju prije primjene
cat /etc/nftables-migrirano.conf
# Testiraj bez primjene
sudo nft -c -f /etc/nftables-migrirano.conf
# Primijeni ako je sve u redu
sudo nft -f /etc/nftables-migrirano.conf
Savjeti za uspješnu migraciju
- Testirajte na testnom okruženju — ovo bi trebalo biti očito, ali svejedno: nikada ne migrirajte vatrozid u produkciji bez prethodnog testiranja. Naučio sam to na teži način.
- Zadržite konzolni pristup — imajte alternativni pristup poslužitelju (KVM, IPMI, konzola oblaka) u slučaju da se zaključate. Vjerujte mi na riječ.
- Provjerite konfliktna pravila — pokrenite
iptables-legacy -L -ninft list rulesetda vidite postoje li istovremeno i legacy i nftables pravila. To se zna dogoditi, pogotovo na sustavima koji su prošli nadogradnju. - Očistite legacy pravila — nakon uspješne migracije, maknite stara iptables pravila da izbjegnete konfuziju
- Uvijek sigurnosna kopija —
nft list ruleset > backup.nftprije bilo kakvih promjena. Traje sekundu, a može vam uštedjeti sat.
Debugiranje i praćenje prometa
Jedna od stvari koja me kod nftables-a odmah osvojila jest sustav za praćenje prometa. Debugiranje vatrozida više ne mora biti mučenje:
# Omogući praćenje za specifičan promet
sudo nft add rule inet filter input tcp dport 22 meta nftrace set 1
# Pokreni monitor za praćenje
sudo nft monitor trace
# Pregled brojača po pravilima
sudo nft list chain inet filter input
# Detaljniji pregled s handle brojevima (za brisanje pojedinih pravila)
sudo nft -a list chain inet filter input
# Brisanje pojedinog pravila po handle broju
sudo nft delete rule inet filter input handle 15
nft monitor trace vam u stvarnom vremenu pokazuje kako svaki paket prolazi kroz lance i pravila. Vidite kompletnu putanju paketa, ne samo točku gdje je logiran kao kod iptables -j LOG. Razlika je kao između čitanja dnevnika leta i gledanja radara uživo. Jednom kad se naviknete na ovo, nema povratka.
Često postavljana pitanja (FAQ)
Mogu li koristiti nftables i iptables istovremeno?
Tehnički da — moderne distribucije koriste iptables-nft sloj koji prevodi iptables naredbe u nftables pravila. Ali za dugoročnu upotrebu? Ne bih preporučio. Može stvoriti nepredvidivo ponašanje i noćnu moru za debugiranje. Potpuno prijeđite na nftables i koristite jedinstven okvir za sve vatrozidne operacije. Vaš budući ja će vam biti zahvalan.
Hoće li nftables usporiti moj poslužitelj?
Upravo suprotno. Nftables je dizajniran za bolje performanse od iptables. Koristi optimizirane podatkovne strukture (hash tablice, crveno-crna stabla) za pretraživanje pravila, pa povećanje broja pravila ima minimalan utjecaj na performanse. U velikim okruženjima s tisućama pravila, razlika je mjerljiva i značajna.
Kako nftables radi s firewalld-om?
Firewalld koristi nftables kao zadani backend od verzije 0.6.0. Ako koristite firewalld na RHEL-u, Fedori ili CentOS-u, vaša pravila su već implementirana kroz nftables motor ispod haube. Međutim, mnogi administratori (uključujući mene) preferiraju izravnu konfiguraciju nftables bez firewalld posrednika — jednostavno vam daje više kontrole i transparentnosti.
Što se događa ako nftables ne uspije učitati konfiguraciju pri pokretanju?
Tu nastupa transakcijski model. Ako postoji sintaksna greška u konfiguracijskoj datoteci, nijedna promjena se neće primijeniti. Sustav ostaje u prethodnom stanju. Zato je ključno koristiti nft -c -f /etc/nftables.conf za provjeru sintakse prije primjene — posebno ako automatski primjenjujete promjene putem CI/CD cjevovoda gdje nema nikoga da ručno provjeri rezultat.
Kako automatski blokirati IP adrese koje skeniraju portove?
Nftables to može nativno, bez ikakvih vanjskih alata. Definirate set s vremenskim istekom za blokirane IP adrese, pa koristite metar za praćenje broja novih veza po IP adresi. Kad neka IP premašiti definirani prag (recimo, 20 novih veza u sekundi), automatski se dodaje u blocklist na definirano vrijeme. Kompletni primjer ove konfiguracije nalazi se gore u sekciji o zaštiti od mrežnih napada.