Configurare Firewall cu nftables pe Linux: Ghid Complet de Securizare

Ghid practic de configurare nftables pe Linux: de la instalare la configurații de producție cu seturi, rate limiting, geo-blocking și migrarea de la iptables.

nftables Linux 2026: Ghid Firewall Setup

De ce nftables e standardul de firewall pe Linux în 2026

Dacă administrezi servere Linux și încă scrii reguli iptables, hai să fim sinceri — e timpul să faci tranziția. nftables a înlocuit oficial iptables ca framework implicit de filtrare a pachetelor pe toate distribuțiile majore: Debian 11+, Ubuntu 22.04+, RHEL 9+, Fedora 35+ și AlmaLinux 9+. Iar iptables? Se află în modul de mentenanță moștenită, primind doar patch-uri de securitate. Funcționalități noi nu mai vin.

Și nu e doar o chestie de branding. Diferențele de performanță sunt reale.

Benchmark-urile SKUDONET din 2025-2026 arată că nftables gestionează cu aproximativ 118% mai mult trafic DNAT pe nucleu de procesor față de iptables — vorbim de ~561k cereri/sec vs. ~256k cereri/sec. La SNAT, diferența urcă la +132%. Când adaugi mai multe servere backend sau reguli, performanța iptables scade liniar, pe când nftables se menține constant datorită structurilor de date indexate.

Dar performanța e doar o parte din poveste. nftables oferă actualizări atomice ale setului de reguli (deci fără acea fereastră de vulnerabilitate la reload pe care o aveai cu iptables), management unificat IPv4/IPv6 într-un singur fișier de configurare și seturi native cu căutare O(1). Adică nu mai ai nevoie de ipset ca instrument separat.

În acest ghid parcurgem fiecare pas: de la instalare și conceptele de bază, la configurații avansate de securizare, rate limiting, geo-blocking și migrarea practică de la iptables.

Instalarea și activarea nftables

Pe majoritatea distribuțiilor moderne, nftables vine deja preinstalat. Dar merită să verifici explicit și să-l activezi ca serviciu persistent — nu vrei să descoperi după un reboot că firewall-ul nu s-a încărcat.

Instalare pe Debian/Ubuntu

# Verifică dacă nftables este instalat
nft --version

# Instalează dacă lipsește
sudo apt update && sudo apt install -y nftables

# Activează serviciul la boot
sudo systemctl enable nftables.service
sudo systemctl start nftables.service

# Verifică starea
sudo systemctl status nftables

Instalare pe RHEL/AlmaLinux/Fedora

# Pe RHEL 9+ / AlmaLinux 9+ / Fedora 35+
sudo dnf install -y nftables

# Dezactivează firewalld dacă vrei control direct nftables
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# Activează nftables
sudo systemctl enable nftables.service
sudo systemctl start nftables.service

Atenție: Nu rula UFW, firewalld și nftables direct în același timp. Toate trei manipulează reguli netfilter în kernel și o să genereze conflicte greu de depanat. Alege o singură abordare: fie firewalld ca frontend (care oricum folosește nftables ca backend), fie nftables direct pentru control granular.

Arhitectura nftables: tabele, lanțuri și reguli

Înainte de a scrie vreo regulă, trebuie să înțelegi cum e organizat nftables. E diferit fundamental de iptables, unde aveai tabele predefinite (filter, nat, mangle) mereu încărcate în kernel — chiar dacă nu le foloseai deloc.

Componentele principale

  • Tabela (Table) — Un container cu un nume și o familie de adrese. Familia determină ce tip de pachete procesează: ip (doar IPv4), ip6 (doar IPv6), inet (IPv4 + IPv6 — recomandat pentru majoritatea cazurilor), arp, sau bridge.
  • Lanțul (Chain) — O listă ordonată de reguli. Lanțurile de bază (base chains) se atașează la un hook din kernel (input, output, forward, prerouting, postrouting). Lanțurile obișnuite le apelezi prin jump sau goto.
  • Regula (Rule) — O expresie de potrivire urmată de o acțiune: accept, drop, reject, log, jump etc.
  • Setul (Set) — O colecție de valori (IP-uri, porturi, interfețe) cu căutare O(1). Înlocuiește complet ipset din iptables.
  • Map — Un set cu perechi cheie-valoare, care permite asocierea dinamică (de ex., port → acțiune).

