Πλήρης Οδηγός nftables στο Linux (2026): Θωράκιση Firewall, Προστασία DDoS και Flowtables

Πλήρης οδηγός θωράκισης firewall με nftables στο Linux (2026). Καλύπτει production-ready rulesets, προστασία DDoS με synproxy, flowtables, rate limiting, αυτόματο blacklisting, geo-blocking και πρακτικά παραδείγματα μετάβασης από iptables.

Εισαγωγή: Γιατί το nftables Είναι το Μέλλον του Linux Firewall

Αν εξακολουθείτε να χρησιμοποιείτε iptables το 2026, ήρθε η ώρα να αλλάξετε σελίδα — και το εννοώ. Το nftables δεν είναι απλά μια αναβάθμιση. Είναι μια ριζική αναδιάρθρωση ολόκληρου του πλαισίου φιλτραρίσματος πακέτων στον πυρήνα του Linux. Από τον kernel 3.13 και μετά, το nftables αντικαθιστά σταδιακά το iptables, ip6tables, arptables και ebtables, προσφέροντας ένα ενοποιημένο, αποδοτικό και ευέλικτο εργαλείο.

Τα νούμερα μιλάνε μόνα τους: το 78% των νέων Linux deployments το 2026 χρησιμοποιούν nftables ως το κύριο framework φιλτραρίσματος. Debian 12+, Ubuntu 22.04+, RHEL 9+, Fedora 38+ — όλες οι μεγάλες διανομές το έχουν ήδη ως προεπιλογή. Ακόμα και το Kubernetes ecosystem μεταβαίνει σε nftables backends για τα kube-proxy components.

Λοιπόν, ας μπούμε στο ψητό. Σε αυτόν τον οδηγό θα καλύψουμε τα πάντα: από τις βασικές αρχές μέχρι προχωρημένες τεχνικές hardening, προστασία DDoS με synproxy, flowtables για επιτάχυνση δικτύου, αυτόματο blacklisting, geo-blocking και ολοκληρωμένα production-ready rulesets. Κάθε ενότητα περιλαμβάνει πρακτικό κώδικα που μπορείτε να εφαρμόσετε αμέσως.

Αρχιτεκτονική nftables: Τι Αλλάζει σε Σχέση με το iptables

Ενοποιημένο Framework

Το μεγαλύτερο πλεονέκτημα του nftables; Η ενοποίηση. Αντί για τέσσερα ξεχωριστά εργαλεία (iptables, ip6tables, arptables, ebtables), έχουμε ένα μόνο: το nft. Η νέα οικογένεια inet χειρίζεται ταυτόχρονα IPv4 και IPv6 traffic, εξαλείφοντας πλήρως την ανάγκη για διπλά rulesets.

# Παλιό iptables — χρειαζόσουν δύο ξεχωριστά rules
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT

# Νέο nftables — ένα rule για IPv4+IPv6
nft add rule inet filter input tcp dport 443 accept

Δομή: Tables, Chains, Rules

Το nftables οργανώνεται σε μια σαφή ιεραρχία:

  • Tables: Ο κύριος container — ορίζετε την οικογένεια (ip, ip6, inet, arp, bridge, netdev)
  • Chains: Ορίζουν πού εφαρμόζονται οι κανόνες (input, output, forward, κ.λπ.)
  • Rules: Τα πραγματικά κριτήρια αντιστοίχισης και οι ενέργειες

Εδώ υπάρχει μια κρίσιμη διαφορά: στο nftables δεν υπάρχουν προκαθορισμένα tables ή chains. Δημιουργείτε ακριβώς αυτά που χρειάζεστε — τίποτα παραπάνω. Αυτό μειώνει δραματικά το overhead σε σχέση με τα built-in chains του iptables που υπάρχουν πάντα, ακόμα κι αν δεν τα χρησιμοποιείτε.

# Δημιουργία table και base chains
nft add table inet firewall

nft add chain inet firewall input { \
    type filter hook input priority 0 \; \
    policy drop \; \
}

nft add chain inet firewall forward { \
    type filter hook forward priority 0 \; \
    policy drop \; \
}

nft add chain inet firewall output { \
    type filter hook output priority 0 \; \
    policy accept \; \
}

Atomic Rule Updates

Ένα από τα πιο σημαντικά χαρακτηριστικά του nftables είναι οι ατομικές ενημερώσεις. Μπορείτε να φορτώσετε ολόκληρο το ruleset από αρχείο σε μία κίνηση — χωρίς race conditions ή εκείνα τα ενοχλητικά μικρά παράθυρα χωρίς κανόνες κατά τη διάρκεια reload:

