Ενότητα 5 · 5.2
Ένα firewall με ufw και nftables
Ενότητα 5: Προστασία του δικτύου · Χρόνος ανάγνωσης: 12 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να ρυθμίσετε ένα firewall που επιτρέπει μόνο ό,τι χρειάζεται, για IPv4 και IPv6, χωρίς να κλειδώσετε τον εαυτό σας έξω, και γνωρίζετε από τι δεν σας προστατεύει ένα firewall στον server σας.
Βασικές έννοιες: φίλτρο πακέτων, netfilter, nftables, iptables-nft, ufw, προεπιλεγμένη πολιτική, allow, deny, reject, limit, IPv6 στο ufw, firewall του παρόχου, firewalld, Docker και το firewall
Τι κάνει ένα firewall
Ένα firewall στον server σας είναι ένα φίλτρο πακέτων: για κάθε εισερχόμενο πακέτο δικτύου ελέγχει μια λίστα κανόνων και αποφασίζει αν μπορεί να περάσει. Στο Linux αυτό το φίλτρο βρίσκεται στον kernel και ονομάζεται netfilter. Το ρυθμίζετε με ένα πρόγραμμα:
- Το nftables (εντολή
nft) είναι το τρέχον εργαλείο. Το Debian το χρησιμοποιεί από προεπιλογή από το Debian 10. - Το iptables είναι το παλιό εργαλείο. Στα σύγχρονα συστήματα το
iptablesείναι συνήθως μια μετάφραση προς το nftables (iptables-nft), ώστε οι παλιοί οδηγοί να εξακολουθούν να λειτουργούν. - Το ufw (Uncomplicated Firewall) είναι ένα απλό επίπεδο από πάνω, προεγκατεστημένο στο Ubuntu και εγκαθίσταται με μία εντολή στο Debian. Για έναν μεμονωμένο server, το ufw είναι η ευκολότερη επιλογή. Αυτό το μάθημα χρησιμοποιεί το ufw και στη συνέχεια δείχνει πώς φαίνονται οι ίδιοι κανόνες στο nftables.
Ένα firewall είναι το δεύτερο επίπεδο άμυνάς σας. Το πρώτο είναι ότι οι υπηρεσίες ακούν μόνο στη σωστή διεύθυνση (μάθημα 5.1). Μαζί εξασφαλίζουν ότι ένα λάθος στο ένα επίπεδο δεν γίνεται αμέσως μια ανοιχτή πόρτα.
Πρώτα: πώς επιστρέφετε αν κάτι πάει στραβά;
Το κλασικό λάθος: ενεργοποιείτε το firewall, ξεχνάτε να επιτρέψετε το SSH και η σύνδεσή σας διακόπτεται. Τότε δεν μπορείτε πλέον να συνδεθείτε μέσω SSH. Πριν ξεκινήσετε:
- Μάθετε πώς ανοίγετε την κονσόλα του παρόχου σας (μάθημα 1.2). Λειτουργεί εκτός δικτύου, άρα και όταν το firewall κλείνει τα πάντα. Εκεί συνδέεστε και πληκτρολογείτε
ufw disable. - Δημιουργήστε ένα snapshot αν έχετε αμφιβολίες.
- Κρατήστε ανοιχτή την τρέχουσα συνεδρία SSH και δοκιμάστε με μια δεύτερη συνεδρία.
Το ufw σε πέντε βήματα
Βήμα 1: εγκατάσταση και επιλογή της προεπιλογής.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'Η προεπιλεγμένη πολιτική ισχύει για ό,τι δεν καλύπτεται από κάποιον κανόνα. Το "deny incoming" σημαίνει: ό,τι εισέρχεται απαγορεύεται, εκτός από όσα επιτρέψετε στη συνέχεια. Αυτή είναι η μόνη ασφαλής βάση. Την εξερχόμενη κίνηση (όταν ο server σας κατεβάζει ενημερώσεις) την επιτρέπετε.
Βήμα 2: επιτρέψτε το SSH, πριν ενεργοποιήσετε το firewall.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)Το OpenSSH είναι ένα προφίλ εφαρμογής που γνωρίζει το ufw (αντιστοιχεί στη θύρα 22/tcp). Αν το SSH εκτελείται σε άλλη θύρα, χρησιμοποιήστε τον αριθμό: sudo ufw allow 2222/tcp. Προσέξτε το "Rules updated (v6)": το ufw δημιουργεί τον κανόνα και για IPv6. Το κάνει επειδή στο /etc/default/ufw υπάρχει η γραμμή IPV6=yes, που είναι η προεπιλογή. Ελέγξτε το· αν είναι no, τότε το firewall σας ισχύει μόνο για IPv4.
Βήμα 3: ό,τι άλλο χρειάζεστε.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # μόνο αν χρησιμοποιείτε HTTP/3Μπορείτε να περιορίσετε έναν κανόνα σε μία διεύθυνση προέλευσης, για παράδειγμα μια θύρα διαχείρισης που επιτρέπεται μόνο από το γραφείο σας:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpΒήμα 4: ενεργοποίηση.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupΒήμα 5: έλεγχος. Ανοίξτε ένα δεύτερο παράθυρο και συνδεθείτε ξανά. Αν πετύχει, το SSH είναι σωστά ρυθμισμένο. Στη συνέχεια δείτε τους κανόνες:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Η αφαίρεση ενός κανόνα γίνεται με αριθμούς: sudo ufw status numbered και μετά sudo ufw delete 3.
deny, reject και limit
- Το deny απορρίπτει σιωπηλά το πακέτο: από έξω βλέπετε "φιλτραρισμένη" (μάθημα 5.1).
- Το reject στέλνει πίσω μια άρνηση: από έξω βλέπετε "κλειστή". Πιο κομψό για τις δικές σας υπηρεσίες, αλλά αποκαλύπτει ότι υπάρχει server.
- Το limit επιτρέπει μια σύνδεση, αλλά μπλοκάρει μια διεύθυνση που προσπαθεί να συνδεθεί έξι ή περισσότερες φορές μέσα σε 30 δευτερόλεπτα. Χρήσιμο για το SSH:
sudo ufw limit OpenSSHαντί γιαallow. Είναι χονδροειδές (μετρά συνδέσεις, όχι αποτυχημένες συνδέσεις χρήστη)· το fail2ban (μάθημα 5.3) είναι πιο ακριβές.
Οι ίδιοι κανόνες στο nftables
Το ufw γράφει στο παρασκήνιο κανόνες netfilter. Αν θέλετε να εργαστείτε χωρίς ufw, γράφετε μόνοι σας ένα αρχείο nftables. Στο Debian βρίσκεται στο /etc/nftables.conf και το φορτώνετε με την υπηρεσία nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Διαβάστε το ως εξής. Ο πίνακας ονομάζεται filter και ανήκει στην οικογένεια inet: ένας πίνακας για IPv4 και IPv6 ταυτόχρονα, ώστε να μην μπορείτε να ξεχάσετε το IPv6. Στην αλυσίδα input η πολιτική είναι drop. Στη συνέχεια: οι απαντήσεις σε συνδέσεις που ήδη υπάρχουν επιτρέπεται να επιστρέψουν (established,related), ό,τι περνά από το loopback επιτρέπεται, το ICMP επιτρέπεται (απαραίτητο μεταξύ άλλων για το IPv6 και για μηνύματα σφάλματος σχετικά με το μέγεθος πακέτων), και οι θύρες 22, 80 και 443 επιτρέπονται.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # έλεγχος χωρίς φόρτωση
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetΧρησιμοποιήστε είτε το ufw είτε ένα δικό σας αρχείο nftables, όχι και τα δύο: γράφουν στο ίδιο netfilter και μπορεί να συγκρούονται οι κανόνες τους.
Από τι δεν σας προστατεύει το firewall
- Υπηρεσίες που επιτρέπετε εσείς. Η θύρα 443 είναι ανοιχτή για τον ιστότοπό σας· ένα κενό ασφαλείας στον ιστότοπό σας είναι επομένως απολύτως προσβάσιμο. Το firewall προστατεύει μόνο τις θύρες που είναι κλειστές.
- Docker. Όταν δημοσιεύετε μια θύρα με το Docker (
-p 5432:5432), το Docker ορίζει δικούς του κανόνες netfilter, που ανακατευθύνουν την κίνηση πριν ισχύσουν οι κανόνες του ufw. Η τεκμηρίωση του Docker αναφέρει ρητά ότι το Docker και το ufw δεν συνεργάζονται καλά. Μια θύρα container μπορεί λοιπόν να είναι ανοιχτή από έξω ενώ τοufw statusδεν την εμφανίζει. Τη λύση (δημοσίευση στο127.0.0.1) τη μαθαίνετε στο μάθημα 9.3. - Εξερχόμενη κίνηση. Με το "allow outgoing", ένα παραβιασμένο πρόγραμμα μπορεί να επικοινωνήσει με οπουδήποτε. Για τους περισσότερους μικρούς servers αυτή είναι μια αποδεκτή επιλογή· τα αυστηρά περιβάλλοντα περιορίζουν και την εξερχόμενη κίνηση.
Το firewall του παρόχου σας
Πολλοί πάροχοι διαθέτουν επίσης ένα firewall στο δίκτυο, μπροστά από τον server σας, το οποίο ρυθμίζετε στον πίνακα ελέγχου πελάτη (μερικές φορές ονομάζεται "cloud firewall" ή "security group"). Αποτελεί ένα εξαιρετικό επιπλέον επίπεδο και λειτουργεί ακόμη κι αν κάνετε κάποιο λάθος στον ίδιο τον server. Δεν αντικαθιστά όμως το firewall στον server: αν μεταφέρετε τον server ή αλλάξετε πάροχο, δεν σας ακολουθεί, και δεν το προσφέρουν όλοι οι πάροχοι. Γι' αυτό διατηρείτε πάντα ένα firewall στον ίδιο τον server.
Στο AlmaLinux και στο Rocky Linux
Εκεί το firewalld είναι ενεργό από προεπιλογή, με ζώνες. Οι σημαντικότερες εντολές:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadΧωρίς --permanent μια αλλαγή ισχύει μόνο μέχρι την επόμενη επανεκκίνηση· με --permanent ισχύει μόνο μετά το --reload. Το SSH είναι ήδη ανοιχτό στην προεπιλεγμένη ζώνη.
Στην πράξη
Αν παρ' όλα αυτά κλειδωθείτε έξω από ένα VPS στη WebOké, ανοίγετε την κονσόλα στην οθόνη του VPS, συνδέεστε και απενεργοποιείτε το firewall (ufw disable) ή αναιρείτε τον τελευταίο κανόνα. Σε άλλους παρόχους αυτή η είσοδος έκτακτης ανάγκης ονομάζεται επίσης console, VNC ή rescue. Μάθετε πού βρίσκεται αυτό το κουμπί πριν το χρειαστείτε.
Σύνοψη
- Ένα firewall είναι το δεύτερο επίπεδό σας μετά το "ακρόαση μόνο όπου χρειάζεται"· το nftables είναι το εργαλείο στον kernel, το ufw ένα απλό επίπεδο από πάνω.
- Ξεκινήστε με
default deny incoming, επιτρέψτε το SSH πριν από τοufw enable, δοκιμάστε με δεύτερη συνεδρία και γνωρίζετε την κονσόλα του παρόχου σας. - Ελέγξτε ότι το ufw καλύπτει και το IPv6 (
IPV6=yes)· στο nftables η οικογένειαinetτο κάνει με μία κίνηση. - Το
denyδίνει από έξω "φιλτραρισμένη", τοrejectδίνει "κλειστή"· τοlimitεπιβραδύνει τις επαναλαμβανόμενες συνδέσεις. - Οι θύρες του Docker παρακάμπτουν το ufw (μάθημα 9.3)· το firewall του παρόχου σας είναι επιπλέον επίπεδο, όχι υποκατάστατο.
Κουίζ
Άσκηση
Άσκηση O5.2: Ρύθμιση του firewall σας. Ενεργοποιήστε στον server σας ένα firewall με ufw (ή nftables, ή firewalld στο AlmaLinux/Rocky): από προεπιλογή όλα κλειστά για την εισερχόμενη κίνηση, SSH, και ό,τι άλλο πραγματικά χρειάζεστε. Δοκιμάστε με μια δεύτερη συνεδρία, ελέγξτε αν καλύπτεται το IPv6 και δείτε από έξω με nc αν μια μη επιτρεπόμενη θύρα είναι κλειστή ή φιλτραρισμένη. Συμπληρώστε τη λίστα ελέγχου και επικολλήστε το ufw status verbose σας (ή το nft list ruleset)· αναφέρετε για κάθε ανοιχτή θύρα τι εξυπηρετεί.
Άσκηση O5.2: Ρύθμιση του firewall σας
Αυτή την άσκηση την κάνετε μόνοι σας: κανείς δεν την ελέγχει. Σημειώστε τι έχετε κάνει και επισημάνετε την άσκηση ως ολοκληρωμένη.
Για έναν web server μόνο οι θύρες 22 (ή η θύρα SSH σας), 80 και 443, για IPv4 και IPv6. Θύρες διαχείρισης μόνο από σταθερή διεύθυνση ή μέσω SSH tunnel. Μέσω της κονσόλας: ufw disable (ή άδειασμα των κανόνων nftables).
Τα τικ και οι σημειώσεις σας παραμένουν μόνο σε αυτό το πρόγραμμα περιήγησης· δεν τα στέλνουμε πουθενά. Αν έχετε εγγραφεί, αποθηκεύουμε στο Τα μαθήματά μου μόνο ότι έχετε ολοκληρώσει την άσκηση.
Για περαιτέρω μελέτη
- Ασφάλεια του VPS σας: τα πρώτα πέντε λεπτά
- Δεν έχετε πια πρόσβαση στο VPS σας: τι κάνετε;
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Τεκμηρίωση Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Τεκμηρίωση Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
