Τρέχουσα κατάσταση: PHP2Shell. Δύο κρίσιμες ευπάθειες της PHP (CVSS 9.2) επιτρέπουν κακόβουλο κώδικα χωρίς σύνδεση. Patches από τις 21/10/2026.Τι πρέπει να γίνει τώρα →

Firewall για διακομιστές ιστού: άνοιγμα μόνο των απαραίτητων θυρών

Ένας διακομιστής ιστού χρειάζεται προς τα έξω συνήθως μόνο δύο θύρες. Παρ' όλα αυτά σε πολλούς διακομιστές ακούν στο διαδίκτυο βάσεις δεδομένων, PHP-FPM ή περιβάλλοντα διαχείρισης. Δείτε πώς εντοπίζετε ανοιχτές υπηρεσίες και κλείνετε ό,τι δεν χρειάζεται.

Ημερομηνία 6 λεπτά ανάγνωσηςΣκλήρυνση και διαμόρφωση

Εν ολίγοις: Ένα firewall για διακομιστές ιστού επιτρέπει εισερχόμενα μόνο TCP 80 και 443, με HTTP/3 επιπλέον UDP 443, και SSH μόνο από γνωστά δίκτυα. Όλα τα άλλα απορρίπτονται: βάσεις δεδομένων, caches, PHP-FPM και περιβάλλοντα διαχείρισης δεν ανήκουν στο διαδίκτυο. Ελέγξτε πρώτα με ss -tulpn τι ακούει, δημιουργήστε στη συνέχεια ένα σύνολο κανόνων με προεπιλογή «απόρριψη» και δοκιμάστε το αποτέλεσμα απ' έξω. Ο περιορισμός των εξερχόμενων συνδέσεων περιορίζει επιπλέον τις συνέπειες μιας εισβολής.

Οι ξεχασμένες πόρτες δίπλα στην εξώπορτα

Στο PHP2Shell το βλέμμα στράφηκε στον ίδιο τον διακομιστή ιστού, στις θύρες 80 και 443. Αυτές πρέπει να είναι ανοιχτές, αλλιώς δεν υπάρχει ιστότοπος. Στις καταγραφές της υπάρχουσας κατάστασης μετά από τέτοιες ευπάθειες προκαλεί συχνά εντύπωση κάτι άλλο: δίπλα στην εξώπορτα στέκονται ανοιχτές και άλλες πόρτες. Μια βάση δεδομένων ακούει σε όλες τις διεπαφές δικτύου, ένα pool PHP-FPM στη θύρα 9000, μια υπηρεσία cache χωρίς κωδικό, ένα περιβάλλον διαχείρισης από τη φάση εγκατάστασης.

Καθεμία από αυτές τις πόρτες είναι δική της επιφάνεια επίθεσης με δικές της ευπάθειες. Ένα firewall που επιτρέπει μόνο τα απαραίτητα τις κλείνει με λίγους κανόνες. Αυτό είναι ένα από τα αποτελεσματικότερα μέτρα για την ασφάλιση ενός δικού σας διακομιστή, όπως περιγράφει και η σελίδα Ασφάλιση root server και vServer μόνοι σας.

Τι ανήκει ανοιχτό και τι όχι

Αρχή είναι μια λίστα επιτρεπόμενων: όλα είναι κλειστά και προσβάσιμες είναι μόνο υπηρεσίες που ελευθερώθηκαν συνειδητά. Η παρακάτω επισκόπηση βοηθά στην κατάταξη.

Υπηρεσία Τυπική θύρα Προσβάσιμη απ' έξω;
HTTP και HTTPS TCP 80, TCP 443 ναι
HTTP/3 (QUIC) UDP 443 μόνο αν χρησιμοποιείται
SSH TCP 22 μόνο από γνωστά δίκτυα ή μέσω VPN
Πίνακας ελέγχου φιλοξενίας ανάλογα με το προϊόν μόνο από γνωστά δίκτυα
MySQL/MariaDB, PostgreSQL TCP 3306, TCP 5432 όχι
Redis, Memcached TCP 6379, TCP 11211 όχι
PHP-FPM TCP 9000 ή socket Unix όχι, καλύτερα μόνο socket
Διακομιστής αλληλογραφίας TCP 25, 465, 587, 993 μόνο αν ο διακομιστής λαμβάνει ή παρέχει email

Μια υπηρεσία που δεν χρειάζεται να είναι προσβάσιμη απ' έξω πρέπει επιπλέον να ακούει μόνο στο 127.0.0.1 ή σε socket Unix. Τότε παραμένει απρόσιτη ακόμη και σε βλάβη του firewall. Για προσβάσεις διαχείρισης ταιριάζουν ελευθερώσεις IP ή VPN· λεπτομέρειες στο άρθρο Απομόνωση περιοχών διαχείρισης με IP, VPN ή πρόσθετη προστασία.

Βήμα 1: διαπιστώστε τι ακούει