Lucrul esențial de reținut: în nftables, nu se încarcă nimic în kernel decât ce definești tu explicit. Zero overhead pentru tabele sau lanțuri nefolosite. E un design mult mai curat.

Configurație de bază securizată pentru un server

Aceasta e configurația pe care o recomand ca punct de plecare pentru orice server Linux expus pe internet. Am folosit-o pe zeci de servere și e un fundament solid pe care poți construi. Folosește familia inet ca să gestionezi IPv4 și IPv6 dintr-un singur loc.

Fișierul /etc/nftables.conf

#!/usr/sbin/nft -f

# Ștergem orice reguli existente pentru un start curat
flush ruleset

table inet filter {

    # --- SETURI PENTRU MANAGEMENT ---

    # Porturi TCP permise (editează conform serviciilor tale)
    set tcp_acceptat {
        type inet_service
        elements = { 22, 80, 443 }
    }

    # IP-uri de administrare cu acces SSH dedicat
    set admin_ips {
        type ipv4_addr
        elements = { 10.0.0.0/8, 192.168.1.0/24 }
    }

    # --- LANȚUL INPUT ---
    chain input {
        type filter hook input priority 0; policy drop;

        # Conexiuni deja stabilite sau asociate — acceptă imediat
        ct state established,related accept

        # Trafic loopback — esențial pentru funcționarea locală
        iif "lo" accept

        # Pachete invalide — drop fără logare (reduce noise)
        ct state invalid drop

        # ICMP — permite ping cu rate limiting
        ip protocol icmp icmp type echo-request limit rate 5/second accept
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 5/second accept

        # ICMPv6 esențial — nu bloca, altfel IPv6 se strică
        ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, nd-router-solicit, nd-router-advert } accept

        # SSH restrictionat la IP-urile de administrare
        tcp dport 22 ip saddr @admin_ips accept

        # Porturi TCP publice din set
        tcp dport @tcp_acceptat accept

        # Logare pachete blocate (cu rate limiting la logare)
        limit rate 15/minute log prefix "[nftables-drop] " counter
        counter drop
    }

    # --- LANȚUL FORWARD ---
    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    # --- LANȚUL OUTPUT ---
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

# --- TABELĂ NAT (doar dacă e necesar) ---
# table inet nat {
#     chain prerouting {
#         type nat hook prerouting priority -100;
#     }
#     chain postrouting {
#         type nat hook postrouting priority 100;
#         oifname "eth0" masquerade
#     }
# }

Validarea și aplicarea configurației

# Verifică sintaxa FĂRĂ a aplica
sudo nft -c -f /etc/nftables.conf

# Aplică configurația
sudo nft -f /etc/nftables.conf

# Verifică regulile active
sudo nft list ruleset

# Verifică doar un tabel specific
sudo nft list table inet filter

Sfat de siguranță pentru servere remote: Dacă lucrezi pe un server la distanță (și știu din experiență cât de stresant poate fi), folosește această comandă de aplicare cu rollback automat:

# Aplică regulile, dar le șterge automat după 5 minute
# dacă nu confirmi manual
sudo nft -f /etc/nftables.conf && sleep 300 && sudo nft flush ruleset

Deschide un al doilea terminal și testează conexiunea SSH. Dacă totul merge, anulează comanda de rollback cu Ctrl+C. Dacă te-ai blocat accidental, regulile se șterg singure după 5 minute. Sincer, acest truc m-a salvat de câteva ori.

Seturi și maps: puterea reală a nftables

