Νέες συνδέσεις σε νέα έξοδο VPN, οι παλιές ροές μένουν ανέγγιχτες
Μια προγραμματισμένη αποστράγγιση μετακινεί μόνο μη ταξινομημένες ροές. Συγκρίνετε το με αλλαγή διαδρομής και δείτε τις σημάνσεις, τους πίνακες και την κατάσταση conntrack που το κρατούν.
Δύο υγιείς έξοδοι VPN, μια μεγάλη μεταφόρτωση που ήδη τρέχει και μια απαίτηση η επόμενη σύνδεση να χρησιμοποιεί το άλλο τούνελ. Υπάρχουν δύο τρόποι να το ικανοποιήσουμε και μόνο ένας είναι ασφαλής σε ενεργή πύλη. Η αλλαγή της προεπιλεγμένης διαδρομής μετακινεί κάθε πακέτο, μαζί με εκείνα που ανήκουν στη μεταφόρτωση. Μια προγραμματισμένη αποστράγγιση αλλάζει την επιλογή για νέες συνδέσεις αφήνοντας τις παρακολουθούμενες ροές στη διαδρομή όπου ξεκίνησαν.
Δύο τρόποι να αλλάξεις έξοδο
Η αλλαγή διαδρομής είναι μία εντολή και αντιστρέφεται σε δευτερόλεπτα, γι’ αυτό χρησιμοποιείται κατά τη διάρκεια περιστατικών. Είναι όμως χωρίς διάκριση: τα πακέτα της υπάρχουσας μεταφόρτωσης φεύγουν ξαφνικά από άλλο τούνελ, με άλλη δημόσια διεύθυνση πηγής και ξεχωριστή κατάσταση μετάφρασης.
Αν το μακρινό άκρο παρακολουθεί ροές κατά διεύθυνση πηγής, η μεταφόρτωση μπορεί απλώς να πάψει να αναγνωρίζεται. Η αποστράγγιση το αποφεύγει παίρνοντας την απόφαση μία φορά ανά σύνδεση και αποθηκεύοντάς την, ώστε η παλιά μεταφόρτωση να κρατά την έξοδό της μέχρι να τελειώσει. Αυτή είναι όλη η αξία της άσκησης: το μακρινό άκρο δεν βλέπει καμία αλλαγή που πρέπει να ερμηνεύσει. Συνεχίζει να λαμβάνει πακέτα που ταιριάζουν με τη σύνδεση που ήδη γνωρίζει.
Το κόστος είναι η πολυπλοκότητα: δύο πίνακες δρομολόγησης, ένας ταξινομητής που τρέχει στο σωστό hook και σημάνσεις που πρέπει να συντονιστούν με ό,τι άλλο στο μηχάνημα τις χρησιμοποιεί.
Δώσε σε κάθε έξοδο τον δικό της πίνακα
Δέσμευσε έναν πίνακα δρομολόγησης ανά έξοδο και διακριτές τιμές σήμανσης ή bits για τις δύο επιλογές. Κάθε πίνακας χρειάζεται τις διαδρομές που ταιριάζουν στον ρόλο του, όχι μόνο ένα όνομα, και χρειάζεται ένα σκόπιμο αποτέλεσμα αποτυχίας για τη περίπτωση που λείπει. Ένας κενός πίνακας που πέφτει σιωπηλά στον κύριο πίνακα — έτσι φεύγει η κίνηση από έξοδο που δεν διάλεξε κανείς.
ip rule add fwmark 0x10/0x10 table 101
ip rule add fwmark 0x20/0x20 table 102
ip route add default via 192.0.2.1 dev wg-a table 101
ip route add default via 198.51.100.1 dev wg-b table 102Πρόσθεσε διαδρομή blackhole στο τέλος κάθε πίνακα ώστε μια αναζήτηση χωρίς αντιστοιχία να αποτυγχάνει ηχηρά αντί να διαφεύγει σε μια προεπιλογή που δεν διάλεξες.
Διάλεξε μία φορά, στο πρώτο πακέτο
Ταξινόμησε αφού υπάρχει παρακολούθηση συνδέσεων και πριν την αναζήτηση διαδρομής που μετράει. Για μια νέα, μη ταξινομημένη σύνδεση LAN, διάλεξε την έξοδο και αποθήκευσέ την στην κατάσταση της σύνδεσης. Στα επόμενα πακέτα, επανάφερε την αποθηκευμένη τιμή στη σήμανση πακέτου που διαβάζει η δρομολόγηση πολιτικής.
Το λεπτό σημείο είναι τι σημαίνει νέο. Το conntrack μπορεί ακόμη να αναφέρει NEW για πρώιμα πακέτα και επαναμεταδόσεις πριν φανεί απάντηση, οπότε ένας ταξινομητής που βασίζεται μόνο σε αυτή την κατάσταση μπορεί να αντικαταστήσει μια επιλογή που έχει ήδη κάνει. Έλεγξε ότι δεν έχει αποθηκευτεί έξοδος για τη σύνδεση πριν ορίσεις μία.
Το nftables κρατά τις σημάνσεις πακέτου και σύνδεσης χωριστά, και ο οδηγός μεταπληροφοριών τεκμηριώνει την ρητή αντιγραφή μεταξύ τους. Η σήμανση σύνδεσης δεν γίνεται από μόνη της η σήμανση πακέτου με την οποία ταιριάζει ο κανόνας σου, και αυτός είναι ο συχνότερος λόγος που ένας προσεκτικά γραμμένος ταξινομητής δεν έχει κανένα αποτέλεσμα.
Περιόρισε την επαναφορά στην κατεύθυνση και την κίνηση που εννοείς. Η εφαρμογή σήμανσης εξόδου διαδικτύου σε πακέτα που επιστρέφουν μπορεί να στείλει τις απαντήσεις προς την έξοδο αντί για το LAN, και το σύμπτωμα είναι μια μονόδρομη σύνδεση που μοιάζει με πρόβλημα τείχους προστασίας. Διάβασε τη διαδρομή απάντησης πριν αγγίξεις κανόνα τείχους προστασίας, γιατί το πακέτο δρομολογείται, απλώς όχι πίσω στον αποστολέα.
Τέσσερις φάσεις μιας αποστράγγισης
Προετοίμασε το B χωρίς να αγγίξεις το A: δρομολόγηση, προώθηση, εξουσιοδότηση, NAT και διαδρομή επιστροφής. Εγκατέστησε τον πίνακα και την πολιτική επιλογής του μέσω του υπάρχοντος ιδιοκτήτη ρυθμίσεων της πύλης.
Άλλαξε τον ταξινομητή ώστε οι νέες, μη ταξινομημένες συνδέσεις να διαλέγουν το B, διατηρώντας τις αποθηκευμένες επιλογές. Μια ατομική συναλλαγή nftables αποφεύγει ένα παράθυρο όπου πρέπει να καθαριστεί η παλιά κατάσταση.
Άφησε το A ενεργό όσο ολοκληρώνονται οι ροές του. Η διεπαφή, ο πίνακας, η απομακρυσμένη έξοδος και οι αντιστοιχίσεις NAT είναι ακόμη μέρος αυτών των ροών, και η επεξεργασία κανόνα NAT δεν ξαναχτίζει δεσμεύσεις που υπάρχουν ήδη.
Απόσυρε το A όταν εκπληρωθεί η συνθήκη αποστράγγισης, κρινόμενη από την κατάσταση συνδέσεων και τη συμπεριφορά της εφαρμογής και όχι από ένα ήσυχο διάστημα.
Τι δεν μπορεί να υποσχεθεί μια αποστράγγιση
Ένα αίτημα προγράμματος περιήγησης δεν είναι νέα σύνδεση μεταφοράς· η ομαδοποίηση συνεχίζει να στέλνει αιτήματα πάνω στην παλιά. Αντίστροφα, μια ροή UDP μπορεί να γεράσει έξω από το conntrack και ένα μεταγενέστερο πακέτο ταξινομείται από την αρχή. Η αποστράγγιση ακολουθεί παρακολουθούμενες ροές, όχι την ιδέα μιας εφαρμογής για συνεδρία.
Αν το A αποτύχει πριν τελειώσουν οι ροές του, η αποθηκευμένη σήμανση δεν τις σώζει. Επανασυνδέονται μέσω του B ή δεν επανασυνδέονται καθόλου. Μια προγραμματισμένη αποστράγγιση αγοράζει συνέχεια όσο η αρχική διαδρομή είναι υγιής· δεν είναι αντιγραφή κατάστασης μεταξύ ανεξάρτητων εξόδων.
Επαλήθευσε και τα δύο μισά
Ξεκίνα μια μακρόβια επιτρεπόμενη σύνδεση πριν την αλλαγή και μια πραγματικά νέα μετά. Επιβεβαίωσε ποιο τούνελ χρησιμοποιεί η καθεμία και ποια δημόσια διεύθυνση πηγής βλέπει το μακρινό άκρο, έπειτα έλεγξε ότι η κίνηση επιστροφής γυρίζει πίσω.
Μην αδειάσεις τον πίνακα conntrack για να εμφανιστεί η νέα επιλογή. Αυτό καταστρέφει ακριβώς την κατάσταση που η αποστράγγιση υποτίθεται ότι διατηρεί, και μετατρέπει μια ελεγχόμενη μετάβαση σε διακοπή με καθαροφανή δοκιμή.