iptables: αφήστε τους πελάτες VPN να φτάνουν μόνο έναν κεντρικό υπολογιστή
Ο κανόνας που θέλετε βρίσκεται στο FORWARD, όχι στο INPUT. Επιτρέψτε έναν προορισμό για τη δεξαμενή VPN, απορρίψτε τα υπόλοιπα και μετά αποδείξτε το με μετρητές και εντολή επαναφοράς.
Δύο δελτία υποστήριξης που μοιάζουν άσχετα τελικά μοιράζονται μία αιτία. Στο πρώτο, ένας διαχειριστής θέλει ο διακομιστής να δέχεται συνδέσεις μόνο από το τούνελ· στο δεύτερο, οι χρήστες VPN πρέπει να φτάνουν σε έναν μόνο εσωτερικό κεντρικό υπολογιστή και τίποτα άλλο. Και οι δύο πολιτικές ανήκουν στο FORWARD, και συνήθως δοκιμάζονται στο INPUT. Το αποτέλεσμα μοιάζει με τείχος προστασίας και συμπεριφέρεται σαν θέση κράτησης.
Ποια αλυσίδα απαντά στην ερώτησή σας
Τα πακέτα που στέλνει ένας πελάτης VPN σε κεντρικό υπολογιστή του LAN ή προς το διαδίκτυο προωθούνται από τον πυρήνα και αξιολογούνται στο FORWARD. Τα INPUT και OUTPUT βλέπουν μόνο κίνηση που τερματίζει στον διακομιστή ή ξεκινά από αυτόν. Επομένως μια απόρριψη για οτιδήποτε δεν φτάνει στο tun0 προστατεύει τους δικούς του ακροατές του διακομιστή και θα τερματίσει επίσης τη συνεδρία SSH σας, εκτός αν επιτραπούν πρώτα οι εδραιωμένες ροές. Δεν αλλάζει τίποτα ως προς το πού επιτρέπεται να πάνε οι πελάτες.
Ονομάστε πρώτα την ερώτηση: ποιος επιτρέπεται να φτάσει στον διακομιστή ή πού επιτρέπεται να πάνε οι πελάτες. Τα περισσότερα δίκτυα χρειάζονται και τις δύο απαντήσεις, σε διαφορετικές αλυσίδες.
Πρώτα η κατάσταση, μετά η άδεια, μετά η άρνηση
Μια λίστα επιτρεπόμενων λειτουργεί μόνο αν η συγκεκριμένη άδεια βρίσκεται πάνω από τη γενική άρνηση και αν η κίνηση επιστροφής επιτρέπεται πάνω από τις δύο. Εισαγάγετε κανόνες σε ρητές θέσεις και μετά εκτυπώστε την αλυσίδα με iptables -S FORWARD, ώστε η σειρά να είναι ορατή και όχι υποτιθέμενη.
POOL=10.99.0.0/24
iptables -I FORWARD 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD 2 -s "$POOL" -d 172.31.20.15 -p tcp -m multiport --dports 443,3389 -j ACCEPT
iptables -I FORWARD 3 -s "$POOL" -j REJECTΔύο λεπτομέρειες κρίνουν αν αυτό θα αντέξει την επαφή με πραγματική κίνηση. Χωρίς τον κανόνα κατάστασης, οι απαντήσεις στις συνδέσεις που μόλις επιτρέψατε αξιολογούνται οι ίδιες απέναντι στην άρνηση και απορρίπτονται. Ένας κανόνας LOG χωρίς όριο μπορεί να εξαντλήσει ένα μικρό διαμέρισμα την πρώτη φορά που θα τον χτυπήσει μια σάρωση, γι’ αυτό προσθέστε -m limit --limit 10/min πριν συνεχίσετε την καταγραφή. Το REJECT επιστρέφει σφάλμα αμέσως, που είναι πιο φιλικό όσο ρυθμίζετε τη λίστα· το DROP απορρίπτει σιωπηλά, οπότε κάθε λάθος εμφανίζεται ως λήξη χρόνου. Διαλέξτε ένα επίτηδες και γράψτε την επιλογή στο αρχείο αλλαγής.
Η προώθηση και το NAT πρέπει να λειτουργούν ήδη
Το φιλτράρισμα δεν μπορεί να αποδείξει ότι υπάρχει διαδρομή. Επιβεβαιώστε πρώτα ότι ο πυρήνας προωθεί καθόλου και κάντε αυτή τη ρύθμιση μόνιμη αντί για μια μεμονωμένη εντολή στο κέλυφος. Το φίλτρο είναι το τελευταίο στρώμα, όχι το πρώτο.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s "$POOL" -o eth0 -j MASQUERADEΤο πού ανήκει η συγκάλυψη εξαρτάται από το πού βγαίνουν οι πελάτες. Αν βγαίνουν μέσω του τούνελ προς ένα απομακρυσμένο δίκτυο, ο κανόνας NAT πηγαίνει σε εκείνη τη διεπαφή και όχι στη διεπαφή WAN. Μετά παρακολουθήστε τους μετρητές: αν ο μετρητής POSTROUTING δεν κινείται ποτέ ενώ το πλήθος αποδοχών στο FORWARD ανεβαίνει, η διαδρομή επιστροφής είναι χαλασμένη και το φίλτρο είναι εντάξει. Αυτή η ανάγνωση γλιτώνει ένα απόγευμα ξαναγράφοντας κανόνες που ποτέ δεν ήταν το πρόβλημα.
Το μπλοκ αλληλογραφίας ανήκει μία αλυσίδα πιο πάνω
Ο αποκλεισμός της θύρας 25 στο INPUT σταματά μόνο την αλληλογραφία που απευθύνεται στον διακομιστή VPN. Ένας παραβιασμένος πελάτης που στέλνει αλληλογραφία μέσω του τούνελ προωθείται, άρα το μπλοκ πρέπει να βρίσκεται στο FORWARD δίπλα στις 465 και 587. Αν μια εφαρμογή αναμεταδίδει νόμιμα αλληλογραφία, βάλτε τον προορισμό και τη θύρα της πάνω από αυτόν τον κανόνα.
iptables -I FORWARD 2 -s "$POOL" -p tcp -m multiport --dports 25,465,587 -j REJECTΑφήστε τον μετρητή απορρίψεων να τρέξει μια εβδομάδα πριν σφίξετε οτιδήποτε άλλο. Ο αριθμός που σταματά να ανεβαίνει είναι η νόμιμη ροή που μόλις σπάσατε.
Διαβάστε το πίσω και μετά αποδείξτε το από έναν πελάτη
Διαβάστε το σύνολο κανόνων όπως το αναφέρει ο πυρήνας, όχι όπως το έγραψε το σενάριό σας. Ξεκινήστε με το iptables -S FORWARD, μετά τον πίνακα NAT με το iptables -t nat -L POSTROUTING -n -v, μετά την εγγραφή conntrack για τη ροή που ελέγχετε. Κρατήστε μια εντολή επαναφοράς ή ένα προγραμματισμένο καθάρισμα για όσο διαρκεί η εργασία. Κάθε κλήση χρειάζεται -w, αλλιώς δύο διαχειριστές θα συγκρουστούν στο κλείδωμα xtables. Τίποτα από αυτά δεν είναι προαιρετικό μέσα σε παράθυρο αλλαγών.
Τελειώστε δοκιμάζοντας από έναν πελάτη μέσα στη δεξαμενή και από έναν έξω από αυτή. Ένας κανόνας που λειτουργεί μόνο από το μηχάνημα όπου τον πληκτρολογήσατε δεν είναι πολιτική.