Το UFW επινοήθηκε ώστε ένα τείχος προστασίας να ρυθμίζεται με τρεις εντολές, και σε αυτό τα καταφέρνει. Το πρόβλημα βρίσκεται αλλού: το ufw status δείχνει προθέσεις, όχι αποτελέσματα. Ένας κανόνας μπορεί να είναι στη λίστα και να μην κλείνει απολύτως τίποτα — για τρεις διαφορετικούς λόγους, που όλοι εμφανίζονται τακτικά σε πραγματικούς διακομιστές.
Μια αρχή που δεν σας κλειδώνει απέξω
Η σειρά των εντολών έχει σημασία. Πρώτα επιτρέψτε το SSH, μετά ενεργοποιήστε:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
Το ufw enable πριν επιτραπεί το SSH κόβει τη δική σας συνεδρία, και από εκεί και πέρα μένει μόνο η κονσόλα του παρόχου. Αν ο διακομιστής είναι ήδη ρυθμισμένος και δεν είστε σίγουροι, κρατήστε δεύτερη σύνδεση ανοιχτή — επιβιώνει από μια αποτυχημένη αλλαγή.
Δείτε την αναλυτική κατάσταση· η σύντομη κρύβει την προεπιλεγμένη πολιτική:
sudo ufw status verbose
Λάθος πρώτο: ο κανόνας υπάρχει και η θύρα είναι ανοιχτή στον κόσμο
Η συνηθέστερη γραμμή σε ξένες ρυθμίσεις:
sudo ufw allow 3306
Έτσι ανοίγει η MySQL «για να συνδέομαι από το σπίτι» — και ανοίγει σε ολόκληρο το διαδίκτυο. Υπάρχουν δύο σωστές παραλλαγές και οι δύο είναι καλύτερες:
sudo ufw allow from 203.0.113.25 to any port 3306
ή, ακόμη πιο αξιόπιστα, μην αφήσετε καθόλου την υπηρεσία να βγει προς τα έξω: bind-address = 127.0.0.1 στη ρύθμιση της MySQL, με εξωτερική πρόσβαση μέσω σήραγγας SSH. Το τείχος προστασίας είναι η δεύτερη γραμμή· η πρώτη είναι ότι η υπηρεσία δεν ακούει σε δημόσια διεύθυνση. Ένας κανόνας στο UFW μπορεί να διαγραφεί κατά λάθος, ενώ το bind-address δεν αλλάζει από μόνο του.
Λάθος δεύτερο: IPv6
Ένας κανόνας όπως ufw allow from 203.0.113.25 ισχύει μόνο για IPv4. Αν ο διακομιστής έχει διεύθυνση IPv6 — και τα περισσότερα VPS έχουν, ενεργοποιημένη — η υπηρεσία παραμένει προσβάσιμη μέσω αυτής. Ο πάροχος έδωσε διεύθυνση, εσείς δεν τη θυμάστε, ο σαρωτής τη θυμάται.
Ελέγξτε ότι το φιλτράρισμα v6 είναι καν ενεργό (IPV6=yes στο /etc/default/ufw) και ότι η υπηρεσία δεν ακούει στο :: χωρίς ανάγκη:
ss -tulpn | grep ':::'
Οι κανόνες που ονομάζουν ρητά διεύθυνση πρέπει να γράφονται χωριστά για κάθε έκδοση του πρωτοκόλλου.
Λάθος τρίτο: Docker
Το πιο εξοργιστικό. Το Docker δημοσιεύει θύρες προσθέτοντας τους δικούς του κανόνες στις αλυσίδες iptables πριν από εκείνους που γράφει το UFW. Ως αποτέλεσμα, ένα container που ξεκίνησε με -p 5432:5432 είναι προσβάσιμο από το διαδίκτυο παρότι το UFW αναφέρει Status: active και πολιτική deny incoming. Το τείχος προστασίας δεν είναι χαλασμένο — απλώς δεν έρχεται ποτέ η σειρά του.
Η θεραπεία δεν είναι στο UFW αλλά στον τρόπο δημοσίευσης της θύρας:
ports:
- "127.0.0.1:5432:5432"
Η σύνδεση στην τοπική διεύθυνση είναι η απλούστερη και πιο αξιόπιστη λύση. Προς τα έξω πρέπει να βλέπει μόνο ό,τι εξυπηρετεί πραγματικά επισκέπτες: συνήθως οι θύρες 80 και 443 ενός αντίστροφου διαμεσολαβητή.
Σειρά κανόνων
Το UFW εφαρμόζει τον πρώτο κανόνα που ταιριάζει και σταματά εκεί. Έτσι μια απαγόρευση που προστέθηκε μετά από μια άδεια δεν θα δουλέψει: δεν φτάνει ποτέ η σειρά της. Δείτε την αρίθμηση και εισαγάγετε όπου χρειάζεται:
sudo ufw status numbered
sudo ufw insert 1 deny from 198.51.100.0/24
sudo ufw delete 7
Οι κανόνες διαγράφονται με αριθμό, αλλά οι αριθμοί μετατοπίζονται μετά από κάθε διαγραφή — διαγράφετε έναν κάθε φορά και ξαναδιαβάζετε τη λίστα.
Έλεγχος από έξω
Οι τοπικές εντολές δείχνουν τι είναι ρυθμισμένο. Τι προέκυψε πραγματικά φαίνεται μόνο από άλλο μηχάνημα:
nmap -Pn -p- 203.0.113.25
nc -zv 203.0.113.25 3306
Κάνει οποιοσδήποτε άλλος διακομιστής ή ο υπολογιστής του σπιτιού σας. Αυτός είναι ο μόνος έλεγχος που δεν λέει ψέματα και αξίζει να τον τρέχετε μετά από κάθε αισθητή αναδιαμόρφωση — ειδικά αφού εγκαταστήσετε κάτι που «ρυθμίζει μόνο του το δίκτυο»: Docker, πίνακες ελέγχου, VPN.
Αρχεία καταγραφής
Από προεπιλογή το UFW δεν γράφει σχεδόν τίποτα. Ενεργοποιήστε το με:
sudo ufw logging low
Οι εγγραφές πάνε στο /var/log/ufw.log — αλλά μόνο αν υπάρχει rsyslog στο σύστημα. Στο Debian 12 και στο Ubuntu 24.04 μπορεί να μην υπάρχει, οπότε όλα πάνε στο ημερολόγιο του systemd:
sudo journalctl -k | grep -i '\[UFW'
Ένα άδειο /var/log/ufw.log δεν σημαίνει από μόνο του τίποτα — κοιτάξτε πρώτα στο ημερολόγιο.
Τι να περιμένετε από ένα τείχος προστασίας
Το UFW κλείνει ό,τι δεν πρέπει να είναι προσβάσιμο. Δεν εξετάζει το περιεχόμενο των αιτημάτων προς ό,τι είναι ανοιχτό: η θύρα 443 είναι ανοιχτή για όλους, και ό,τι φτάνει στον ιστότοπο φτάνει ανεμπόδιστα. Αυτή είναι δουλειά άλλων εργαλείων — ενός WAF στο επίπεδο εφαρμογής, ενός IDS στο επίπεδο της κίνησης. Η δουλειά του τείχους προστασίας είναι πιο ταπεινή και πιο σημαντική: η λίστα των ανοιχτών θυρών να ταιριάζει με ό,τι πιστεύετε γι' αυτήν. Πώς μοιάζει αυτή η λίστα μαζί με τους ενεργούς κανόνες σε μία σελίδα το δείχνει η επίδειξη παρακάτω.