# Φόρτωση ολόκληρου ruleset ατομικά
nft -f /etc/nftables.conf

# Εναλλακτικά, flush + reload σε ένα αρχείο
#!/usr/sbin/nft -f
flush ruleset
include "/etc/nftables.d/*.nft"

Production-Ready Ruleset: Βήμα προς Βήμα

Βασική Δομή και Default Deny Policy

Η θεμελιώδης αρχή κάθε secure firewall: απόρριψε τα πάντα εκτός αν ρητά επιτρέπονται. Ας φτιάξουμε ένα πλήρες ruleset για production server.

#!/usr/sbin/nft -f

# Καθαρισμός όλων των υπαρχόντων κανόνων
flush ruleset

# Κύριο table — inet για dual-stack IPv4/IPv6
table inet firewall {

    # ===== SETS =====

    # Επιτρεπόμενες TCP θύρες
    set allowed_tcp_ports {
        type inet_service
        elements = { 22, 80, 443 }
    }

    # Αξιόπιστα δίκτυα για SSH
    set trusted_ssh_networks {
        type ipv4_addr
        flags interval
        elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }
    }

    # Blacklist — δυναμικό set με auto-expire
    set blacklist_v4 {
        type ipv4_addr
        flags dynamic,timeout
        timeout 1h
    }

    set blacklist_v6 {
        type ipv6_addr
        flags dynamic,timeout
        timeout 1h
    }

    # Rate limit tracking
    set rate_limit_v4 {
        type ipv4_addr
        flags dynamic,timeout
        timeout 5m
    }

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

        # Loopback — πάντα accept
        iif "lo" accept

        # Connection tracking — established/related
        ct state established,related accept

        # Drop invalid packets
        ct state invalid drop

        # Blacklist check
        ip saddr @blacklist_v4 drop
        ip6 saddr @blacklist_v6 drop

        # ICMP — επιτρέπουμε βασικά
        ip protocol icmp icmp type {
            echo-request,
            echo-reply,
            destination-unreachable,
            time-exceeded
        } accept

        ip6 nexthdr icmpv6 icmpv6 type {
            echo-request,
            echo-reply,
            nd-neighbor-solicit,
            nd-neighbor-advert,
            nd-router-solicit,
            nd-router-advert
        } accept

        # SSH — μόνο από trusted networks
        ip saddr @trusted_ssh_networks tcp dport 22 accept

        # Επιτρεπόμενες θύρες (HTTP, HTTPS)
        tcp dport { 80, 443 } accept

        # Logging αρνημένων πακέτων
        log prefix "[nft-drop-input] " flags all counter drop
    }

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

        ct state established,related accept
        ct state invalid drop
    }

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

        # Προαιρετικά: logging εξερχόμενων
        # ct state new log prefix "[nft-new-outbound] "
    }
}

Ανάλυση Κρίσιμων Στοιχείων

Ας αναλύσουμε τα πιο σημαντικά κομμάτια αυτού του ruleset:

  • Named Sets: Τα allowed_tcp_ports, trusted_ssh_networks και blacklist_v4 είναι named sets. Το ωραίο είναι ότι μπορείτε να τα ενημερώνετε χωρίς να αλλάζετε τους κανόνες. Θέλετε νέα θύρα; nft add element inet firewall allowed_tcp_ports { 8443 } — τόσο απλά.
  • Dynamic Sets με Timeout: Τα sets blacklist_v4 και rate_limit_v4 χρησιμοποιούν flags dynamic,timeout — τα στοιχεία τους προστίθενται αυτόματα από κανόνες και λήγουν μετά από καθορισμένο χρόνο
  • Connection Tracking: Η γραμμή ct state established,related accept είναι κρίσιμη. Επιτρέπει τα πακέτα που ανήκουν σε ήδη εγκαθιδρυμένες συνδέσεις, μειώνοντας δραματικά τον αριθμό κανόνων που πρέπει να αξιολογηθούν
  • ICMPv6 Neighbor Discovery: Μην μπλοκάρετε ποτέ τα nd-neighbor-solicit και nd-neighbor-advert. Χωρίς αυτά, το IPv6 απλά δεν λειτουργεί (το έμαθα με τον δύσκολο τρόπο σε ένα production incident)

Προχωρημένο Rate Limiting και Αυτόματο Blacklisting

Δυναμικό Rate Limiting ανά IP