Προτού γράψετε κανόνες, αποκτήστε μια εικόνα. Οι παρακάτω εντολές μόνο διαβάζουν:

# Όλες οι θύρες TCP και UDP που ακούν, με διεργασία
sudo ss -tulpn
# Τρέχον σύνολο κανόνων του nftables
sudo nft list ruleset
# Κατάσταση του ufw, αν χρησιμοποιείται
sudo ufw status verbose

Προσέξτε στην έξοδο του ss τη διεύθυνση πριν από τη θύρα. Το 0.0.0.0 ή το [::] σημαίνει: η υπηρεσία ακούει σε όλες τις διεπαφές. Το 127.0.0.1 σημαίνει: μόνο τοπικά. Σημειώστε για κάθε υπηρεσία αν πρέπει να είναι προσβάσιμη απ' έξω. Αυτή η λίστα αποτελεί ταυτόχρονα μέρος του αρχείου καταγραφής του διακομιστή σας.

Firewall για διακομιστή ιστού με nftables

Το nftables είναι το τρέχον φίλτρο πακέτων στο Linux. Το παρακάτω σύνολο κανόνων βασίζεται στο παράδειγμα του επίσημου wiki του nftables και προσθέτει μια ελευθέρωση για SSH μόνο από ένα δίκτυο διαχείρισης. Οι διευθύνσεις είναι παραδείγματα τεκμηρίωσης και πρέπει να αντικατασταθούν.

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

