Τείχος προστασίας VPS: ανοίξτε μόνο τη θύρα VPN και μετά αποδείξτε το
Μία θύρα πρέπει να μείνει δημόσια, αλλιώς δεν συνδέεται κανένας πελάτης. Απορρίψτε τις υπόλοιπες, κρατήστε την προώθηση χωριστά από την είσοδο και αφήστε μια διαδρομή ανάκτησης που δοκιμάσατε εκ των προτέρων.
Ένα τείχος προστασίας που επιτρέπει μόνο τη θύρα VPN δεν είναι ένας κανόνας. Είναι τρεις χωριστές αποφάσεις που τυχαίνει να αφορούν τον ίδιο αριθμό θύρας: η αλυσίδα εισόδου καθορίζει τι μπορεί να φτάσει σε μια τοπική διεργασία, η αλυσίδα προώθησης καθορίζει τι μπορεί να περάσει από τον κόμβο για λογαριασμό των πελατών της σήραγγας, και ο πίνακας NAT ξαναγράφει τη διεύθυνση προέλευσης στην έξοδο. Αν κάνετε λάθος σε ένα από αυτά, το αποτέλεσμα σπάνια είναι καθαρή διακοπή. Παίρνετε έναν κόμβο που δέχεται πελάτες αλλά δεν φορτώνει τίποτα, ή έναν κόμβο που μοιάζει κλειστός μέχρι κάποιος να διαβάσει τη σειρά των αλυσίδων.
Η μία θύρα που δεν μπορεί να κλείσει
Ο ακροατής VPN πρέπει να δέχεται συνδέσεις από διευθύνσεις που δεν μπορείτε να προβλέψετε, άρα είναι δημόσια υπηρεσία εξ ορισμού. Αυτή είναι η μοναδική εξαίρεση γύρω από την οποία χτίζεται ο σχεδιασμός: μία θύρα UDP για το OpenVPN, μία θύρα UDP για το WireGuard, μία θύρα TCP για ένα SSL VPN. Όλα τα άλλα ανήκουν πίσω από τη σήραγγα, που σημαίνει ότι οι υπηρεσίες εφαρμογών πρέπει να δεσμεύονται στη διεύθυνση της σήραγγας ή στο loopback και όχι σε κάθε διεπαφή.
Η δέσμευση όμως δεν είναι επιβολή. Μια διεργασία δεσμευμένη στο 0.0.0.0 είναι προσβάσιμη μόνο αν ένας κανόνας το επιτρέπει, και η προεπιλεγμένη πολιτική είναι η εφεδρική για κίνηση που δεν ταίριαξε με κανέναν κανόνα, όχι ο κανόνας που κυβερνά τη θύρα. Μια αποδοχή τοποθετημένη πάνω από την απόρριψή σας παραμένει αποδοχή, και η μετακίνηση μιας υπηρεσίας μακριά από τη δημόσια διεύθυνση είναι ανεξάρτητη βελτίωση και όχι υποκατάστατο της αλυσίδας.
Είσοδος, προώθηση και NAT απαντούν σε διαφορετικά ερωτήματα
Η κίνηση εισόδου προορίζεται για τον ίδιο τον κόμβο, εκεί ζουν λοιπόν ο ακροατής VPN και η διαχειριστική διαδρομή. Η κίνηση προώθησης περνά από τον κόμβο και οι πελάτες της σήραγγας τη χρειάζονται μαζί με το net.ipv4.ip_forward=1. Η κλασική μισοσπασμένη ρύθμιση επιτρέπει την εξερχόμενη ροή και ξεχνά την αντίστροφη κατεύθυνση, οπότε ο πελάτης ολοκληρώνει τη χειραψία του και μετά δεν φορτώνεται τίποτα· ένας κανόνας conntrack για εδραιωμένη και σχετιζόμενη κίνηση καλύπτει αυτή την κατεύθυνση.
Το NAT είναι το τρίτο ερώτημα. Χωρίς ξαναγράψιμο στο postrouting, τα προωθούμενα πακέτα φεύγουν με την ιδιωτική προέλευση της σήραγγας και απορρίπτονται πιο πάνω, γιατί κανένα δίκτυο πέρα από τον κόμβο δεν ξέρει να δρομολογήσει το pool πίσω. Το πρόθεμα προέλευσης σε αυτόν τον κανόνα πρέπει να ταιριάζει με το pool του VPN, όχι με τη δική του διεύθυνση του κόμβου, και το ίδιο ισχύει για τον κανόνα προώθησης που ονομάζει το υποδίκτυο των πελατών.
Το IPv6 είναι δεύτερη πολιτική, όχι ύστερη σκέψη. Ένας κόμβος με αυστηρή αλυσίδα IPv4 και ανοιχτή πολιτική στο ip6tables δεν έχει κλείσει τίποτα· οι υπηρεσίες παραμένουν προσβάσιμες μέσω της άλλης οικογένειας. Είτε αντιγράψτε το σύνολο κανόνων με το ip6tables είτε απενεργοποιήστε σκόπιμα το IPv6 στη δημόσια διεπαφή, και σημειώστε ποιο επιλέξατε.
Μια βάση που διαβάζεται με μία ματιά
Ξεκινήστε με απόρριψη και μετά προσθέστε μόνο ό,τι χρειάζεται ο κόμβος. Πρώτα loopback και απαντήσεις, μετά η διαχειριστική διαδρομή, μετά ο ακροατής της σήραγγας, μετά η πολιτική προώθησης για τους πελάτες:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -m conntrack --ctstate NEW -j ACCEPT
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADEΤα ονόματα διεπαφών, η θύρα και το pool είναι θέσεις κράτησης· διαβάστε τα από τον διακομιστή αντί να τα αντιγράφετε. Η αποθήκευση του αποτελέσματος έχει την ίδια σημασία με τη σύνταξή του, γιατί ένα σύνολο κανόνων που ζει μόνο στη μνήμη εξαφανίζεται στην επόμενη επανεκκίνηση και ανοίγει πάλι τον κόμβο αθόρυβα. Κάντε το μόνιμο με τον μηχανισμό της διανομής και κρατήστε ένα αντίγραφο εκτός της μηχανής για την ημέρα που η μηχανή δεν θα ξεκινήσει.
Κλείσιμο της τελευταίας θύρας χωρίς απώλεια του κόμβου
Υπάρχει μια παγίδα στον σχεδιασμό. Αν το SSH υπάρχει μόνο μέσω της σήραγγας, μια αποτυχημένη υπηρεσία VPN παίρνει το SSH μαζί της, και ο μόνος δρόμος επιστροφής μπορεί να είναι μια κονσόλα που δεν ανοίξατε ποτέ. Πριν κλείσετε την τελευταία δημόσια θύρα, επιβεβαιώστε ότι αυτή η κονσόλα υπάρχει και ότι μπορείτε πραγματικά να τη χρησιμοποιήσετε, ή κρατήστε μία στενή διαχειριστική διαδρομή που δεν εξαρτάται από τη σήραγγα: SSH από σταθερή διεύθυνση, μόνο κλειδιά, έλεγχος ταυτότητας με κωδικό απενεργοποιημένος.
Εφαρμόστε την αλλαγή από μια συνεδρία που έχει ήδη εδραιωθεί, όχι μέσα από τη σύνδεση που πρόκειται να φιλτράρετε. Προγραμματίστε μια επαναφορά ώστε ένα λάθος να λήξει αντί να γίνει μόνιμο, για παράδειγμα μια εργασία systemd-run --on-active=10min που επαναφέρει το προηγούμενο σύνολο κανόνων, και κρατήστε ανοιχτή μια δεύτερη συνεδρία SSH όσο δοκιμάζετε την πρώτη. Έπειτα επαληθεύστε ότι η εργασία επαναφοράς εκτελείται πραγματικά, γιατί μια ανάκτηση που δεν δοκιμάστηκε είναι το ίδιο με καμία ανάκτηση.
Επαληθεύστε τη διαδρομή, όχι το αρχείο εντολών
Διαβάστε τους φορτωμένους κανόνες, όχι το αρχείο που υποτίθεται ότι τους φόρτωσε. Από έναν εξουσιοδοτημένο εξωτερικό κόμβο, επιβεβαιώστε ότι απαντούν μόνο οι προβλεπόμενες θύρες· από μέσα στη σήραγγα, επιβεβαιώστε ότι οι υπηρεσίες που θέλατε να δημοσιεύσετε είναι προσβάσιμες. Μια πολιτική απόρριψης εξ ορισμού που μπλοκάρει και την κίνηση της σήραγγας μοιάζει ίδια με ένα λειτουργικό κλείδωμα μέχρι κάποιος να προσπαθήσει να το χρησιμοποιήσει.
iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr showΚαταγράψτε την επιτρεπόμενη θύρα, το pool πελατών, τη διεπαφή της σήραγγας, τη διαχειριστική προέλευση και τη διαδικασία κονσόλας δίπλα στη διαμόρφωση. Η επόμενη αλλαγή στο pool ή στο όνομα της διεπαφής πρέπει να συμβαδίσει και στο φίλτρο και στον κανόνα NAT, αλλιώς ο κόμβος επιστρέφει σε μισάνοιχτη κατάσταση χωρίς να το προσέξει κανείς.
Μια συνήθεια αξίζει περισσότερο από το σύνολο κανόνων: μετά από κάθε αλλαγή, αποδείξτε τη διαδρομή προώθησης με ένα αίτημα πελάτη και τη διαδρομή ανάκτησης με μια δεύτερη συνεδρία. Ένα κλείδωμα που δεν χρησιμοποιήσατε είναι υπόθεση.