Μια από τις πιο ισχυρές δυνατότητες του nftables είναι ο συνδυασμός dynamic sets με rate limiting. Ειλικρινά, αυτό είναι κάτι που στο iptables ήταν πολύ δύσκολο να υλοποιήσεις σωστά. Τώρα μπορούμε να δημιουργήσουμε κανόνες που αυτόματα εντοπίζουν και μπλοκάρουν IP διευθύνσεις που υπερβαίνουν τα όρια:

table inet rate_limiter {

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

    set conn_flood_v4 {
        type ipv4_addr
        flags dynamic,timeout
        timeout 5m
    }

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

        # SSH brute-force protection
        # Αν κάποιος κάνει πάνω από 5 νέες SSH συνδέσεις σε 60 δευτερόλεπτα,
        # μπαίνει στο brute_force set
        tcp dport 22 ct state new \
            add @brute_force_v4 { ip saddr limit rate over 5/minute } \
            drop

        # HTTP connection flood protection
        # Μέγιστο 50 νέες συνδέσεις ανά δευτερόλεπτο ανά IP
        tcp dport { 80, 443 } ct state new \
            add @conn_flood_v4 { ip saddr limit rate over 50/second } \
            drop

        # Γενικό rate limit — μέγιστο 200 νέες συνδέσεις ανά λεπτό ανά IP
        ct state new \
            add @conn_flood_v4 { ip saddr limit rate over 200/minute burst 50 packets } \
            drop
    }
}

Αυτόματο Blacklisting Επαναλαμβανόμενων Παραβατών

Για πιο μόνιμο blacklisting, μπορούμε να χρησιμοποιήσουμε meters σε συνδυασμό με αυτόματη προσθήκη σε persistent blacklist. Το παρακάτω script μπορεί να τρέχει μέσω cron κάθε 5 λεπτά:

# Αυτοματοποιημένο blacklisting script
#!/bin/bash
# /usr/local/bin/nft-auto-blacklist.sh

LOG_FILE="/var/log/nftables-drops.log"
BLACKLIST_FILE="/etc/nftables.d/blacklist.nft"
THRESHOLD=100  # Πάνω από 100 drops → permanent ban

# Εξαγωγή IP με περισσότερα drops από το threshold
declare -A ip_counts

while IFS= read -r line; do
    ip=$(echo "$line" | grep -oP 'SRC=\K[0-9.]+' )
    if [[ -n "$ip" ]]; then
        ((ip_counts[$ip]++))
    fi
done < <(grep "nft-drop-input" "$LOG_FILE")

# Προσθήκη στο permanent blacklist
for ip in "${!ip_counts[@]}"; do
    count=${ip_counts[$ip]}
    if (( count > THRESHOLD )); then
        echo "nft add element inet firewall blacklist_v4 { $ip timeout 24h }" >> "$BLACKLIST_FILE"
        nft add element inet firewall blacklist_v4 { "$ip" timeout 24h }
        logger -t nft-blacklist "Blocked $ip — $count violations"
    fi
done

Το script εξετάζει τα logs του firewall και μπλοκάρει αυτόματα IP που παράγουν υπερβολικά drops. Απλό, αποτελεσματικό, και δεν χρειάζεται κάποιο εξωτερικό εργαλείο.

Προστασία DDoS με nftables Synproxy

Τι Είναι το Synproxy

Το synproxy είναι ένας μηχανισμός που προστατεύει τους servers από SYN flood attacks. Αντί η εφαρμογή να διαχειρίζεται κάθε TCP 3-way handshake, το synproxy παρεμβαίνει στο επίπεδο του kernel, χρησιμοποιώντας SYN cookies χωρίς να καταναλώνει πόρους conntrack.

Μόνο αφού ολοκληρωθεί επιτυχώς το handshake, η σύνδεση περνάει στην εφαρμογή. Με λίγα λόγια, οι κακόβουλες συνδέσεις δεν φτάνουν ποτέ στον server σας.

Ρύθμιση Synproxy στο nftables

# Πρώτα ρυθμίζουμε τις παραμέτρους του kernel
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.netfilter.nf_conntrack_tcp_loose=0

# Synproxy ruleset
table inet synproxy_table {

    chain prerouting {
        type filter hook prerouting priority raw; policy accept;

        # Παράκαμψη conntrack για SYN πακέτα στη θύρα 443
        tcp dport 443 tcp flags syn notrack
    }

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

        # Loopback
        iif "lo" accept

        # Established connections
        ct state established,related accept

        # Invalid — drop
        ct state invalid drop

        # Synproxy για HTTPS traffic
        tcp dport 443 ct state untracked \
            synproxy mss 1460 wscale 7 timestamp sack-perm

        # Πακέτα synproxy που πέρασαν τον έλεγχο
        ct state new accept
    }
}

