Úvod: Prečo je nftables budúcnosť Linux firewallu
Ak stále používate iptables na správu firewallu vašich Linux serverov, mám pre vás správu — žijete v minulosti. Nie, vážne. Väčšina moderných distribúcií vrátane Debian 12, Fedora 40+, Ubuntu 24.04 a RHEL 9 už prešla na nftables ako predvolený firewallový framework. A majú na to pádne dôvody.
Čísla z roku 2025 hovoria samy za seba: jadro Linuxu malo 5 530 CVE zraniteľností, čo je nárast o 28 % medziročne — v priemere 8–9 nových zraniteľností jadra každý deň. Exploitačná aktivita cielená na Linux prostredia vzrástla o 130 % medziročne. Ransomvérové skupiny aktívne cielia na Linux servery, najmä virtualizačné platformy a cloudové workloady.
V tomto prostredí nie je správne nakonfigurovaný firewall luxus. Je to absolútna nevyhnutnosť.
A práve tu prichádza nftables. Je to nástupca iptables v rámci subsystému Netfilter, dostupný od jadra 3.13 (január 2014), no až v posledných rokoch sa stal de facto štandardom. V tomto článku si ukážeme všetko — od základnej architektúry cez praktické konfigurácie, pokročilé funkcie ako rate limiting a geo-blocking, až po integráciu s Fail2Ban a automatizáciu pomocou Ansible. Tak poďme na to.
Prečo nftables namiesto iptables
Predtým, než sa pustíme do praktických príkladov, poďme si ujasniť, prečo je prechod na nftables nielen odporúčaný, ale v roku 2026 prakticky nevyhnutný.
Hlavné výhody nftables oproti iptables
Iptables bol revolučný nástroj, keď bol predstavený v roku 2001. No za 25 rokov sa jeho obmedzenia stali čoraz zreteľnejšími. Nftables ich rieši zásadným spôsobom:
- Zjednotený nástroj: Jeden príkaz
nftnahrádza štyri samostatné utility —iptables,ip6tables,arptablesaebtables. Konečne žiadne duplikovanie pravidiel medzi IPv4 a IPv6. - Kompilovaný bytekód: Na rozdiel od iptables, kde sa pravidlá vyhodnocujú lineárne (O(n)), nftables kompiluje pravidlá do bytekódu, ktorý vykonáva virtuálny stroj v jadre. Výsledkom sú vyhľadávania O(log n) — pri veľkom počte pravidiel je to obrovský rozdiel.
- Natívne sety a mapy: Iptables vyžadoval externý modul
ipsetna prácu so skupinami adries. V nftables sú sety, mapy a slovníky natívnou súčasťou frameworku. - Atomické aktualizácie: Zmeny pravidiel sa aplikujú atomicky v rámci jednej Netlink transakcie — žiadne race conditions, žiadne okamihy bez ochrany.
- Vstavaný tracing: Iptables nemal žiadnu vstavanú debugovaciu funkcionalitu. Nftables má natívny tracing na diagnostiku — a úprimne, toto mi pri ladení pravidiel ušetrilo hodiny života.
- Čistejšia syntax: Pravidlá sú čitateľnejšie a jednoduchšie na údržbu.
Výkon v praxi: prípad Kubernetes
Najlepší dôkaz výkonnostného rozdielu prišiel s integráciou nftables do Kubernetes kube-proxy. Nový nftables režim, ktorý dosiahol beta v roku 2025 a smeruje k GA vo verzii 1.33, priniesol skutočne dramatické zlepšenia:
- V klastroch s 5 000 až 10 000 službami je priemerná latencia (p50) pre nftables porovnateľná s najlepším prípadom (p01) pre iptables.
- V klastri s 30 000 službami dokonca najhoršia latencia (p99) nftables prekonáva najlepšiu latenciu iptables. Áno, čítate správne.
- Nftables API umožňuje každému komponentu mať vlastnú privátnu tabuľku — žiadne globálne zámky medzi komponentami.
Tieto čísla jasne ukazujú, že pri akomkoľvek väčšom nasadení je nftables jednoznačne lepšia voľba.
Architektúra nftables: Tabuľky, reťazce a pravidlá
Pochopenie hierarchickej štruktúry nftables je kľúčové pre efektívnu konfiguráciu. Na rozdiel od iptables, kde boli tabuľky a reťazce preddefinované, v nftables si vytvárate vlastnú štruktúru od základov. Na prvý pohľad to môže pôsobiť zložitejšie, ale v praxi je to oveľa flexibilnejšie.
Tabuľky (tables)
Tabuľky sú najvyššia úroveň hierarchie. Každá tabuľka patrí do jednej adresnej rodiny:
ip— filtruje len IPv4 prevádzkuip6— filtruje len IPv6 prevádzkuinet— filtruje IPv4 aj IPv6 súčasne (odporúčané)arp— filtruje ARP paketybridge— filtruje premostené paketynetdev— filtruje pakety na úrovni sieťového zariadenia (najskoršie zachytenie)
Pre väčšinu serverových konfigurácií budete používať rodinu inet, pretože vám umožňuje spravovať IPv4 aj IPv6 pravidlá v jednej tabuľke. Jednoducho, menej duplicity.
# Vytvorenie tabuľky pre IPv4 aj IPv6
nft add table inet firewall
# Zobrazenie existujúcich tabuliek
nft list tables
Reťazce (chains)
Reťazce žijú vnútri tabuliek a môžu byť dvoch typov:
- Base chains — pripojené k hookom jadra (input, output, forward, prerouting, postrouting). Spracovávajú pakety automaticky.
- Regular chains — nie sú pripojené k hookom. Volajú sa z iných reťazcov pomocou
jumpalebogoto.
Base chain vyžaduje tri parametre: typ (filter, nat, route), hook (kde v spracovaní paketov sa zaradí) a prioritu (poradie spracovania).
# Vytvorenie base chain pre filtrovanie vstupnej prevádzky
nft add chain inet firewall input { type filter hook input priority filter \; policy drop \; }
# Vytvorenie base chain pre výstupnú prevádzku
nft add chain inet firewall output { type filter hook output priority filter \; policy accept \; }
# Vytvorenie base chain pre preposielanie
nft add chain inet firewall forward { type filter hook forward priority filter \; policy drop \; }
Pravidlá (rules)
Pravidlá sú základné stavebné bloky. Každé pravidlo obsahuje výrazy na porovnávanie (match) a akcie (verdict):
# Povolenie loopback rozhrania
nft add rule inet firewall input iifname "lo" accept
# Povolenie etablovaných a súvisiacich spojení
nft add rule inet firewall input ct state established,related accept
# Povolenie SSH z konkrétnej podsiete
nft add rule inet firewall input ip saddr 192.168.1.0/24 tcp dport 22 accept
# Povolenie HTTPS
nft add rule inet firewall input tcp dport 443 accept
# Logovanie a zahodenie ostatnej prevádzky
nft add rule inet firewall input counter log prefix "DROPPED: " drop
Praktická konfigurácia: Stavový firewall od základov
Teraz si ukážeme kompletný stavový firewall vhodný pre produkčný Linux server. Namiesto pridávania pravidiel po jednom si vytvoríme konfiguračný súbor — a toto je naozaj ten správny prístup pre produkčné nasadenia. Interaktívne pridávanie pravidiel cez príkazový riadok je fajn na testovanie, ale pre ostrú prevádzku chcete mať všetko v súbore.
Základná konfigurácia pre webový server
Vytvorte súbor /etc/nftables.conf:
#!/usr/sbin/nft -f
# Vyčistenie existujúcich pravidiel
flush ruleset
# Hlavná tabuľka pre filtrovanie
table inet firewall {
# Sety pre správu adries
set trusted_networks {
type ipv4_addr
flags interval
elements = {
10.0.0.0/8,
172.16.0.0/12,
192.168.0.0/16
}
}
set blocked_ips {
type ipv4_addr
flags dynamic,timeout
timeout 24h
}
set web_ports {
type inet_service
elements = { 80, 443 }
}
# Vstupný reťazec — predvolená politika: zahodiť
chain input {
type filter hook input priority filter; policy drop;
# Zahodenie paketov z blokovaných IP
ip saddr @blocked_ips counter drop
# Povolenie loopback
iifname "lo" accept
# Povolenie etablovaných a súvisiacich spojení
ct state established,related accept
# Zahodenie neplatných spojení
ct state invalid counter drop
# Povolenie ICMP (ping) s limitom
ip protocol icmp icmp type echo-request limit rate 5/second burst 10 packets accept
ip6 nexthdr icmpv6 icmpv6 type { echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } limit rate 5/second burst 10 packets accept
# Ochrana proti SYN flood
tcp flags syn limit rate 25/second burst 50 packets accept
# Povolenie SSH z dôveryhodných sietí
ip saddr @trusted_networks tcp dport 22 accept
# Povolenie webových portov
tcp dport @web_ports accept
# Logovanie zahodených paketov (s limitom na logovanie)
limit rate 10/minute burst 5 packets log prefix "[nft-drop] " counter drop
}
# Výstupný reťazec
chain output {
type filter hook output priority filter; policy accept;
# Povolenie loopback
oifname "lo" accept
# Povolenie etablovaných spojení
ct state established,related accept
# Povolenie DNS, HTTP/HTTPS, NTP
tcp dport { 53, 80, 443 } accept
udp dport { 53, 123 } accept
}
# Reťazec pre preposielanie — zahodenie (ak nepoužívate routing)
chain forward {
type filter hook forward priority filter; policy drop;
}
}
# NAT tabuľka (ak potrebujete masquerade)
# table inet nat {
# chain postrouting {
# type nat hook postrouting priority srcnat; policy accept;
# oifname "eth0" masquerade
# }
# }
Aktivácia a overenie
Po vytvorení konfigurácie ju musíte aplikovať a zabezpečiť perzistenciu:
# Kontrola syntaxe (suchý beh)
nft -c -f /etc/nftables.conf
# Aplikovanie pravidiel
sudo nft -f /etc/nftables.conf
# Zobrazenie aktuálnych pravidiel
sudo nft list ruleset
# Povolenie nftables služby pri štarte
sudo systemctl enable nftables
sudo systemctl start nftables
# Overenie stavu
sudo systemctl status nftables
Dôležité upozornenie: Pred aplikovaním nových pravidiel na vzdialenom serveri si vždy zabezpečte alternatívny prístup. Chybná konfigurácia firewallu vás môže odrezať od vlastného servera (a verte mi, stalo sa to aj skúsenejším adminom). Tip: nastavte si cron job, ktorý po 5 minútach obnoví pôvodnú konfiguráciu, kým nepotvrdíte, že nová funguje správne.
# Záchranný cron job — obnoví pôvodné pravidlá po 5 minútach
# Najprv záloha aktuálnych pravidiel
sudo nft list ruleset > /tmp/nftables-backup.conf
# Pridanie záchranného cron jobu
echo "$(date -d '+5 minutes' '+%M %H %d %m *') root /usr/sbin/nft -f /tmp/nftables-backup.conf" | sudo tee /etc/cron.d/nft-rescue
# Po overení, že nová konfigurácia funguje — odstráňte záchranný cron
sudo rm -f /etc/cron.d/nft-rescue
Pokročilé funkcie: Sety, mapy a dynamické pravidlá
Tu sa dostávame k tomu, čo robí nftables naozaj zaujímavým. Natívna podpora pokročilých dátových štruktúr je jedna z najväčších výhod oproti iptables. Pozrime sa na ich praktické využitie.
Anonymné a pomenované sety
Sety umožňujú zoskupiť adresy, porty alebo iné hodnoty a referencovať ich v pravidlách:
# Pomenovaný set s IPv4 adresami a automatickým timeoutom
nft add set inet firewall rate_limited {
type ipv4_addr \;
flags dynamic,timeout \;
timeout 1h \;
}
# Set s intervalmi (podsiete)
nft add set inet firewall admin_networks {
type ipv4_addr \;
flags interval \;
elements = { 10.10.0.0/24, 172.16.5.0/24 } \;
}
# Anonymný set priamo v pravidle
nft add rule inet firewall input tcp dport { 80, 443, 8080, 8443 } accept
Mapy a verdict mapy
Mapy sú ešte výkonnejšie — umožňujú priame mapovanie hodnôt na akcie alebo iné hodnoty. Je to niečo ako switch-case priamo v pravidlách firewallu:
# Verdict mapa — rôzne akcie podľa cieľového portu
nft add rule inet firewall input tcp dport vmap {
22 : jump ssh_chain,
80 : accept,
443 : accept,
3306 : drop
}
# Mapa portov na podsiete — povolenie prístupu podľa siete a portu
nft add map inet firewall port_access {
type inet_service : verdict \;
}
nft add element inet firewall port_access {
22 : accept,
80 : accept,
443 : accept
}
Concatenácie
Concatenácie umožňujú kombinovať viacero polí do jedného vyhľadávania — napríklad zdrojovú adresu a cieľový port súčasne. Toto je mimoriadne užitočné, keď potrebujete jemnozrnnú kontrolu:
# Set s concatenáciou — kombinácia IP adresy a portu
nft add set inet firewall allowed_access {
type ipv4_addr . inet_service \;
elements = {
192.168.1.100 . 22,
10.0.0.50 . 3306,
172.16.0.0/24 . 443
} \;
}
nft add rule inet firewall input ip saddr . tcp dport @allowed_access accept
Rate limiting a ochrana pred útokmi
Správne nakonfigurovaný rate limiting je jedným z najúčinnejších nástrojov na ochranu servera pred brute-force útokmi, DDoS útokmi a skenovaním portov. A čo je na tom pekné — nftables ho má zabudovaný priamo, žiadne externé moduly.
Rate limiting pre SSH
Ochrana SSH pred brute-force útokmi pomocou dynamických setov a connection trackingu:
# Vytvorenie dedikovaného reťazca pre SSH
nft add chain inet firewall ssh_chain
# Rate limiting — maximálne 3 nové pripojenia za minútu na IP adresu
nft add rule inet firewall ssh_chain ct state new limit rate 3/minute burst 5 packets accept
# Ak prekročí limit — pridanie do blokovaného setu
nft add rule inet firewall ssh_chain ct state new add @blocked_ips { ip saddr timeout 1h } counter drop
# Presmerovanie SSH prevádzky do dedikovaného reťazca
nft add rule inet firewall input tcp dport 22 jump ssh_chain
Per-IP rate limiting s metrami
Pre webové servery môžete nastaviť per-IP limity, aby ste zabránili jednému klientovi zahltiť server. Toto sa hodí hlavne pri API endpointoch:
# Limit na HTTP/HTTPS — max 200 požiadaviek za sekundu na IP
nft add rule inet firewall input tcp dport { 80, 443 } \
meter http_limit { ip saddr limit rate over 200/second } counter drop
# Limit na nové spojenia — max 50 nových spojení za sekundu na IP
nft add rule inet firewall input ct state new \
meter conn_limit { ip saddr ct count over 50 } counter drop
Ochrana pred SYN flood
SYN flood útok je jedným z najstarších, ale stále prekvapivo účinných DDoS vektorov. Nftables poskytuje elegantnú obranu:
# Globálny SYN limit
nft add rule inet firewall input tcp flags syn limit rate 100/second burst 150 packets accept
# Per-IP SYN limit s automatickým blokovaním
nft add set inet firewall syn_flood_block {
type ipv4_addr \;
flags dynamic,timeout \;
timeout 5m \;
}
nft add rule inet firewall input tcp flags syn \
meter syn_meter { ip saddr limit rate over 25/second burst 50 packets } \
add @syn_flood_block { ip saddr timeout 5m } counter drop
nft add rule inet firewall input ip saddr @syn_flood_block counter drop
Ochrana pred skenovaním portov
Detekcia a blokovanie pokusov o skenovanie portov je ďalšou dôležitou vrstvou ochrany:
# Detekcia skenovania — viac ako 10 rôznych portov za minútu
nft add set inet firewall port_scanners {
type ipv4_addr \;
flags dynamic,timeout \;
timeout 24h \;
}
# Logovanie detegovaných skenov
nft add rule inet firewall input ct state new tcp flags syn \
meter scan_detect { ip saddr limit rate over 10/minute burst 15 packets } \
add @port_scanners { ip saddr timeout 24h } \
log prefix "[port-scan] " counter drop
Geo-blocking: Filtrovanie podľa krajiny
Ak váš server obsluhuje len konkrétne regióny, geo-blocking dokáže dramaticky znížiť útočnú plochu. Z vlastnej skúsenosti — po zapnutí geo-blockingu na jednom z našich serverov klesol počet blokovaných SSH pokusov o viac než 80 %. Nástroj nft-geo-filter to robí pomerne jednoducho.
Inštalácia a konfigurácia nft-geo-filter
# Klonovanie repozitára
git clone https://github.com/rpthms/nft-geo-filter.git
cd nft-geo-filter
# Blokovanie prevádzky z konkrétnych krajín
# (použite ISO-3166-1 alpha-2 kódy krajín)
sudo python3 nft-geo-filter.py \
--table-family netdev \
--interface eth0 \
CN RU KP
# Alternatívne — povolenie len vybraných krajín (whitelist režim)
sudo python3 nft-geo-filter.py \
--table-family netdev \
--interface eth0 \
--allow \
--allow-established \
SK CZ DE AT PL HU
# Pridanie výnimiek pre konkrétne IP adresy
sudo python3 nft-geo-filter.py \
--table-family netdev \
--interface eth0 \
--exceptions 203.0.113.50,198.51.100.25 \
CN RU
Výhodou nft-geo-filter je, že vytvára samostatnú nftables tabuľku, takže neovplyvní vašu existujúcu konfiguráciu. Skript stiahne aktuálne IP bloky pre zadané krajiny a vytvorí príslušné sety a pravidlá.
Dôležité: Parameter --allow-established v kombinácii s --allow umožňuje obmedziť prichádzajúce spojenia na vybrané krajiny, ale zároveň povoľuje odchádzajúce spojenia do akejkoľvek krajiny. To je zvyčajne presne to, čo chcete — váš server môže komunikovať so svetom, ale svet má obmedzený prístup k nemu.
Integrácia nftables s Fail2Ban
Fail2Ban je nepostrádateľný nástroj na automatickú ochranu pred brute-force útokmi. Správna integrácia s nftables je kľúčová pre moderné nasadenia. Ak ste čítali predchádzajúce články na tomto blogu, Fail2Ban vám určite nie je cudzí — teraz ho prepojíme s nftables.
Krok 1: Vytvorenie dedikovanej tabuľky pre Fail2Ban
Najprv vytvorte konfiguračný súbor /etc/nftables/fail2ban.conf:
#!/usr/sbin/nft -f
table ip fail2ban {
chain input {
type filter hook input priority 100;
}
}
Pridajte ho do hlavnej konfigurácie /etc/nftables.conf:
# Na začiatok súboru, po flush ruleset
include "/etc/nftables/fail2ban.conf"
Priorita 100 zabezpečí, že Fail2Ban pravidlá sa vyhodnotia pred hlavnými pravidlami firewallu (nižšie číslo = vyššia priorita, ale tu chceme, aby Fail2Ban mohol zamietnuť pakety skôr).
Krok 2: Konfigurácia Fail2Ban pre nftables
Vytvorte alebo upravte /etc/fail2ban/jail.local:
[DEFAULT]
# Použitie nftables namiesto iptables
banaction = nftables-multiport
chain = input
# Čas banu — 24 hodín
bantime = 24h
# Inkrementálne zvyšovanie banu pre recidivistov
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w
# Okno detekcie — 10 minút
findtime = 600
# Maximum pokusov pred banom
maxretry = 3
# Backend — systemd journal (Debian 12+, Ubuntu 24.04+)
backend = systemd
[sshd]
enabled = true
port = ssh
maxretry = 3
findtime = 300
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
Krok 3: Konfigurácia nftables akcie
Vytvorte /etc/fail2ban/action.d/nftables-common.local:
[Init]
nftables_family = ip
nftables_table = fail2ban
blocktype = drop
nftables_set_prefix =
Krok 4: Previazanie cez systemd
Pre spoľahlivé správanie vytvorte systemd override, ktorý zabezpečí správne poradie štartovania. Toto je detail, na ktorý sa často zabúda, ale bez neho môže Fail2Ban nabehať pred nftables a vzniknú problémy:
# Vytvorenie override súboru
sudo mkdir -p /etc/systemd/system/fail2ban.service.d/
cat <<EOF | sudo tee /etc/systemd/system/fail2ban.service.d/override.conf
[Unit]
Requires=nftables.service
PartOf=nftables.service
[Install]
WantedBy=multi-user.target nftables.service
EOF
# Aplikovanie zmien
sudo systemctl daemon-reload
sudo systemctl restart nftables
sudo systemctl restart fail2ban
# Overenie
sudo fail2ban-client status
sudo nft list table ip fail2ban
Fail2Ban teraz automaticky pridáva blokované IP adresy do nftables setov. Keď vyprší bantime, Fail2Ban adresu zo setu odstráni. Jednoduché a efektívne.
Vstavaný tracing a debugging
Jednou z najcennejších funkcií nftables, ktorá v iptables úplne chýbala, je vstavaný tracing. Keď sa vám niečo nezdá — pravidlá nefungujú podľa očakávania, prevádzka je blokovaná aj keď by nemala byť — tracing vám ukáže presne, čo sa deje. Úprimne povedané, práve tracing je dôvod, prečo som pri ladení firewallov úplne prestal používať tcpdump na diagnostiku pravidiel.
Povolenie tracingu
# Pridanie trace pravidla pre konkrétnu IP
nft add rule inet firewall input ip saddr 192.168.1.100 meta nftrace set 1
# Sledovanie tracingu v reálnom čase
nft monitor trace
# Výstup ukáže presný priebeh paketu cez pravidlá:
# trace id abc123 inet firewall input packet: iif "eth0" ...
# trace id abc123 inet firewall input rule ip saddr 192.168.1.100 ...
# trace id abc123 inet firewall input verdict accept
# Po dokončení diagnostiky — odstráňte trace pravidlo
nft delete rule inet firewall input handle <handle_number>
Použitie counterov na monitoring
Countery (počítadlá) sú neoceniteľné pri pochopení, koľko paketov matchuje jednotlivé pravidlá:
# Pridanie pomenovaného countera
nft add counter inet firewall ssh_counter
nft add counter inet firewall dropped_counter
# Použitie v pravidlách
nft add rule inet firewall input tcp dport 22 counter name ssh_counter accept
nft add rule inet firewall input counter name dropped_counter drop
# Zobrazenie counterov
nft list counters table inet firewall
# Resetovanie counterov
nft reset counters table inet firewall
Migrácia z iptables na nftables
Ak máte existujúce iptables pravidlá, nemusíte začínať od nuly. A to je dobrá správa, pretože niektoré produkčné konfigurácie majú stovky pravidiel. Tím Netfilter poskytuje migračné nástroje, ktoré vám uľahčia prechod.
Automatický preklad pravidiel
# Preklad jednotlivého iptables pravidla
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Výstup: nft add rule ip filter INPUT tcp dport 22 counter accept
# Preklad celej existujúcej konfigurácie
iptables-save | iptables-restore-translate -f /dev/stdin
# Výstup: kompletná nftables konfigurácia
# Uloženie preloženej konfigurácie
iptables-save | iptables-restore-translate -f /dev/stdin > /etc/nftables-migrated.conf
# Kontrola a úprava preloženej konfigurácie
# (niektoré pokročilé moduly nemusia mať priamy ekvivalent)
nft -c -f /etc/nftables-migrated.conf
Postup bezpečnej migrácie
Migrácia na produkčnom serveri vyžaduje opatrnosť. Tu je odporúčaný postup:
- Záloha aktuálnych pravidiel:
iptables-save > /root/iptables-backup-$(date +%Y%m%d).conf - Automatický preklad: Použite
iptables-restore-translatena konverziu - Manuálna revízia: Skontrolujte preloženú konfiguráciu, optimalizujte sety a mapy
- Testovanie: Aplikujte na testovacom prostredí alebo v maintenance okne
- Záchranný mechanizmus: Nastavte cron job na obnovenie pôvodných pravidiel
- Postupné nasadenie: Najprv menej kritické servery, potom produkciu
- Monitoring: Sledujte logy a countery po migrácii
Upozornenie: Nikdy nepoužívajte iptables-legacy a nftables pravidlá súčasne. Môže to viesť k nepredvídateľnému správaniu a bezpečnostným medzerám. Ak používate Docker, majte na pamäti, že Docker štandardne používa iptables na správu sieťových pravidiel — preto nezabudnite otestovať kompatibilitu po migrácii.
Automatizácia s Ansible
Pre správu firewallu na viacerých serveroch je ručná konfigurácia nepraktická a náchylná na chyby. Ak spravujete viac než dva-tri servery, Ansible je prakticky nevyhnutný nástroj na automatizáciu nftables pravidiel.
Ansible playbook pre nftables
---
# playbook: nftables-deploy.yml
- name: Nasadenie nftables firewallu
hosts: webservers
become: true
vars:
ssh_allowed_networks:
- "10.0.0.0/8"
- "172.16.0.0/12"
web_ports:
- 80
- 443
ssh_port: 22
tasks:
- name: Inštalácia nftables
ansible.builtin.package:
name: nftables
state: present
- name: Nasadenie konfigurácie nftables
ansible.builtin.template:
src: templates/nftables.conf.j2
dest: /etc/nftables.conf
owner: root
group: root
mode: "0600"
validate: "/usr/sbin/nft -c -f %s"
notify: Restart nftables
- name: Povolenie a spustenie nftables
ansible.builtin.systemd:
name: nftables
enabled: true
state: started
handlers:
- name: Restart nftables
ansible.builtin.systemd:
name: nftables
state: restarted
Jinja2 šablóna pre nftables
{# templates/nftables.conf.j2 #}
#!/usr/sbin/nft -f
flush ruleset
table inet firewall {
set trusted_ssh {
type ipv4_addr
flags interval
elements = {
{% for network in ssh_allowed_networks %}
{{ network }}{{ "," if not loop.last }}
{% endfor %}
}
}
set web_ports {
type inet_service
elements = {
{% for port in web_ports %}
{{ port }}{{ "," if not loop.last }}
{% endfor %}
}
}
chain input {
type filter hook input priority filter; policy drop;
iifname "lo" accept
ct state established,related accept
ct state invalid drop
ip protocol icmp icmp type echo-request limit rate 5/second accept
ip saddr @trusted_ssh tcp dport {{ ssh_port }} accept
tcp dport @web_ports accept
limit rate 10/minute log prefix "[nft-drop] " counter drop
}
chain output {
type filter hook output priority filter; policy accept;
}
chain forward {
type filter hook forward priority filter; policy drop;
}
}
Tento prístup zabezpečuje konzistentnú konfiguráciu naprieč celou infraštruktúrou. Stačí zmeniť premenné a spustiť playbook — a máte istotu, že všetky servery majú rovnaké pravidlá.
Connection tracking: Stavový firewall v praxi
Connection tracking (conntrack) je srdcom stavového firewallu. Bez neho by ste museli explicitne povoľovať odpovede na každú odoslanú požiadavku. Pochopenie jeho fungovania je kľúčové pre správnu konfiguráciu nftables.
Stavy spojení
Nftables rozpoznáva štyri stavy spojení:
- new — prvý paket nového spojenia (napr. TCP SYN)
- established — paket patriaci k existujúcemu obojsmernému spojeniu
- related — nové spojenie súvisiace s existujúcim (napr. FTP dátový kanál)
- invalid — paket, ktorý nepatrí k žiadnemu známemu spojeniu
# Štandardný vzor stavového firewallu
nft add rule inet firewall input ct state established,related accept
nft add rule inet firewall input ct state invalid drop
nft add rule inet firewall input ct state new tcp dport 22 accept
# Efektívnejšie — použitie verdict mapy
nft add rule inet firewall input ct state vmap {
established : accept,
related : accept,
invalid : drop
}
# Zobrazenie aktívnych spojení
conntrack -L
conntrack -L -p tcp --dport 22
# Počet sledovaných spojení
conntrack -C
# Maximálna veľkosť conntrack tabuľky
sysctl net.netfilter.nf_conntrack_max
Ladenie conntrack pre vysokú záťaž
Na serveroch s veľkým počtom spojení je dôležité správne nastaviť conntrack parametre. Predvolené hodnoty sú konzervatívne a pre webový server s väčšou prevádzkou zvyčajne nestačia:
# Zvýšenie maximálneho počtu sledovaných spojení
# Predvolená hodnota je zvyčajne 65536 — pre webové servery často nedostatočná
echo "net.netfilter.nf_conntrack_max = 262144" | sudo tee -a /etc/sysctl.d/99-conntrack.conf
# Zníženie timeoutu pre etablované TCP spojenia
# Predvolene 432000 sekúnd (5 dní) — príliš dlho pre väčšinu scenárov
echo "net.netfilter.nf_conntrack_tcp_timeout_established = 86400" | sudo tee -a /etc/sysctl.d/99-conntrack.conf
# Aplikovanie zmien
sudo sysctl --system
# Monitoring využitia conntrack tabuľky
watch -n 1 'conntrack -C'
Najlepšie praktiky a bezpečnostné odporúčania
Na záver zhrňme to najdôležitejšie. Toto sú odporúčania, ktoré som zhromaždil za roky práce s produkčnými nasadeniami.
Zásady konfigurácie
- Predvolená politika DROP: Vždy nastavte predvolenú politiku na
droppre vstupný a forward reťazec. Explicitne povoľte len nevyhnutné služby. - Minimalizujte otvorené porty: Každý otvorený port je potenciálny útočný vektor. Ak službu nepotrebujete, neotvárajte pre ňu port.
- Používajte sety namiesto duplicitných pravidiel: Namiesto desiatich pravidiel pre desať IP adries vytvorte jeden set a jedno pravidlo. Prehľadnejšie a rýchlejšie.
- Vždy povoľte loopback: Pravidlo pre loopback rozhranie by malo byť úplne prvé v input reťazci.
- Nepoužívajte dva firewallové nástroje súčasne: Nftables a iptables-legacy by sa nikdy nemali používať súčasne. Vyberte si jeden.
Bezpečnostné opatrenia
- Logovanie: Logujte zahodené pakety, ale s rate limitom — inak vám logy zaplavía disk.
- Conntrack pre invalid pakety: Vždy zahadzujte pakety so stavom
invalid— sú to potenciálne útočné vektory. - ICMP s limitom: Povoľte ICMP (ping) pre diagnostiku, ale s rate limitom na ochranu pred ICMP flood.
- Pravidelný audit: Minimálne raz mesačne skontrolujte pravidlá firewallu. Odstraňujte nepoužívané pravidlá.
- Zálohy: Pred každou zmenou zálohujte aktuálnu konfiguráciu. Uchovávajte verziu v gite — budete mi vďační, keď budete potrebovať porovnať zmeny.
- Monitoring counterov: Pravidelne kontrolujte countery — nezvyčajne vysoké počty na drop pravidlách môžu indikovať prebiehajúci útok.
Bezpečnosť konfiguračného súboru
# Nastavenie správnych oprávnení na konfiguračný súbor
sudo chmod 600 /etc/nftables.conf
sudo chown root:root /etc/nftables.conf
# Verziovanie konfigurácie v gite
sudo git init /etc/nftables-git
sudo cp /etc/nftables.conf /etc/nftables-git/
cd /etc/nftables-git && sudo git add . && sudo git commit -m "Initial nftables config"
Záver: Nftables ako základ sieťovej bezpečnosti
Nftables nie je len nástupca iptables — je to zásadný pokrok v tom, ako pristupujeme k firewallu na Linuxe. Čistejšia syntax, lepší výkon, natívne sety a mapy, atomické aktualizácie a vstavaný tracing robia z nftables nástroj, ktorý je nielen výkonnejší, ale aj jednoduchší na správu.
V roku 2026, keď počet CVE v jadre Linuxu prekračuje 5 500 ročne a kybernetické útoky sú čoraz sofistikovanejšie, správne nakonfigurovaný firewall nie je luxus — je to prvá línia obrany.
Pamätajte však, že firewall je len jedna vrstva bezpečnosti. Kombinujte ho s ďalšími opatreniami — monitoring pomocou Wazuh, hardening SSH, bezpečnosť kontajnerov, pravidelné audity cez OpenSCAP — a vytvoríte viacvrstvovú obranu, ktorá výrazne zníži riziko kompromitácie vašej infraštruktúry.
Tak neváhajte — ak ešte používate iptables, teraz je ten správny čas na migráciu. Vaše servery vám poďakujú.