table inet filter {
    set verwaltung_v4 {
        type ipv4_addr
        flags interval
        elements = { 203.0.113.0/28 }
    }

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

        ct state vmap { established : accept, related : accept, invalid : drop }
        iifname lo accept

        # Το IPv6 χρειάζεται ανίχνευση γειτόνων
        icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
        icmp type echo-request limit rate 5/second accept
        icmpv6 type echo-request limit rate 5/second accept

        # Ιστότοπος
        tcp dport { 80, 443 } accept
        # μόνο με HTTP/3:
        # udp dport 443 accept

        # SSH μόνο από το δίκτυο διαχείρισης
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

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

Ελέγξτε το σύνολο κανόνων πριν από τη φόρτωση με nft -c -f /etc/nftables.conf. Η πρώτη γραμμή flush ruleset διαγράφει όλους τους υπάρχοντες κανόνες, ακόμη και εκείνους που έχουν καταχωρίσει το Docker ή το Fail2ban. Σε διακομιστές με Docker ή άλλες υπηρεσίες που ορίζουν δικούς τους κανόνες, προσαρμόστε γι' αυτό το σύνολο κανόνων αντί να το αντικαταστήσετε γενικά. Πώς συνεργάζεται το Fail2ban με το firewall, αναφέρεται στο Ρύθμιση του Fail2ban για διακομιστές ιστού.

Όποιος προτιμά κάτι απλούστερο, χρησιμοποιεί σε Ubuntu το ufw. Σημασία έχει η σειρά: πρώτα η ελευθέρωση του SSH, μετά η ενεργοποίηση.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow proto tcp from 203.0.113.0/28 to any port 22
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Σημαντικό

Αλλάζετε κανόνες firewall σε απομακρυσμένους διακομιστές μόνο με δεύτερο τρόπο πρόσβασης, για παράδειγμα την κονσόλα του παρόχου σας. Ένας λανθασμένος κανόνας SSH αλλιώς θα αποκλείσει εσάς τους ίδιους.

Εξερχόμενες συνδέσεις: το υποτιμημένο μισό

Τα περισσότερα firewalls επιτρέπουν εξερχόμενα τα πάντα. Για έναν διακομιστή ιστού αυτό είναι γενναιόδωρο. Μετά από μια εισβολή οι επιτιθέμενοι χρησιμοποιούν εξερχόμενες συνδέσεις για να κατεβάσουν εργαλεία, να αποσπάσουν δεδομένα ή να λάβουν εντολές. Διεργασίες διακομιστή ιστού ή PHP που δημιουργούν απροσδόκητες συνδέσεις θεωρούνται γι' αυτό προειδοποιητικό σημάδι.

Ο περιορισμός των εξερχόμενων συνδέσεων είναι πιο επίπονος, επειδή πρέπει να είναι γνωστή κάθε θεμιτή σύνδεση: πηγές πακέτων για ενημερώσεις, υπηρεσίες πληρωμών, διεπαφές, αποστολή email, διακομιστές ώρας. Ένας πραγματιστικός δρόμος είναι να καταγράφονται πρώτα οι εξερχόμενες συνδέσεις, να σχηματίζεται μετά μια λίστα επιτρεπόμενων και μόνο έπειτα να γίνεται ο αποκλεισμός. Πώς ελέγχετε τις υπάρχουσες συνδέσεις, περιγράφει το Έλεγχος των εξερχόμενων συνδέσεων ενός διακομιστή· ποια ίχνη υποδεικνύουν διαφορετικά μια εισβολή, αναφέρεται στο Έχω ήδη παραβιαστεί;.

Στο τέλος δοκιμάστε απ' έξω, από άλλον υπολογιστή και μόνο έναντι των δικών σας συστημάτων, ποιες θύρες είναι πράγματι προσβάσιμες. Μόνο αυτή η δοκιμή δείχνει αν το Docker, το firewall του παρόχου και οι κανόνες του διακομιστή δίνουν μαζί την επιθυμητή εικόνα.

Συμπέρασμα: λίγοι κανόνες, μεγάλο αποτέλεσμα

Ένα firewall διακομιστή ιστού δεν χρειάζεται να είναι περίπλοκο. Θύρες ιστού ανοιχτές, διαχείριση μόνο από γνωστά δίκτυα, όλα τα άλλα απορρίπτονται: με αυτούς τους βασικούς κανόνες εξαφανίζονται από το διαδίκτυο βάσεις δεδομένων, caches και ξεχασμένες υπηρεσίες. Είναι ένα από τα μέτρα με την καλύτερη σχέση προσπάθειας προς όφελος.

Κατά ευπαθειών στον διακομιστή ιστού ή στην ίδια την PHP το firewall δεν βοηθά, επειδή ακριβώς αυτές οι θύρες πρέπει να παραμείνουν ανοιχτές. Η δύναμή του έγκειται στο να κρατά μικρή την υπόλοιπη επιφάνεια επίθεσης και, με έναν περιορισμό των εξερχόμενων συνδέσεων, να περιορίζει τις συνέπειες μιας εισβολής.

Αποφασιστική είναι η συντήρηση. Κάθε νέα υπηρεσία, κάθε container και κάθε αλλαγή στον πάροχο μπορεί να μετατοπίσει την εικόνα. Επαναλαμβάνετε γι' αυτό τον έλεγχο απ' έξω μετά από κάθε μεγαλύτερη αλλαγή και ανά σταθερά διαστήματα, για παράδειγμα μία φορά ανά τρίμηνο.

Πώς βοηθά συγκεκριμένα η PHP SOS;

  • Καταγραφή της υπάρχουσας κατάστασης: Καταγράφουμε όλες τις υπηρεσίες που ακούν και ελέγχουμε απ' έξω τι είναι πράγματι προσβάσιμο.
  • Δημιουργία συνόλου κανόνων: Συντάσσουμε μια λίστα επιτρεπόμενων για εισερχόμενες και, όπου έχει νόημα, εξερχόμενες συνδέσεις, συντονισμένη με Docker, Fail2ban και firewall παρόχου.
  • Ασφαλής μετάβαση: Υλοποιούμε τις αλλαγές με δεύτερο τρόπο πρόσβασης και σχέδιο επαναφοράς.
  • Τεκμηρίωση: Θύρες, ελευθερώσεις και λόγους τους καταγράφουμε στο πλαίσιο της σκλήρυνσης διακομιστή.

Συχνές ερωτήσεις

Ποιες θύρες χρειάζεται ένας διακομιστής ιστού;

Για τους επισκέπτες κατά κανόνα μόνο TCP 80 και 443, με HTTP/3 επιπλέον UDP 443. Το SSH και τα περιβάλλοντα διαχείρισης πρέπει να είναι προσβάσιμα μόνο από γνωστά δίκτυα ή μέσω VPN. Οι θύρες βάσεων δεδομένων, cache και PHP-FPM δεν ανήκουν στο διαδίκτυο.

Προστατεύει ένα firewall από το PHP2Shell;

Όχι. Το PHP2Shell εκμεταλλεύεται μέσω του διακομιστή ιστού, δηλαδή μέσω ακριβώς των θυρών που πρέπει να είναι ανοιχτές. Το firewall μικραίνει όμως την υπόλοιπη επιφάνεια επίθεσης και ένας περιορισμός των εξερχόμενων συνδέσεων μπορεί να περιορίσει τις συνέπειες μιας εισβολής.

Γιατί το ufw δείχνει ως κλειστές θύρες που παρ' όλα αυτά είναι προσβάσιμες;

Μια γνωστή περίπτωση είναι τα containers Docker: το Docker καταχωρίζει τις δημοσιευμένες θύρες απευθείας στους κανόνες φιλτραρίσματος πακέτων, παρακάμπτοντας το ufw. Ελέγχετε γι' αυτό τις ανοιχτές θύρες πάντα επιπλέον απ' έξω.

Αρκεί το firewall του παρόχου φιλοξενίας μου;

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

Πηγές

Άμεση επικοινωνία

Κάθε ώρα μετράει. Γράψτε μας τώρα.

Περιγράψτε σύντομα το σύστημα, την έκδοση PHP και ό,τι παρατηρείτε. Θα επικοινωνήσουμε μαζί σας, θα διευκρινίσουμε την κατάσταση και θα εργαστούμε εξ αποστάσεως μέχρι το περιστατικό να κλείσει και να τεκμηριωθεί.

Άμεση βοήθεια