Ποσοτικά Αποτελέσματα

Τα αποτελέσματα είναι πραγματικά εντυπωσιακά. Σε ένα τυπικό SYN flood attack:

  • Χωρίς synproxy: Ο server εξαντλεί τους πόρους conntrack σε λίγα δευτερόλεπτα με 500K+ SYN/sec
  • Με synproxy: Ο server αντέχει 2M+ SYN/sec χωρίς σημαντική αύξηση latency στις νόμιμες συνδέσεις
  • Κατανάλωση μνήμης: Μειώνεται κατά ~95% επειδή δεν δημιουργούνται conntrack entries για κακόβουλα SYN πακέτα

Αυτά τα νούμερα δεν είναι θεωρητικά — μιλάμε για πραγματικές βελτιώσεις σε production περιβάλλοντα.

Flowtables: Επιτάχυνση Δικτύου στο Επίπεδο Kernel

Πώς Λειτουργούν τα Flowtables

Τα flowtables είναι ίσως η πιο υποτιμημένη δυνατότητα του nftables. Πρόκειται για fast-path μηχανισμό που παρακάμπτει το κανονικό netfilter processing για εγκαθιδρυμένες συνδέσεις. Αντί κάθε πακέτο established σύνδεσης να περνάει από ολόκληρη την αλυσίδα κανόνων, τα flowtables δρομολογούν τα πακέτα απευθείας στο σωστό network interface.

Τι σημαίνει αυτό σε πράξη;

  • Latency: Μείωση κατά ~7.5% σε τυπικά workloads (από 0.127ms σε 0.118ms)
  • Throughput σε ARM64: Αύξηση 2-3x σε low-power devices
  • CPU utilization: Σημαντική μείωση σε servers υψηλής κίνησης

Ρύθμιση Flowtables

table inet firewall {

    # Ορισμός flowtable — καθορίζουμε τα interfaces
    flowtable ft {
        hook ingress priority 0
        devices = { eth0, eth1 }
    }

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

        # Established connections → flowtable fast path
        ct state established flow add @ft counter accept

        # Related traffic
        ct state related accept

        # Νέες συνδέσεις — εφαρμόζουμε κανόνες
        ct state new jump forward_new

        ct state invalid drop
    }

    chain forward_new {
        # Κανόνες για νέες συνδέσεις
        ip saddr 10.0.0.0/24 ip daddr 172.16.0.0/24 accept
        ip saddr 172.16.0.0/24 ip daddr 10.0.0.0/24 accept
        log prefix "[nft-fwd-drop] " drop
    }
}

Hardware Offload

Αν η κάρτα δικτύου σας υποστηρίζει TC hardware offload (π.χ. Mellanox ConnectX, Intel E810), μπορείτε να ενεργοποιήσετε πλήρη hardware acceleration:

# Flowtable με hardware offload
flowtable ft {
    hook ingress priority 0
    devices = { eth0, eth1 }
    flags offload
}

# Έλεγχος αν λειτουργεί
nft list flowtable inet firewall ft
ethtool -k eth0 | grep hw-tc-offload

Με hardware offload, τα πακέτα established συνδέσεων δεν αγγίζουν καν τον CPU — η κάρτα δικτύου τα δρομολογεί εξ ολοκλήρου σε hardware. Σε data center περιβάλλοντα, αυτό μεταφράζεται σε throughput 100Gbps+ χωρίς CPU bottleneck. Ναι, διαβάσατε σωστά.

Geo-Blocking: Φιλτράρισμα Κίνησης Βάσει Χώρας

Υλοποίηση με nft-geo-filter

Το geo-blocking σας επιτρέπει να επιτρέπετε ή να αποκλείετε traffic βάσει χώρας προέλευσης. Αυτό είναι ιδιαίτερα χρήσιμο αν ο server σας εξυπηρετεί μόνο συγκεκριμένες γεωγραφικές περιοχές:

# Εγκατάσταση nft-geo-filter
git clone https://github.com/rpthms/nft-geo-filter.git
cd nft-geo-filter

# Δημιουργία nftables set με IP blocks για συγκεκριμένες χώρες
# Αποκλεισμός traffic από χώρες υψηλού κινδύνου
./nft-geo-filter -t inet -T firewall -s geo_block \
    -l CN,RU,KP,IR \
    -f ipv4 \
    -p dbip