Seturile sunt, fără exagerare, funcționalitatea care face nftables cu adevărat superior. În loc să scrii câte o regulă separată pentru fiecare IP sau port, grupezi valorile într-un set și le referențiezi cu o singură regulă. Intern, seturile folosesc tabele hash cu căutare O(1) — performanța e identică fie că ai 10 sau 10.000 de elemente.

Set cu timeout pentru blocări temporare

# Definește un set cu timeout automat
table inet filter {
    set blocklist_temp {
        type ipv4_addr
        flags timeout
        timeout 1h    # Elementele expiră automat după 1 oră
    }

    chain input {
        type filter hook input priority 0; policy drop;
        ip saddr @blocklist_temp drop
        # ... restul regulilor
    }
}

# Adaugă un IP la blocklist din linia de comandă
sudo nft add element inet filter blocklist_temp { 203.0.113.50 timeout 30m }

# Adaugă mai multe IP-uri simultan
sudo nft add element inet filter blocklist_temp { 198.51.100.10, 198.51.100.11 }

# Verifică conținutul setului
sudo nft list set inet filter blocklist_temp

Verdict map pentru rutare diferențiată pe porturi

# Map care asociază porturi cu acțiuni diferite
table inet filter {
    map port_policy {
        type inet_service : verdict
        elements = {
            22 : accept,
            80 : accept,
            443 : accept,
            8080 : drop
        }
    }

    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        iif "lo" accept
        tcp dport vmap @port_policy
        counter drop
    }
}

Set concatenat pentru potriviri complexe

# Set care combină IP sursă + port destinație
table inet filter {
    set acces_servicii {
        type ipv4_addr . inet_service
        elements = {
            10.0.1.5 . 3306,     # MySQL doar de la acest IP
            10.0.1.10 . 5432,    # PostgreSQL doar de la acest IP
            10.0.1.20 . 6379     # Redis doar de la acest IP
        }
    }

    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        iif "lo" accept
        ip saddr . tcp dport @acces_servicii accept
        counter drop
    }
}

Seturile concatenate sunt extrem de utile pentru servere de baze de date unde fiecare serviciu trebuie accesibil doar de la anumite IP-uri. Practic, o singură regulă înlocuiește zeci de reguli individuale. Elegant și rapid.

Rate limiting și protecție anti-DDoS

nftables oferă rate limiting nativ prin mecanismul token bucket. Poți limita atât per pachet cât și per byte, și — asta e partea interesantă — poți aplica limite diferite per IP sursă folosind seturi dinamice.

Rate limiting per IP sursă

table inet filter {
    # Set dinamic pentru tracking per IP
    set rate_limit_ssh {
        type ipv4_addr
        flags dynamic, timeout
        timeout 5m
    }

    chain input {
        type filter hook input priority 0; policy drop;

        ct state established,related accept
        iif "lo" accept
        ct state invalid drop

        # SSH: max 3 conexiuni noi per minut per IP sursă
        tcp dport 22 ct state new \
            add @rate_limit_ssh { ip saddr limit rate 3/minute } accept

        # HTTP/HTTPS: max 30 cereri noi per secundă per IP
        tcp dport { 80, 443 } ct state new \
            limit rate 30/second accept

        # ICMP rate limiting global
        ip protocol icmp limit rate 10/second accept

        counter drop
    }
}

Denylist automatică pentru abuz

table inet filter {
    set denylist_auto {
        type ipv4_addr
        flags dynamic, timeout
        timeout 15m    # Ban automat 15 minute
    }

    chain input {
        type filter hook input priority 0; policy drop;

        # Verifică mai întâi dacă IP-ul e deja pe denylist
        ip saddr @denylist_auto drop

        ct state established,related accept
        iif "lo" accept

        # Dacă un IP încearcă mai mult de 10 conexiuni TCP noi
        # într-un minut, adaugă-l automat pe denylist
        tcp flags syn ct state new \
            meter flood_detect { ip saddr limit rate over 10/minute } \
            add @denylist_auto { ip saddr } drop

        tcp dport { 22, 80, 443 } accept
        counter drop
    }
}

