Τρία άλματα WireGuard φτάνουν σε ένα δίκτυο χωρίς δημόσια διεύθυνση και τότε το μεσαίο μηχάνημα σταματά να απαντά στη θύρα στην οποία έπρεπε να ακούει. Το τούνελ προς τα εμπρός εξακολουθεί να λειτουργεί, ο απομακρυσμένος κεντρικός υπολογιστής εξακολουθεί να απαντά και μόνο ο μεσαίος διακομιστής έχει σωπάσει από έξω. Αυτός ο συνδυασμός μπερδεύει ακριβώς επειδή είναι αυτοπροκληθείς: το μεσαίο άλμα υπακούει στον δικό του πίνακα δρομολόγησης και ο πίνακας στέλνει τις απαντήσεις του προς λάθος κατεύθυνση.

Μια αλυσίδα που λειτουργεί μέχρι να μιλήσεις στο μεσαίο κουτί

Πάρτε μια ενδεικτική αλυσίδα: ο πελάτης A φτάνει στον διακομιστή B στο UDP 500 και ο B προχωρά στον διακομιστή C στο UDP 500. Ο C δέχεται κίνηση μόνο από τη διεύθυνση του μοναδικού του ομότιμου, κάτι που τον κάνει φύλλο και κρατά τη συμπεριφορά του απλή. Ο B δεν είναι φύλλο και ό,τι ενδιαφέρον έχει αυτή η βλάβη συμβαίνει εκεί.

Η διάκριση έχει σημασία επειδή οι ρόλοι του φύλλου και του μέσου τραβούν σε αντίθετες κατευθύνσεις. Ένα φύλλο μπορεί να στέλνει τα πάντα σε ένα τούνελ χωρίς συνέπειες, αφού τίποτα άλλο δεν εξαρτάται από αυτό. Ένα μεσαίο άλμα είναι ταυτόχρονα τελικό σημείο για πελάτες και πελάτης προς την απομακρυσμένη πλευρά, και οι δύο αυτές δουλειές θέλουν διαφορετική δρομολόγηση.

Γιατί η απάντηση φεύγει από το τούνελ

Στον B, η διεπαφή που κοιτά προς τον C φέρει AllowedIPs = 0.0.0.0/0 μαζί με την αντίστοιχη προεπιλεγμένη διαδρομή. Επομένως κάθε πακέτο που δημιουργεί ο B μπαίνει σε αυτό το τούνελ, εκτός αν κάτι πιο συγκεκριμένο υπερισχύσει.

Ένα πακέτο από τον A με προορισμό τον B φτάνει και γίνεται δεκτό, επειδή ο B είναι ο προορισμός και η τοπική παράδοση συμβαίνει πρώτη. Η απάντηση είναι ένα ολοκαίνουργιο τοπικά παραγόμενο πακέτο με κατεύθυνση τη δημόσια διεύθυνση του A, και αυτός ο προορισμός ταιριάζει με την προεπιλεγμένη διαδρομή μέσα στο τούνελ. Ο C το λαμβάνει, δεν κατέχει αυτή τη διεύθυνση και το απορρίπτει.

Το σύμπτωμα διαβάζεται ως πρόβλημα τείχους προστασίας ή αναντιστοιχία κλειδιού και εδώ κανένα από τα δύο δεν ισχύει. Μια καταγραφή στο τούνελ προς τον C δείχνει τις απαντήσεις να πηγαίνουν προς λάθος κατεύθυνση. Αυτή η μία παρατήρηση εξοικονομεί περισσότερο χρόνο από οποιαδήποτε ποσότητα ανάγνωσης ρυθμίσεων, οπότε σημειώστε την πριν αρχίσετε να αλλάζετε κλειδιά. Όποιος δεν έχει δει την καταγραφή θα υποθέσει ότι το ίδιο το τούνελ είναι χαλασμένο.

Η στενή διόρθωση: κανόνες πολιτικής που ταιριάζουν σε θύρα πηγής

Οι απαντήσεις από το ακουστικό socket του B φεύγουν με θύρα πηγής 500. Ένας κανόνας πολιτικής μπορεί να ταιριάξει σε αυτό και να επιστρέψει αυτά τα πακέτα στον συνηθισμένο πίνακα:

ip rule add sport 500 table main priority 100
ip rule add sport 8080 table main priority 101