# Αυτό δημιουργεί ένα named set "geo_block" στο table "firewall"
# Στη συνέχεια, προσθέτουμε κανόνα:
nft add rule inet firewall input ip saddr @geo_block drop

Αυτόματη Ενημέρωση IP Blocks

# /etc/cron.weekly/update-geo-blocks.sh
#!/bin/bash
set -euo pipefail

GEOFILTER_DIR="/opt/nft-geo-filter"
TABLE="inet firewall"
SET_NAME="geo_block"
COUNTRIES="CN,RU,KP,IR"

# Ενημέρωση IP blocks
cd "$GEOFILTER_DIR"

# Flush παλιού set
nft flush set $TABLE $SET_NAME

# Φόρτωση νέων blocks
./nft-geo-filter -t inet -T firewall -s "$SET_NAME" \
    -l "$COUNTRIES" \
    -f ipv4 \
    -p dbip

ELEMENT_COUNT=$(nft list set $TABLE $SET_NAME | grep -c "elements")
logger -t geo-block "Updated geo-block set: $ELEMENT_COUNT ranges loaded"

Μια σημαντική σημείωση εδώ: Το geo-blocking δεν είναι κάποια μαγική λύση ασφάλειας. Οι εισβολείς χρησιμοποιούν VPN, Tor, και compromised servers σε "επιτρεπόμενες" χώρες. Χρησιμοποιήστε το ως ένα επιπλέον στρώμα — ποτέ ως τη μοναδική σας άμυνα.

Verdict Maps και Concatenations: Αποδοτικοί Πολύπλοκοι Κανόνες

Verdict Maps (vmaps)

Τα verdict maps σας επιτρέπουν να δρομολογείτε πακέτα σε διαφορετικά chains βάσει τιμών, αντί να γράφετε πολλούς ξεχωριστούς κανόνες. Σκεφτείτε τα σαν ένα switch statement για τον firewall σας:

table inet firewall {

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

        ct state established,related accept

        # Δρομολόγηση βάσει πρωτοκόλλου
        ip protocol vmap {
            tcp : jump tcp_input,
            udp : jump udp_input,
            icmp : jump icmp_input
        }
    }

    chain tcp_input {
        # SSH — rate limited
        tcp dport 22 ct state new limit rate 3/minute accept

        # Web services
        tcp dport { 80, 443 } accept

        # Database — μόνο εσωτερικό δίκτυο
        ip saddr 10.0.0.0/8 tcp dport { 3306, 5432, 6379 } accept
    }

    chain udp_input {
        # DNS
        udp dport 53 accept

        # WireGuard VPN
        udp dport 51820 accept
    }

    chain icmp_input {
        icmp type echo-request limit rate 10/second accept
        icmp type { destination-unreachable, time-exceeded } accept
    }
}

Concatenations για Multi-Field Matching

Τα concatenations σας επιτρέπουν να συνδυάσετε πολλαπλά πεδία σε ένα μόνο set lookup. Αυτό είναι εξαιρετικά αποδοτικό για σύνθετους κανόνες:

table inet firewall {

    # Set με συνδυασμό IP + port + protocol
    set service_access {
        type ipv4_addr . inet_service . inet_proto
        elements = {
            10.0.1.0/24 . 3306 . tcp,    # DB access από app subnet
            10.0.2.0/24 . 6379 . tcp,    # Redis access από cache subnet
            10.0.3.0/24 . 9090 . tcp,    # Prometheus από monitoring subnet
            192.168.1.0/24 . 22 . tcp    # SSH από management subnet
        }
    }

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

        ct state established,related accept

        # Ένα μόνο rule αντί για τέσσερα ξεχωριστά
        ip saddr . tcp dport . meta l4proto @service_access accept
    }
}

Γιατί είναι τόσο σημαντικό; Το nftables χρησιμοποιεί εσωτερικά hashtables ή red-black trees για τα sets, εξασφαλίζοντας O(1) ή O(log n) lookup αντί για γραμμική αναζήτηση. Όταν έχετε δεκάδες ή εκατοντάδες service access rules, η διαφορά στην απόδοση είναι τεράστια.

Logging και Monitoring

Αποτελεσματικό Logging

Το logging στο nftables είναι κρίσιμο για security monitoring, αλλά πρέπει να γίνεται στρατηγικά. Υπερβολικό logging μπορεί να γονατίσει τον server σας — κάτι που προφανώς θέλουμε να αποφύγουμε:

table inet firewall {

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

        ct state established,related accept

        # Rate-limited logging — αποφεύγουμε log flooding
        ct state invalid log prefix "[nft-invalid] " limit rate 10/minute counter drop

        # Logging νέων συνδέσεων σε κρίσιμες θύρες
        tcp dport 22 ct state new log prefix "[nft-ssh-new] " \
            flags all counter accept

        # Logging rejected traffic
        tcp dport 1-1024 log prefix "[nft-reject-priv] " \
            limit rate 30/minute counter reject with tcp reset

        # Default drop με logging
        log prefix "[nft-drop] " limit rate 60/minute counter drop
    }
}

Ενσωμάτωση με Systemd Journal και SIEM

# Παρακολούθηση logs σε πραγματικό χρόνο
journalctl -k --grep="nft-" -f

# Εξαγωγή σε αρχείο για SIEM
# /etc/rsyslog.d/nftables.conf
:msg, contains, "nft-" /var/log/nftables.log
& stop

# Logrotate ρύθμιση
# /etc/logrotate.d/nftables
/var/log/nftables.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        /usr/bin/systemctl restart rsyslog
    endscript
}

Monitoring με Prometheus

Για ολοκληρωμένο monitoring, μπορείτε να εξάγετε nftables counters στο Prometheus. Το παρακάτω script κάνει ακριβώς αυτό:

# Script εξαγωγής metrics
#!/bin/bash
# /usr/local/bin/nft-exporter.sh

OUTPUT="/var/lib/prometheus/node-exporter/nftables.prom"
TMPFILE=$(mktemp)

echo "# HELP nft_chain_packets Total packets processed by chain" > "$TMPFILE"
echo "# TYPE nft_chain_packets counter" >> "$TMPFILE"

nft list ruleset -j 2>/dev/null | python3 -c "
import json, sys
data = json.load(sys.stdin)
for item in data.get('nftables', []):
    if 'chain' in item:
        chain = item['chain']
        name = chain.get('name', 'unknown')
        family = chain.get('family', 'unknown')
        table = chain.get('table', 'unknown')
    if 'rule' in item:
        rule = item['rule']
        for expr in rule.get('expr', []):
            if 'counter' in expr:
                counter = expr['counter']
                pkts = counter.get('packets', 0)
                bytez = counter.get('bytes', 0)
                chain_name = rule.get('chain', 'unknown')
                table_name = rule.get('table', 'unknown')
                print(f'nft_chain_packets{{table=\"{table_name}\",chain=\"{chain_name}\"}} {pkts}')
                print(f'nft_chain_bytes{{table=\"{table_name}\",chain=\"{chain_name}\"}} {bytez}')
" >> "$TMPFILE"

mv "$TMPFILE" "$OUTPUT"

Μετάβαση από iptables: Πρακτικός Οδηγός

Αυτόματη Μετατροπή Κανόνων

Αν έχετε ήδη iptables rules (και ποιος δεν έχει;), το εργαλείο iptables-translate μπορεί να τα μετατρέψει αυτόματα:

# Μετατροπή μεμονωμένου κανόνα
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Αποτέλεσμα: nft add rule ip filter INPUT tcp dport 22 counter accept

# Μετατροπή ολόκληρου ruleset
iptables-save > /tmp/iptables-backup.rules
iptables-restore-translate -f /tmp/iptables-backup.rules > /tmp/nftables-translated.nft

# Επιθεώρηση πριν εφαρμόσετε
cat /tmp/nftables-translated.nft

# Εφαρμογή
nft -f /tmp/nftables-translated.nft

Βήματα Μετάβασης

Η μετάβαση δεν χρειάζεται να σας τρομάζει. Ακολουθήστε αυτά τα βήματα:

  1. Backup: Αποθηκεύστε τα τρέχοντα iptables rules: iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
  2. Μετατροπή: Χρησιμοποιήστε iptables-restore-translate για αυτόματη μετατροπή
  3. Έλεγχος: Εξετάστε τους μεταφρασμένους κανόνες — πολλοί θα χρειαστούν βελτιστοποίηση
  4. Δοκιμή: Εφαρμόστε σε staging ή χρησιμοποιήστε nft -c -f rules.nft για dry-run
  5. Παράλληλη λειτουργία: Χρησιμοποιήστε το iptables-nft compatibility layer κατά τη μεταβατική περίοδο
  6. Πλήρης μετάβαση: Αφαιρέστε τα iptables packages και χρησιμοποιήστε αποκλειστικά nftables
# Έλεγχος ποιο backend χρησιμοποιεί η διανομή σας
update-alternatives --query iptables   # Debian/Ubuntu
alternatives --display iptables        # RHEL/Fedora