Practic, ai un sistem de auto-apărare: IP-urile care depășesc pragul de conexiuni sunt blocate automat 15 minute, fără intervenție manuală. Combină asta cu Fail2Ban (mai jos) pentru protecție stratificată, și vei acoperi o gamă destul de largă de scenarii de atac.

Geo-blocking cu nftables

Dacă serverul tău servește exclusiv utilizatori din România sau din Europa, poți reduce semnificativ suprafața de atac blocând traficul din regiuni din care nu ai clienți. Pur și simplu nu are rost să accepți conexiuni din zone de unde vin 90% din scanările automate.

Utilizarea nft-geo-filter

# Instalează dependențele
sudo apt install -y python3 python3-requests

# Clonează instrumentul
git clone https://github.com/rpthms/nft-geo-filter.git
cd nft-geo-filter

# Permite doar traficul din România (RO) și țările UE comune
# Creează automat un tabel separat — nu afectează regulile existente
sudo python3 nft-geo-filter.py -t geo_filter \
    --allow RO DE FR NL BE AT \
    -f inet \
    --no-ipv6

# Verifică setul creat
sudo nft list table inet geo_filter

Abordare manuală cu seturi de intervale

table inet filter {
    # Set de IP-uri blocate pe țară (exemplu simplificat)
    set tari_blocate {
        type ipv4_addr
        flags interval
        auto-merge
        # Adaugă intervalele descărcate de la db-ip.com
        # sau alte surse de date GeoIP
    }

    chain input {
        type filter hook input priority -10; policy accept;

        # Blochează traficul din setul de țări
        ip saddr @tari_blocate drop
    }
}

O precizare importantă: Geo-blocking-ul nu e o soluție completă de securitate — atacatorii pot folosi VPN-uri și proxy-uri fără nicio problemă. Dar reduce considerabil volumul de scanări automate și brute-force din regiuni de unde nu aștepți trafic legitim. Gândește-l ca un strat suplimentar, nu ca o barieră de neclintit.

Migrarea de la iptables la nftables

Dacă ai un server cu reguli iptables existente, vestea bună e că nu trebuie să rescrii totul de la zero. nftables vine cu un utilitar de traducere automată care face treaba surprinzător de bine (cel puțin pentru regulile simple).

Traducerea regulilor existente

# Traduce o singură regulă
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Output: nft add rule ip filter INPUT tcp dport 22 counter accept

# Traduce întregul set de reguli
iptables-save | iptables-restore-translate

# Salvează traducerea într-un fișier
iptables-save | iptables-restore-translate > /etc/nftables-migrated.conf

# Verifică rezultatul înainte de aplicare
sudo nft -c -f /etc/nftables-migrated.conf

Lista de verificare pentru migrare

  1. Exportă regulile iptables curente: iptables-save > /root/iptables-backup.rules
  2. Traduce automat: Folosește iptables-restore-translate pentru conversia inițială
  3. Revizuiește manual: Traducerea automată e bună pentru reguli simple, dar cele complexe (mai ales cele cu module iptables specifice) pot necesita ajustări
  4. Optimizează: Înlocuiește regulile repetitive cu seturi nftables — aici e oportunitatea reală de a simplifica și accelera configurația
  5. Testează pe staging: Nu aplica direct pe producție, oricât de tentat ai fi
  6. Dezactivează iptables: sudo systemctl stop iptables && sudo systemctl disable iptables
  7. Activează nftables: sudo systemctl enable nftables && sudo systemctl start nftables
  8. Monitorizează: Verifică jurnalele și contoarele în primele 24 de ore — ceva tot se mai scapă

Atenție: Pe multe distribuții moderne, comanda iptables este de fapt iptables-nft — un layer de compatibilitate care traduce sintaxa iptables în reguli nftables pe fundal. Verifică cu iptables --version. Dacă vezi nf_tables în output, deja folosești nftables fără să știi.

Monitorizare și depanare