Οι κανόνες πολιτικής εξετάζονται με σειρά προτεραιότητας και ο κύριος πίνακας βρίσκεται στο 32766, άρα ένας κανόνας στο 100 ρωτιέται πριν η προεπιλεγμένη διαδρομή του τούνελ έχει λόγο. Προσθέστε μία καταχώριση για κάθε θύρα που πρέπει να παραμείνει προσβάσιμη από έξω και τίποτα περισσότερο, ώστε η προωθούμενη κίνηση να συνεχίσει να χρησιμοποιεί το τούνελ για το οποίο χτίστηκε.

Γνωρίστε το όριο αυτού του κόλπου. Ο επιλογέας sport ταιριάζει σε τοπικά παραγόμενα πακέτα, που καλύπτει ακριβώς την περίπτωση της απάντησης και σκόπιμα δεν καλύπτει κίνηση που ο B απλώς προωθεί για κάποιον άλλο. Μια υπηρεσία που φιλοξενείται πίσω από τον B χρειάζεται ακόμη τη δική της απάντηση, και το να προσποιείσαι το αντίθετο παράγει διόρθωση που λειτουργεί για την πρώτη υπηρεσία και αποτυγχάνει για τη δεύτερη.

Δώστε στον κανόνα έναν ιδιοκτήτη

Ένας κανόνας που πληκτρολογήθηκε σε προτροπή εξαφανίζεται την επόμενη φορά που η διεπαφή ξαναχτίζεται. Σε μια εγκατάσταση WireGuard, βάλτε τον εκεί όπου η διεπαφή δημιουργείται και αφαιρείται:

PostUp = ip rule add sport 500 table main priority 100
PostDown = ip rule del sport 500 table main priority 100

Αν η διεπαφή ανήκει στον NetworkManager, σε ένα hook διανομής ή σε ένα entrypoint container, το ζεύγος ανήκει σε αυτόν τον ιδιοκτήτη και όχι σε ένα χειροκίνητα επεξεργασμένο αρχείο. Ελέγξτε τους ενεργούς κανόνες μετά από επανασύνδεση, όχι μόνο μετά την πρώτη εκκίνηση, γιατί η πρώτη εκκίνηση είναι η περίπτωση που πάντα λειτουργεί.

Συγκρίνετε τις εναλλακτικές ειλικρινά

Ο κανόνας θύρας πηγής είναι μία από τέσσερις διεξόδους και η στενότερη από αυτές. Έχει το πλεονέκτημα ότι δεν αγγίζει καθόλου την πολιτική του τούνελ, γι’ αυτό συνήθως επιβιώνει από μεταγενέστερες αλλαγές. Οι στενές διορθώσεις αποτυγχάνουν επίσης ηχηρά όταν παύουν να ισχύουν, ενώ μια ευρεία εξαίρεση συνεχίζει να λειτουργεί σιωπηλά πολύ αφού ο λόγος της εξαφανιστεί. Αυτή η διαφορά μετράει περισσότερο από την κομψότητα όταν κάποιος άλλος έχει το κουτί σε δύο χρόνια.

ApproachWhat it costsWhere it breaks
Source-port policy ruleOne rule per exposed portAnything B forwards rather than originates
Destination exception routeA route pinned to specific client addressesClients whose address changes
Stop full-tunnelling on BLoses the catch-all path toward CDesigns that depend on it
Split into two tunnelsMore interfaces and more policyNothing, at the cost of complexity

Επαληθεύστε από τα δύο άκρα μόλις επιλέξετε. Από τον A, ξεκινήστε μια σύνδεση στη θύρα του B και κρατήστε την απασχολημένη για λίγο. Στον B, κάντε τον πυρήνα να δικαιολογήσει τη διαδρομή απάντησης με κάτι σαν ip route get <address-of-A> sport 500 και επιβεβαιώστε ότι ονομάζει τη διεπαφή WAN και όχι το τούνελ. Μετά από αυτό, ελέγξτε ότι κάτι πίσω από τον C εξακολουθεί να απαντά μέσα από την αλυσίδα, που αποδεικνύει ότι η εξαίρεση έμεινε στενή αντί να γίνει παράκαμψη. Τέλος, καταγράψτε τις θύρες στις σημειώσεις σχεδιασμού, αλλιώς ο επόμενος χειριστής θα το ανακαλύψει σε άλλη υπηρεσία.

Σχετικά άρθρα