Η αλλαγή κανόνα του τείχους προστασίας δεν λειτουργεί: σειρά κανόνων και κατάσταση σύνδεσης
Ένας επεξεργασμένος κανόνας μπορεί να βρίσκεται πίσω από προηγούμενη αποδοχή ή να παραλείπεται από την παρακολούθηση συνδέσεων. Διαχωρίστε τις δύο δοκιμές, χρησιμοποιήστε νέα ροή και κρατήστε δρόμο επιστροφής.
Επεξεργαστήκατε τον κανόνα, επαναφορτώσατε το σύνολο κανόνων και η σήραγγα συμπεριφέρεται ακριβώς όπως πριν. Αυτό το αποτέλεσμα έχει δύο συχνές αιτίες και απαιτούν διαφορετικές δοκιμές. Είτε ο νέος κανόνας βρίσκεται μετά από έναν προηγούμενο κανόνα που έχει ήδη δεχτεί το πακέτο, είτε η ανταλλαγή που παρακολουθείτε είναι μια ανιχνευόμενη σύνδεση που η αλλαγή δεν επαναξιολογεί ποτέ. Ένας κανόνας σε ένα αρχείο δηλώνει πρόθεση· αυτό που αποφασίζει για το πακέτο είναι η ενεργή διαδρομή που συναντά. Περάστε τους παρακάτω ελέγχους με τη σειρά και κρατήστε έναν δρόμο επιστροφής όσο το κάνετε.
Η σειρά κανόνων και η κατάσταση σύνδεσης είναι διαφορετικές βλάβες
Οι διατεταγμένες αλυσίδες αξιολογούνται από πάνω προς τα κάτω και ο πρώτος κανόνας που φτάνει σε τελεσίδικη ετυμηγορία τερματίζει τη διαδρομή μέσα σε αυτή την αλυσίδα. Βάλτε μια ευρεία αποδοχή πάνω από έναν προσεκτικά γραμμένο κανόνα κλειδώματος και ο κανόνας κλειδώματος γίνεται τεκμηρίωση: βρίσκεται στο σύνολο κανόνων, ο μετρητής του είναι μηδέν και κανένα πακέτο δεν θα τον φτάσει ποτέ. Το ίδιο κείμενο που εφαρμόζεται σε άλλη αλυσίδα επίσης δεν αποδεικνύει τίποτα. Στο nftables οι βασικές αλυσίδες συνδέονται σε hooks με προτεραιότητες, οπότε μια αποδοχή σε μια αλυσίδα δεν εμποδίζει άλλη αλυσίδα σε διαφορετικό hook ή προτεραιότητα να βλέπει το ίδιο πακέτο.
Η παρακολούθηση συνδέσεων παράγει το δεύτερο σύμπτωμα και από έξω φαίνεται πανομοιότυπο. Μόλις μια ροή βρεθεί στον πίνακα καταστάσεων, μια αποδοχή για established-or-related κοντά στην κορυφή της αλυσίδας επιστρέφει πριν καν εξεταστεί ο νέος κανόνας σας. Οι αντιστοιχίσεις NAT έχουν την ίδια ιδιότητα: η μετάφραση καθορίστηκε όταν ξεκίνησε η ροή, οπότε ένας επεξεργασμένος κανόνας postrouting δεν ξαναγράφει μια συνεδρία που ήδη τρέχει. Γι' αυτό μια αλλαγή φαίνεται να λειτουργεί στις 09:00 για μια νέα σύνδεση και φαίνεται να μην κάνει τίποτα για τη συνεδρία που άνοιξε κάποιος στις 08:55.
Οι ομάδες ασφαλείας cloud προσθέτουν ένα τρίτο μοντέλο που πιάνει όσους έμαθαν με iptables. Οι κανόνες εισερχομένων τους είναι μια λίστα επιτρεπόμενων που αξιολογείται ως σύνολο και όχι ως διέλευση πρώτης αντιστοίχισης, είναι με κατάσταση, και η αφαίρεση ενός κανόνα επιτρεπόμενου δεν τερματίζει ροές που ήδη ανιχνεύονται. Το να υποθέτει κανείς σημασιολογία πρώτης αντιστοίχισης σε πλατφόρμα που δεν την έχει οδηγεί σε σίγουρα, λανθασμένα συμπεράσματα.
Διαβάστε το ενεργό σύνολο κανόνων, όχι το αρχείο που επεξεργαστήκατε
Ξεκινήστε με αυτό που επιβάλλει ο πυρήνας τώρα. Μια αποθηκευμένη διαμόρφωση που δεν εφαρμόστηκε ποτέ εξηγεί εντυπωσιακά πολλές αμετάβλητες συμπεριφορές, και ο αποκλεισμός της κοστίζει μία εντολή:
nft list ruleset
iptables-saveΈπειτα ρωτήστε αν ο κανόνας σας φτάνει καθόλου. Οι μετρητές πακέτων απαντούν άμεσα και απαντούν καλύτερα από κάθε συλλογισμό για την πρόθεση:
iptables -L FORWARD -v -n --line-numbers
nft list chain inet filter forwardΈνας κανόνας κλειδώματος με μηδέν πακέτα μετά από πραγματική δοκιμαστική προσπάθεια δεν είναι πρόβλημα πολιτικής, είναι πρόβλημα θέσης. Η μετακίνησή του είναι αλλαγή μιας γραμμής και η σύνταξη είναι ακριβώς αυτό που προκάλεσε το αρχικό σφάλμα. Με iptables -I εισάγει και -A προσθέτει στο τέλος· με nftables insert τοποθετεί κανόνα στην αρχή της αλυσίδας ενώ add προσθέτει στο τέλος. Όταν ένας κανόνας πρέπει να κερδίσει, πείτε το ρητά αντί να εμπιστεύεστε τη σειρά που φορτώθηκε τυχαία.
Αποδείξτε αν η ροή ανιχνεύεται
Πριν κατηγορήσετε τον κανόνα, ελέγξτε αν η κίνηση είναι καθόλου ανιχνευόμενη σύνδεση. Ρωτήστε τον πίνακα καταστάσεων για τη συγκεκριμένη ροή αντί να τον αδειάσετε ολόκληρο:
conntrack -L -p tcp --dport 1194
conntrack -E -p tcp --dport 1194Η λίστα δείχνει την κατάσταση και το υπόλοιπο χρονικό όριο, και έτσι ξεχωρίζετε μια εδραιωμένη συνεδρία από μια νέα προσπάθεια· η λειτουργία συμβάντων εκτυπώνει ενημερώσεις καθώς συμβαίνουν, που είναι χρήσιμο όσο επανασυνδέετε έναν πελάτη. Αν η ροή υπάρχει με εδραιωμένη κατάσταση πριν αγγίξετε οτιδήποτε, καμία επεξεργασία των κανόνων φιλτραρίσματος δεν θα αλλάξει τη μοίρα της. Αυτό δεν είναι σφάλμα του τείχους προστασίας, είναι το συμβόλαιο του φιλτραρίσματος με κατάσταση.
Αντισταθείτε στη συντόμευση να αδειάσετε ολόκληρο τον πίνακα σε μια πύλη παραγωγής. conntrack -F είναι διαθέσιμο και καταστρέφει επίσης κάθε ανιχνευόμενη ροή στο μηχάνημα, συμπεριλαμβανομένης της συνεδρίας διαχείρισης από την οποία εργάζεστε και της σήραγγας που μεταφέρει το κέλυφός σας. Μεμονωμένες εγγραφές μπορούν να διαγραφούν όταν πραγματικά το χρειάζεστε, αλλά μια νέα ροή από νέα θύρα προέλευσης είναι συνήθως καθαρότερο πείραμα.
Μερικές διαδρομές δεν ανιχνεύονται και συμπεριφέρονται αντίστροφα. Κίνηση που έχει σημανθεί ως notrack στον πίνακα raw, μερικές σήραγγες που παρακάμπτουν τα κανονικά hooks και η ασύμμετρη δρομολόγηση που χωρίζει μια ροή σε δύο πύλες παράγουν όλα πακέτα που αξιολογούνται ένα κάθε φορά, ή κατάσταση που δεν δημιουργείται ποτέ και στα δύο άκρα. Αν οι μετρητές κινούνται για κάθε πακέτο, υποψιαστείτε αυτού του είδους τη διαδρομή πριν υποψιαστείτε τη σειρά.
Δοκιμάστε από νέα ροή με δρόμο επιστροφής
Πριν δοκιμάσετε έναν κανόνα που θα μπορούσε να κόψει την απομακρυσμένη πρόσβαση, δημιουργήστε μια διαδρομή ανάκτησης: την κονσόλα του παρόχου, μια σειριακή κονσόλα, μια διεύθυνση διαχείρισης εκτός ζώνης ή ένα δεύτερο interface που ο κανόνας δεν μπορεί να αντιστοιχίσει. Ένας χρονοδιακόπτης επαναφοράς είναι λογικός σύντροφος, αφού θα επαναφέρει το προηγούμενο σύνολο κανόνων ακόμη και αν η συνεδρία σας πεθάνει στη μέση της δοκιμής.
Έπειτα δοκιμάστε με μια ανταλλαγή που δεν θα μπορούσε να καλυφθεί ήδη από κατάσταση. Αποσυνδέστε και επανασυνδέστε τον πελάτη ώστε να δημιουργηθεί νέα πεντάδα, και παρακολουθήστε και τα δύο άκρα όσο συμβαίνει:
tcpdump -ni eth0 'tcp port 1194'
journalctl -k -n 50 --no-pagerΕκτελέστε τη δοκιμή και προς τις δύο κατευθύνσεις. Ένας κανόνας που μπλοκάρει τη νέα εισερχόμενη χειραψία μπορεί ακόμη να επιτρέπει τη διαδρομή απάντησης, ή το αντίστροφο, και ένα μονόπλευρο αποτέλεσμα είναι ο συνηθισμένος λόγος που ένα κλείδωμα δουλεύει μισά. Επανασυνδεθείτε μία φορά μετά τη δοκιμή για να επιβεβαιώσετε τη σταθερή κατάσταση και ελέγξτε ότι η νόμιμη πρόσβαση διαχείρισης επιβίωσε· ένας κανόνας γραμμένος για μία θύρα έχει τη συνήθεια να αντιστοιχίζει ευρύτερο εύρος από το προβλεπόμενο.
Καταγράψτε σκοπό και θέση μαζί με τον κανόνα
Ένας κανόνας χωρίς καταγεγραμμένο σκοπό είναι κανόνας που κανείς δεν τολμά να αφαιρέσει. Δίπλα σε κάθε καταχώριση κλειδώματος κρατήστε τη ροή που προστατεύει, την αλυσίδα και το hook όπου ζει, τη θέση που πρέπει να κρατά σε σχέση με ευρύτερες αποδοχές και τη δοκιμή που το απέδειξε. Όταν κάποιος επεξεργαστεί το γύρω σύνολο κανόνων έξι μήνες αργότερα, αυτή η σημείωση είναι η μόνη προειδοποίηση ότι η θέση ήταν σκόπιμη.
Πριν κλείσετε την αλλαγή, επιβεβαιώστε τέσσερα πράγματα: το σύνολο κανόνων που τρέχει ταιριάζει με το αρχείο, ο νέος κανόνας έχει μετρητές διάφορους του μηδενός μετά από νέα προσπάθεια, η αντίστροφη κατεύθυνση και η πρόσβαση διαχείρισης λειτουργούν ακόμη, και επανασυνδεθήκατε μία φορά για να αποδείξετε τη σταθερή κατάσταση και όχι την κατάσταση μιας συνεδρίας παλαιότερης από την αλλαγή. Αν κάτι από αυτά δεν έχει επαληθευτεί, η αλλαγή δεν έχει τελειώσει, ό,τι κι αν κάνει η σήραγγα.