O configurație de firewall e la fel de bună ca abilitatea ta de a înțelege ce face de fapt. Am văzut configurații „perfecte" pe hârtie care în practică lăsau porturi deschise din cauza unei ordini greșite a regulilor. Nftables, din fericire, oferă instrumente bune de depanare.

Contoare și statistici

# Afișează regulile cu contoare (pachete/bytes procesate)
sudo nft list ruleset -a

# Resetează contoarele
sudo nft reset counters

# Afișează doar conținutul unui set
sudo nft list set inet filter blocklist_temp

# Afișează elementele cu detalii
sudo nft list meter inet filter flood_detect

Tracing în timp real

# Activează tracing pe un lanț
sudo nft add rule inet filter input meta nftrace set 1

# Monitorizează pachetele în timp real
sudo nft monitor trace

# Output exemplu:
# trace id 3f1... inet filter input packet: iif "eth0"
#   ip saddr 203.0.113.5 ip daddr 10.0.1.1
#   tcp sport 54321 tcp dport 22
# trace id 3f1... inet filter input rule tcp dport 22 accept (verdict accept)

Tracing-ul e extrem de util când ai o regulă care nu se comportă cum te aștepți. Îți arată exact ce regulă a potrivit pachetul și ce verdict s-a aplicat. Doar nu uita să-l dezactivezi după — generează un volum serios de date și poate afecta performanța.

# Dezactivează tracing (șterge regula cu handle-ul specific)
sudo nft -a list chain inet filter input
# Notează handle-ul regulii de trace (ex: handle 15)
sudo nft delete rule inet filter input handle 15

Configurație completă de producție

Deci, hai să punem totul cap la cap. Mai jos e o configurație completă care integrează tot ce am discutat: rate limiting, seturi dinamice, protecție SSH, logare. E varianta pe care o folosesc pe serverele de producție, adaptată evident la nevoile fiecărui proiect.

#!/usr/sbin/nft -f
flush ruleset

table inet firewall {

    # === SETURI STATICE ===
    set admin_ips {
        type ipv4_addr
        flags interval
        elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }
    }

    set porturi_publice_tcp {
        type inet_service
        elements = { 80, 443 }
    }

    # === SETURI DINAMICE ===
    set denylist {
        type ipv4_addr
        flags dynamic, timeout
        timeout 30m
    }

    set rate_ssh {
        type ipv4_addr
        flags dynamic, timeout
        timeout 10m
    }

    # === INPUT ===
    chain input {
        type filter hook input priority 0; policy drop;

        # Blocare imediată IP-uri din denylist
        ip saddr @denylist counter drop

        # Conexiuni stabilite
        ct state established,related accept

        # Loopback
        iif "lo" accept

        # Invalide
        ct state invalid counter drop

        # ICMP cu limită
        ip protocol icmp icmp type echo-request limit rate 5/second counter accept
        ip6 nexthdr icmpv6 icmpv6 type { echo-request, nd-neighbor-solicit, nd-neighbor-advert, nd-router-solicit, nd-router-advert } limit rate 10/second accept

        # SSH — doar din rețele admin, cu rate limiting
        tcp dport 22 ip saddr @admin_ips ct state new add @rate_ssh { ip saddr limit rate 5/minute } counter accept

        # Flood detection — adaugă automat pe denylist
        tcp flags syn ct state new meter syn_flood { ip saddr limit rate over 25/second burst 50 packets } add @denylist { ip saddr } counter drop

        # Porturi publice TCP
        tcp dport @porturi_publice_tcp ct state new counter accept

        # Logare (cu rate limiting la logare)
        limit rate 10/minute log prefix "[nft-blocked] " counter
        counter drop
    }

    # === FORWARD ===
    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    # === OUTPUT ===
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Integrarea cu Fail2Ban

Fail2Ban are suport nativ pentru nftables de ceva vreme. Dacă ai deja Fail2Ban instalat (și dacă ai citit articolul nostru despre securizarea SSH, probabil îl ai), trebuie doar să schimbi acțiunea de ban din iptables în nftables.

