Εισαγωγή: Γιατί το 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χρησιμοποιούν flagsdynamic,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
Βήματα Μετάβασης
Η μετάβαση δεν χρειάζεται να σας τρομάζει. Ακολουθήστε αυτά τα βήματα:
- Backup: Αποθηκεύστε τα τρέχοντα iptables rules:
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules - Μετατροπή: Χρησιμοποιήστε
iptables-restore-translateγια αυτόματη μετατροπή - Έλεγχος: Εξετάστε τους μεταφρασμένους κανόνες — πολλοί θα χρειαστούν βελτιστοποίηση
- Δοκιμή: Εφαρμόστε σε staging ή χρησιμοποιήστε
nft -c -f rules.nftγια dry-run - Παράλληλη λειτουργία: Χρησιμοποιήστε το iptables-nft compatibility layer κατά τη μεταβατική περίοδο
- Πλήρης μετάβαση: Αφαιρέστε τα 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 σας:
- Default deny policy σε input και forward chains
- Accept output αλλά monitor — log νέες εξερχόμενες συνδέσεις σε κρίσιμες θύρες
- Connection tracking πρώτα —
ct state established,related acceptπάντα στην κορυφή - Drop invalid packets —
ct state invalid dropπριν από κάθε άλλο κανόνα - Rate limit SSH — μέγιστο 3-5 νέες συνδέσεις ανά λεπτό ανά IP
- Περιορισμός SSH σε trusted networks — μόνο από γνωστά IP ή VPN
- ICMPv6 — μην μπλοκάρετε ND — Neighbor Discovery είναι απαραίτητο
- Synproxy για δημόσιες υπηρεσίες — ειδικά HTTP/HTTPS
- Flowtables για forwarding — μειώνουν CPU load σε routing/NAT servers
- Αυτόματο blacklisting — dynamic sets με timeout για repeat offenders
- Geo-blocking — αν εξυπηρετείτε συγκεκριμένες περιοχές
- Named sets αντί hardcoded τιμών — ευκολότερη διαχείριση
- Logging με rate limit — μην κατακλύζετε τα logs
- Atomic ruleset loading — πάντα φόρτωση από αρχείο, όχι μεμονωμένα commands
- Backup πριν κάθε αλλαγή —
nft list ruleset > backup.nft - Dry-run testing —
nft -c -f rules.nftπριν εφαρμόσετε - Version control — κρατήστε τα nftables configs σε git
- Separate tables για λειτουργικότητα — ένα table για filtering, ένα για NAT, ένα για rate limiting
- Counters σε κρίσιμους κανόνες — για monitoring και troubleshooting
- Τακτικός έλεγχος — αναθεώρηση κανόνων κάθε μήνα
Πλήρες 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.