Αποκλεισμός ενός πελάτη OpenVPN από το LAN χωρίς διακοπή της σήραγγας
Καρφιτσώστε τη διεύθυνση σήραγγας του πελάτη στο πιστοποιητικό του, ρίξτε την κίνηση LAN του στην κορυφή του FORWARD και έπειτα επαληθεύστε IPv6, παρακολουθούμενες συνεδρίες και επιβίωση μετά από επανεκκίνηση.
Ένας πελάτης στον OpenVPN διακομιστή σας πρέπει να χάσει την πρόσβαση στο LAN ενώ κάθε άλλη σήραγγα παραμένει ενεργή. Αν το αναζητήσετε, η κορυφαία απάντηση λέει συνήθως ότι ο δαίμονας δεν μπορεί, που είναι μόνο μισή αλήθεια: το OpenVPN δεν έχει τείχος προστασίας ανά πελάτη, αλλά ο κεντρικός υπολογιστής που τερματίζει τη σήραγγα φιλτράρει ήδη πακέτα. Οι δύο αποφάσεις που μετρούν είναι η ταυτότητα που αποκλείετε και η θέση του κανόνα. Κάντε τα σωστά και η αλλαγή γίνεται μία γραμμή που μπορείτε να δοκιμάσετε και να αφαιρέσετε.
Καρφιτσώστε τον πελάτη πριν γράψετε τον κανόνα
Το OpenVPN εκμισθώνει διευθύνσεις σήραγγας από μια δεξαμενή, άρα το 10.8.0.6 είναι θέση και όχι πρόσωπο. Όταν η συνεδρία τελειώσει, η μίσθωση επιστρέφει και μπορεί να δοθεί στην επόμενη σύνδεση, που σημαίνει ότι ένας κανόνας γραμμένος εναντίον αυτής της διεύθυνσης ακολουθεί τη θέση, όχι τον χρήστη. Αποφασίστε λοιπόν πρώτα τι πραγματικά αποκλείετε: μια διεύθυνση για ένα σύντομο πείραμα ή ένα πιστοποιητικό για κάποιον που θέλετε να κρατήσετε έξω.
Για να δεσμεύσετε τη διεύθυνση στο πιστοποιητικό, δημιουργήστε ένα αρχείο στον κατάλογο που ορίζει το client-config-dir και δώστε στο αρχείο ακριβώς το common name του πιστοποιητικού. Βάλτε μέσα μία οδηγία, ifconfig-push 10.8.0.6 255.255.255.0, και αυτός ο πελάτης κρατά την ίδια διεύθυνση σήραγγας στις επανασυνδέσεις. Δύο ρυθμίσεις πρέπει να υπάρχουν για να ισχύσει: το client-config-dir πρέπει να δηλώνεται στη διαμόρφωση του διακομιστή και η διεύθυνση που αποστέλλεται πρέπει να βρίσκεται σε υποδίκτυο που ο διακομιστής μπορεί να δρομολογήσει. Αν λείπει ένα, το αρχείο αγνοείται χωρίς σφάλμα, κάτι που κάνει την επόμενη δοκιμή τείχους προστασίας παραπλανητική.
Ένας προσωρινός αποκλεισμός μπορεί να χρησιμοποιήσει διεύθυνση από τη δεξαμενή, αρκεί το δελτίο να καταγράφει ποια συνεδρία την κρατούσε εκείνη τη στιγμή.
Η σειρά καθορίζει αν εκτελείται η απόρριψη
Σε πύλη Linux που προωθεί μεταξύ της σήραγγας και του LAN, τα πακέτα διασχίζουν την αλυσίδα FORWARD. Διαβάστε την παρακάτω εντολή ως πρόταση: εισαγωγή στην κορυφή του FORWARD, αντιστοίχιση κίνησης που εισέρχεται από το tun0, από αυτόν τον έναν κεντρικό υπολογιστή, με προορισμό το υποδίκτυο LAN, και απόρριψή της.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROPΤο -I είναι αυτό που κάνει τον κανόνα να εκτελείται. Με -A προσαρτημένος, προσγειώνεται κάτω από κάθε ευρεία αποδοχή για το υποδίκτυο της σήραγγας και δεν βλέπει ποτέ πακέτο. Επαληθεύστε τη θέση με iptables -vnL FORWARD --line-numbers και διαβάστε και τους μετρητές: μια απόρριψη στην κορυφή που δεν μετρά τίποτα σημαίνει ότι η κίνηση φτάνει από άλλη διαδρομή.
Η ίδια η διεύθυνση LAN της πύλης είναι διαφορετική διαδρομή. Τα πακέτα προς το ίδιο το μηχάνημα πηγαίνουν στο INPUT, όχι στο FORWARD, οπότε ένας πελάτης μπορεί να χάσει έναν κεντρικό υπολογιστή LAN και να ανοίξει ακόμη τη σελίδα διαχείρισης του δρομολογητή. Προσθέστε τον αντίστοιχο κανόνα INPUT όταν αυτό μετρά.
Τι δεν μπορεί να δει το φίλτρο
Το φιλτράρισμα συμβαίνει όταν αξιολογείται ένα πακέτο, άρα μια εγκατεστημένη συνεδρία TCP μπορεί να συνεχιστεί μέχρι να κλείσει ή να επαναφερθεί. Αν ο αποκλεισμός πρέπει να δαγκώσει αμέσως, καθαρίστε τις παρακολουθούμενες ροές για εκείνη την πηγή με conntrack -D -s 10.8.0.6 αφού μπει ο κανόνας. Αν μερικά δευτερόλεπτα επικάλυψης είναι αποδεκτά, καταγράψτε αυτή την επιλογή αντί να την αφήσετε σιωπηρή. Σε κάθε περίπτωση, το επόμενο άτομο πρέπει να ξέρει αν ο κανόνας σταματά ζωντανή κίνηση ή μόνο νέες συνδέσεις.
Η κίνηση μεταξύ ομοτίμων δεν αγγίζει ποτέ το τείχος προστασίας του κεντρικού υπολογιστή. Με ενεργό το client-to-client, το OpenVPN προωθεί αυτά τα πακέτα μέσα στον δαίμονα, οπότε ούτε το FORWARD ούτε το INPUT τα βλέπει. Οι μόνες λύσεις είναι να απενεργοποιήσετε το client-to-client ή να δεχτείτε ότι οι ομότιμοι μπορούν να φτάσουν ο ένας τον άλλο· ένας κανόνας iptables δεν θα δει αυτή την κίνηση.
IPv6, firmware και επιβίωση μετά από επανεκκίνηση
Ένας κανόνας IPv4 δεν λέει τίποτα για το IPv6. Αν η σήραγγα και το LAN μεταφέρουν και τις δύο οικογένειες, ο ισοδύναμος κανόνας πρέπει να υπάρχει στο ip6tables ή στο σύνολο κανόνων nftables που κατέχει την πολιτική σε αυτόν τον κεντρικό υπολογιστή. Το firmware του δρομολογητή συχνά κρύβει το netfilter πίσω από τη δική του αφαίρεση, οπότε σύνταξη και ονόματα πινάκων αντιγραμμένα από φόρουμ μπορεί να μην ισχύουν.
Στο OpenWrt, η τεκμηριωμένη διαδρομή είναι μια καταχώριση διαμόρφωσης τείχους προστασίας και όχι μια χειρόγραφη γραμμή iptables, και μια χειρόγραφη γραμμή μπορεί να εξαφανιστεί όταν το τείχος προστασίας επαναφορτώνεται. Άλλες διανομές επαναφέρουν κανόνες μέσω netfilter-persistent, μιας μονάδας εκκίνησης ή ενός χώρου του κατασκευαστή, και αυτοί οι μηχανισμοί δεν είναι εναλλάξιμοι. Αποδείξτε όποιον επιλέξατε με επανεκκίνηση, γιατί η επαναφόρτωση ασκεί διαφορετική διαδρομή.
Επαληθεύστε ανά διαδρομή και μετά επιστρέψτε καθαρά
Δοκιμάστε κάθε διαδρομή χωριστά, γιατί ένας επιτυχής έλεγχος κρύβει τους άλλους. Ένας αποκλεισμένος πελάτης πρέπει να φτάνει ακόμη στο διαδίκτυο μέσω της σήραγγας ενώ αποτυγχάνει απέναντι σε κεντρικό υπολογιστή LAN, ένας δεύτερος πελάτης πρέπει να φτάνει στον ίδιο υπολογιστή, και η διεύθυνση της πύλης και η διαδρομή προς ομότιμο χρειάζονται η καθεμία τη δική της παρατήρηση. Γράψτε τα αποτελέσματα δίπλα στον κανόνα ώστε η επόμενη αλλαγή να έχει βάση. Ο πίνακας παρακάτω είναι το σύνολο που αξίζει να μείνει στο δελτίο.
| Διαδρομή | Αναμενόμενο με τον κανόνα | Όταν αποτυγχάνει |
|---|---|---|
| Αποκλεισμένος πελάτης προς κεντρικό υπολογιστή LAN | Καμία απάντηση | Ο κανόνας είναι κάτω από αποδοχή ή η πηγή δεν ταιριάζει |
| Αποκλεισμένος πελάτης προς το διαδίκτυο | Λειτουργεί μέσω tun0 | Ο κανόνας είναι πολύ ευρύς, χωρίς αντιστοίχιση προορισμού |
| Δεύτερος πελάτης προς τον ίδιο κεντρικό υπολογιστή LAN | Λειτουργεί | Ο κανόνας ταίριαξε με περισσότερα από τον προβλεπόμενο υπολογιστή |
| Αποκλεισμένος πελάτης προς τη διεύθυνση LAN της πύλης | Αποκλείεται μόνο με τον αντίστοιχο κανόνα INPUT | Λείπει ο κανόνας INPUT |
| Αποκλεισμένος πελάτης προς διεύθυνση σήραγγας ομοτίμου | Λειτουργεί ακόμη | client-to-client είναι ενεργό και εκτός εμβέλειας του τείχους προστασίας |
Η επαναφορά είναι διαγραφή κατά προδιαγραφή, όχι flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP αφαιρεί ακριβώς εκείνη την καταχώριση και αφήνει την υπόλοιπη αλυσίδα άθικτη. Αφαιρέστε την ίδια γραμμή από όποιο αρχείο επαναφέρει τους κανόνες στην εκκίνηση, επαναφορτώστε το και επιβεβαιώστε ότι ο πελάτης φτάνει ξανά στον κεντρικό υπολογιστή LAN. Ένα flush του FORWARD θα αναιρούσε και κανόνες που δεν γράψατε, κάτι που μετατρέπει μια επαναφορά σε δεύτερο περιστατικό.
Πριν κλείσετε το δελτίο, επιβεβαιώστε τρία πράγματα: η καρφιτσωμένη διεύθυνση ταιριάζει με το πιστοποιητικό, ο κανόνας βρίσκεται πάνω από τις αποδοχές με μετρητή διάφορο του μηδενός, και το αρχείο μονιμότητας περιέχει τον ίδιο κανόνα που δοκιμάσατε. Αν λείπει κάτι από αυτά, ο αποκλεισμός είναι ψευδαίσθηση συνεδρίας shell.