# Μετάβαση σε nft backend (αν δεν είναι ήδη)
update-alternatives --set iptables /usr/sbin/iptables-nft

# Αφαίρεση legacy iptables
apt purge iptables     # Debian/Ubuntu
dnf remove iptables    # RHEL/Fedora

Hardening Checklist: 20 Βήματα για Ασφαλές nftables

Αυτή η λίστα ελέγχου είναι κάτι που κρατάω πάντα ανοιχτή όταν στήνω νέο server. Ακολουθεί μια ολοκληρωμένη λίστα για θωράκιση του nftables σας:

  1. Default deny policy σε input και forward chains
  2. Accept output αλλά monitor — log νέες εξερχόμενες συνδέσεις σε κρίσιμες θύρες
  3. Connection tracking πρώταct state established,related accept πάντα στην κορυφή
  4. Drop invalid packetsct state invalid drop πριν από κάθε άλλο κανόνα
  5. Rate limit SSH — μέγιστο 3-5 νέες συνδέσεις ανά λεπτό ανά IP
  6. Περιορισμός SSH σε trusted networks — μόνο από γνωστά IP ή VPN
  7. ICMPv6 — μην μπλοκάρετε ND — Neighbor Discovery είναι απαραίτητο
  8. Synproxy για δημόσιες υπηρεσίες — ειδικά HTTP/HTTPS
  9. Flowtables για forwarding — μειώνουν CPU load σε routing/NAT servers
  10. Αυτόματο blacklisting — dynamic sets με timeout για repeat offenders
  11. Geo-blocking — αν εξυπηρετείτε συγκεκριμένες περιοχές
  12. Named sets αντί hardcoded τιμών — ευκολότερη διαχείριση
  13. Logging με rate limit — μην κατακλύζετε τα logs
  14. Atomic ruleset loading — πάντα φόρτωση από αρχείο, όχι μεμονωμένα commands
  15. Backup πριν κάθε αλλαγήnft list ruleset > backup.nft
  16. Dry-run testingnft -c -f rules.nft πριν εφαρμόσετε
  17. Version control — κρατήστε τα nftables configs σε git
  18. Separate tables για λειτουργικότητα — ένα table για filtering, ένα για NAT, ένα για rate limiting
  19. Counters σε κρίσιμους κανόνες — για monitoring και troubleshooting
  20. Τακτικός έλεγχος — αναθεώρηση κανόνων κάθε μήνα

Πλήρες Production Ruleset Template

Ακολουθεί ένα πλήρες, production-ready ruleset template που ενσωματώνει όλες τις τεχνικές αυτού του οδηγού. Μπορείτε να το χρησιμοποιήσετε ως αφετηρία και να το προσαρμόσετε στις δικές σας ανάγκες:

#!/usr/sbin/nft -f
# /etc/nftables.conf — Production Hardened Ruleset
# Version: 2.0 — 2026
# Τελευταία ενημέρωση: Φεβρουάριος 2026

flush ruleset

# ===== ΜΕΤΑΒΛΗΤΕΣ =====
define WAN_IF = eth0
define LAN_IF = eth1
define SSH_PORT = 22
define WEB_PORTS = { 80, 443 }
define MGMT_NET = 10.0.100.0/24
define TRUSTED_DNS = { 1.1.1.1, 8.8.8.8 }

# ===== ΚΥΡΙΟ TABLE =====
table inet firewall {

    # --- SETS ---
    set blacklist_v4 {
        type ipv4_addr
        flags dynamic,timeout
        timeout 2h
    }

    set blacklist_v6 {
        type ipv6_addr
        flags dynamic,timeout
        timeout 2h
    }

    set trusted_ssh {
        type ipv4_addr
        flags interval
        elements = { $MGMT_NET }
    }

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

    # --- FLOWTABLE ---
    flowtable ft {
        hook ingress priority 0
        devices = { $WAN_IF, $LAN_IF }
    }

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

        # Fast path
        iif "lo" accept
        ct state established,related accept
        ct state invalid counter drop

        # Blacklist
        ip saddr @blacklist_v4 counter drop
        ip6 saddr @blacklist_v6 counter drop

        # Rate exceeded
        ip saddr @rate_exceeded counter drop

        # Global rate limit — auto-blacklist
        ct state new add @rate_exceeded {
            ip saddr limit rate over 100/second
        } counter drop

        # ICMP
        ip protocol icmp icmp type {
            echo-request, destination-unreachable, time-exceeded
        } limit rate 20/second accept

        ip6 nexthdr icmpv6 icmpv6 type {
            echo-request, echo-reply,
            nd-neighbor-solicit, nd-neighbor-advert,
            nd-router-solicit, nd-router-advert,
            mld-listener-query, mld-listener-report
        } accept

        # SSH — trusted only, rate limited
        ip saddr @trusted_ssh tcp dport $SSH_PORT \
            ct state new limit rate 5/minute counter accept

        # Web services
        tcp dport $WEB_PORTS counter accept

        # Default log + drop
        log prefix "[nft-INPUT-drop] " limit rate 30/minute counter drop
    }

    # --- FORWARD CHAIN ---
    chain forward {
        type filter hook forward priority 0; policy drop;

        # Flowtable acceleration
        ct state established flow add @ft counter accept
        ct state related accept
        ct state invalid drop

        # Forward rules εδώ
        iifname $LAN_IF oifname $WAN_IF accept
        log prefix "[nft-FWD-drop] " limit rate 10/minute counter drop
    }

    # --- OUTPUT CHAIN ---
    chain output {
        type filter hook output priority 0; policy accept;

        # Monitoring εξερχόμενων
        ct state new tcp dport { 25, 587, 465 } \
            log prefix "[nft-SMTP-out] " counter
    }
}