# /etc/fail2ban/jail.local
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]

chain = input

[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 7200
findtime = 600
# Verifică regulile create de Fail2Ban
sudo nft list ruleset | grep -A 5 f2b

# Verifică IP-urile blocate
sudo fail2ban-client status sshd

Fail2Ban creează automat un tabel și un set nftables separat pentru IP-urile blocate. Nu interferează cu regulile tale din /etc/nftables.conf, deci nu trebuie să-ți faci griji de conflicte.

Cele mai frecvente greșeli și cum să le eviți

  1. Politica implicită accept pe lanțul input: Fără policy drop, firewall-ul tău nu blochează efectiv nimic. E cel mai frecvent lucru uitat la migrarea de la iptables — am văzut asta de prea multe ori.
  2. Uiți să permiți traficul loopback: Multe aplicații (baze de date, cache-uri, servicii locale) comunică prin interfața lo. Fără iif "lo" accept, aplicațiile se blochează misterios și pierzi ore bune depanând în direcția greșită.
  3. Amesteci iptables cu nftables: Rularea simultană creează reguli conflictuale în kernel. Alege una și dezactiveaz-o pe cealaltă.
  4. Folosești scripturi shell în loc de sintaxa nativă: Scripturile shell nu sunt atomice. Între execuția a două comenzi nft add, firewall-ul se află într-o stare parțială (și deci vulnerabilă). Scrie regulile în /etc/nftables.conf și încarcă-le cu nft -f.
  5. Blochezi ICMPv6 complet: IPv6 depinde de ICMPv6 pentru neighbor discovery, router advertisements și Path MTU Discovery. Blochezi tot ICMPv6? Conectivitatea IPv6 se deteriorează sau se oprește.
  6. Nu testezi pe un mediu separat: O greșeală în configurația firewall-ului te poate bloca permanent din serverul remote. Mereu folosește tehnica de rollback automat sau un mediu de staging.

Întrebări frecvente

nftables înlocuiește complet iptables?

Da. Proiectul Netfilter a plasat iptables în modul de mentenanță moștenită. Pe toate distribuțiile majore lansate după 2019, nftables e framework-ul implicit. Comanda iptables pe sisteme moderne este de fapt iptables-nft, un layer de compatibilitate. Pentru instalări noi, nu mai are niciun sens să folosești iptables direct.

Este nftables mai rapid decât iptables?

Depinde. Pentru seturi mari de reguli și trafic intens, nftables e semnificativ mai rapid datorită structurilor de date indexate (seturi cu căutare O(1) vs. procesare liniară O(n) în iptables). Benchmark-urile SKUDONET arată îmbunătățiri de peste 100% la trafic NAT. Pentru seturi foarte mici de reguli cu pachete mici, performanța e similară sau chiar ușor inferioară din cauza overhead-ului mașinii virtuale bytecode.

Pot folosi firewalld împreună cu nftables?

Da — firewalld poate folosi nftables ca backend, și pe RHEL 9+ face asta implicit. Dar nu scrie reguli nftables manual în paralel cu firewalld, pentru că se vor suprascrie reciproc. Alege fie firewalld ca frontend, fie nftables direct cu /etc/nftables.conf.

Cum îmi verific regulile active fără a modifica nimic?

Comanda sudo nft list ruleset afișează toate regulile active. Pentru validarea unui fișier fără aplicare, folosește sudo nft -c -f /etc/nftables.conf — flag-ul -c face doar verificarea sintaxei.

Ce se întâmplă cu regulile mele la repornirea serverului?

Regulile adăugate cu nft add direct din terminal sunt volatile — se pierd la repornire. Pentru persistență, scrie-le în /etc/nftables.conf. Serviciul systemd nftables.service încarcă automat acest fișier la boot. Verifică doar că serviciul e activat: systemctl is-enabled nftables.

Despre Autor Editorial Team

Our team of expert writers and editors.