# ===== NAT TABLE =====
table ip nat {
    chain postrouting {
        type nat hook postrouting priority srcnat;
        oifname $WAN_IF masquerade
    }
}

Αντιμετώπιση Προβλημάτων και Debugging

Χρήσιμες Εντολές

Κρατήστε αυτές τις εντολές κάπου εύκαιρα — θα τις χρειαστείτε:

# Προβολή ολόκληρου ruleset
nft list ruleset

# Προβολή με handles (χρήσιμο για διαγραφή κανόνων)
nft -a list ruleset

# Προβολή counters μόνο
nft list counters

# Dry-run — έλεγχος σύνταξης χωρίς εφαρμογή
nft -c -f /etc/nftables.conf

# Monitor αλλαγών σε πραγματικό χρόνο
nft monitor

# Trace ενός πακέτου μέσα στο ruleset
nft add rule inet firewall prerouting \
    ip saddr 192.168.1.100 meta nftrace set 1

# Μετά δείτε τα traces
nft monitor trace

# Διαγραφή κανόνα βάσει handle
nft -a list chain inet firewall input
nft delete rule inet firewall input handle 42

Συχνά Λάθη

Αυτά τα λάθη τα βλέπω ξανά και ξανά, οπότε ας τα αποφύγουμε μαζί:

  • Λάθος #1: Ξεχάσατε το ct state established,related accept — αποτέλεσμα: κλειδωθήκατε έξω (κλασικό)
  • Λάθος #2: Μπλοκάρετε ICMPv6 Neighbor Discovery — αποτέλεσμα: δεν λειτουργεί το IPv6
  • Λάθος #3: Δεν βάζετε rate limit στο logging — αποτέλεσμα: γεμίζουν τα disks σας σε χρόνο ρεκόρ
  • Λάθος #4: Εφαρμόζετε κανόνες ένας-ένας αντί ατομικά — αποτέλεσμα: race conditions κατά το reload
  • Λάθος #5: Ξεχάσατε loopback accept — αποτέλεσμα: σπάνε τα local services (DNS, κ.λπ.)

Συμπεράσματα

Το nftables αποτελεί πλέον τη βασική τεχνολογία φιλτραρίσματος πακέτων στο Linux — και δικαίως. Με τα named sets, verdict maps, concatenations, flowtables και synproxy, προσφέρει ένα πλούσιο και αποδοτικό toolkit για κάθε security requirement.

Τα βασικά σημεία:

  • Default deny πάντα — επιτρέπετε μόνο ό,τι χρειάζεται
  • Ατομικές ενημερώσεις — φόρτωση κανόνων από αρχείο, ποτέ μεμονωμένα
  • Dynamic sets — αυτοματοποιήστε blacklisting και rate limiting
  • Flowtables — μειώστε CPU load σε high-traffic servers
  • Synproxy — απαραίτητο για δημόσιες υπηρεσίες
  • Monitoring — counters, logging και εξαγωγή metrics

Η μετάβαση από iptables δεν χρειάζεται να είναι τρομακτική. Ξεκινήστε με μια απλή μετατροπή, δοκιμάστε σε staging, και σταδιακά αξιοποιήστε τις νέες δυνατότητες. Μέσα σε λίγες εβδομάδες, θα αναρωτιέστε πώς δουλεύατε χωρίς nftables.

Σχετικά με τον Συγγραφέα Editorial Team

Our team of expert writers and editors.