Μονόδρομη κίνηση μετά την απενεργοποίηση του SNAT υποδικτύου Tailscale
Απενεργοποιήστε το SNAT σε έναν δρομολογητή υποδικτύου του Tailscale και οι απαντήσεις σταματούν να φτάνουν. Η πραγματική διεύθυνση προέλευσης παραμένει, οπότε το LAN χρειάζεται διαδρομή επιστροφής προς το 100.64.0.0/10.
Απενεργοποιήστε το NAT προέλευσης σε έναν δρομολογητή υποδικτύου του Tailscale και η σήραγγα συνεχίζει να λειτουργεί ενώ οι συνδέσεις μέσω αυτής σταματούν. Τα αιτήματα φτάνουν στον προορισμό με τη δική του διεύθυνση overlay του απομακρυσμένου πελάτη, που είναι ακριβώς το νόημα της αλλαγής, και οι απαντήσεις χρειάζονται τώρα μια διαδρομή που το LAN δεν έπρεπε ποτέ να γνωρίζει. Χωρίς αυτή τη διαδρομή τα πακέτα προσγειώνονται, οι απαντήσεις φεύγουν από την συνηθισμένη πύλη και η βλάβη εμφανίζεται ως πρόβλημα τείχους προστασίας που κανένας κανόνας δεν εξηγεί. Η σήραγγα είναι υγιής, αλλά το σκέλος επιστροφής λείπει.
Τι έκρυβε το SNAT
Με ενεργό το SNAT, ο δρομολογητής ξαναγράφει τη διεύθυνση προέλευσης στη δική του διεύθυνση LAN πριν την προώθηση στο υποδίκτυο, ώστε ο προορισμός να απαντά σε έναν κεντρικό υπολογιστή που ξέρει ήδη πώς να φτάσει και τίποτα άλλο δεν χρειάζεται ρύθμιση. Η απενεργοποίηση διατηρεί την αρχική προέλευση και ο προορισμός βλέπει τότε μια διεύθυνση εντός του εύρους overlay και όχι έναν γείτονα στο δικό του καλώδιο. Αυτή η διεύθυνση είναι πραγματική και δρομολογήσιμη σε όλο το tailnet, αλλά είναι απρόσιτη από το LAN μέσω της προεπιλεγμένης πύλης. Ο τεκμηριωμένος διακόπτης είναι --snat-subnet-routes=false, εφαρμοσμένος στον ίδιο τον δρομολογητή υποδικτύου Linux.
Είναι μόνιμη ρύθμιση και όχι διακόπτης ανά πακέτο, οπότε η διαδρομή επιστροφής πρέπει να υπάρχει για κάθε δίκτυο προορισμού που εξυπηρετεί αυτός ο δρομολογητής. Αυτό κάνει την αλλαγή απόφαση ανάπτυξης και όχι πλαίσιο επιλογής. Ό,τι εξυπηρετεί αυτός ο δρομολογητής κληρονομεί την απαίτηση την ίδια στιγμή.
Πού μπορεί να βρίσκεται η διαδρομή επιστροφής
Τρεις τοποθετήσεις είναι συνήθεις και διαφέρουν σε εμβέλεια, όχι σε ορθότητα. Μια στατική διαδρομή στον κεντρικό υπολογιστή προορισμού είναι η πιο άμεση και η λιγότερο κλιμακώσιμη, αφού κάθε συσκευή χρειάζεται το δικό της αντίγραφο. Ένας πίνακας δρομολόγησης στο VPC ή στον δρομολογητή της τοποθεσίας καλύπτει ολόκληρο δίκτυο μεμιάς, και μια επιλογή DHCP που μεταφέρει στατικές διαδρομές χωρίς κλάσεις φτάνει αυτόματα στους πελάτες αλλά αποτυγχάνει σιωπηλά σε συσκευές που την αγνοούν.
ip route add 100.64.0.0/10 via 192.168.1.10
ip route get 100.64.0.5
Όποια τοποθέτηση κι αν επιλέξετε, το επόμενο άλμα είναι η διεύθυνση LAN του δρομολογητή και ποτέ η διεύθυνσή του στο tailnet. Ένας κεντρικός υπολογιστής του LAN δεν μπορεί να φτάσει το overlay πριν αποκτήσει αυτή τη διαδρομή, οπότε ένα επόμενο άλμα μέσα στο overlay είναι κυκλικό και δεν στέλνει το πακέτο πουθενά. Αυτό το μόνο λάθος εξηγεί τις περισσότερες ρυθμίσεις που φαίνονται σωστές και αποτυγχάνουν παρόλα αυτά, και επιβιώνει από κάθε έλεγχο που διαβάζει μόνο τον πίνακα του ίδιου του δρομολογητή. Σημειώστε ποια τοποθέτηση χρησιμοποιήσατε, γιατί αλλιώς ο επόμενος άνθρωπος θα δοκιμάσει τη λάθος.
Διαβάζοντας τη βλάβη ως μονόδρομη κίνηση
Το σύμπτωμα αναγνωρίζεται ευκολότερα από την αιτία: η υπηρεσία απαντά στον ίδιο τον δρομολογητή και μένει σιωπηλή από έναν απομακρυσμένο πελάτη. Μια καταγραφή στον προορισμό δείχνει αιτήματα να φτάνουν και απαντήσεις να φεύγουν, που μοιάζει με επιτυχία ώσπου να προσέξετε πού κατευθύνονται αυτές οι απαντήσεις. Πηγαίνουν προς την προεπιλεγμένη πύλη, που σημαίνει ότι το εισερχόμενο σκέλος λειτούργησε και το σκέλος επιστροφής όχι.
Καταγράψτε αντίθετα στον δρομολογητή, γιατί βλέπει και τις δύο κατευθύνσεις μιας ανταλλαγής και δείχνει αν έφτασε ποτέ απάντηση. Αν η απάντηση εμφανίζεται στον προορισμό αλλά ποτέ στον δρομολογητή, η διαδρομή λείπει ή είναι λάθος στην πλευρά του προορισμού. Αν εμφανίζεται στον δρομολογητή και σταματά εκεί, το πρόβλημα βρίσκεται πιο πέρα και ανήκει σε άλλη έρευνα.
sudo tcpdump -ni any host 100.64.0.5
ip route get 100.64.0.5
Αξίζει η πραγματική διεύθυνση μια διαδρομή
Η διατήρηση του SNAT παραμένει η απλούστερη απάντηση όταν το δίκτυο προορισμού δεν μπορεί να διαμορφωθεί εκ νέου, και το κόστος είναι ότι κάθε πελάτης μοιάζει με τον δρομολογητή στα αρχεία και την πολιτική του προορισμού. Η απενεργοποίηση δικαιολογείται όταν μια εφαρμογή χρειάζεται την πραγματική διεύθυνση προέλευσης ή όταν η πολιτική δικτύου πρέπει να ξεχωρίζει πελάτες που μοιράζονται δρομολογητή. Και οι δύο λόγοι είναι νόμιμοι και κανένας δεν είναι δωρεάν. Το όφελος πρέπει να αξίζει τη συντήρηση διαδρομής σε κάθε δίκτυο προορισμού, μαζί με την αναθεώρηση του τείχους προστασίας που περιγράφεται παρακάτω.
Για ένα μικρό LAN η ανταλλαγή συνήθως αποδίδει, ενώ για μια πληθώρα συσκευών που δεν μπορούν να δεχτούν στατική διαδρομή συνήθως δεν αποδίδει. Καταγράψτε την απόφαση και τον λόγο δίπλα στη διαμόρφωση του δρομολογητή, ώστε ο επόμενος διαχειριστής να ξέρει ποια συμπεριφορά είναι σκόπιμη. Μια προεπιλογή που δεν έγραψε κανείς δεν ξεχωρίζει από μια παράλειψη.
Τείχος προστασίας, καταγραφή και ο διπλός ρόλος
Κάθε κανόνας που ταίριαζε με τη διεύθυνση LAN του δρομολογητή ταιριάζει τώρα με διαφορετική προέλευση, και αυτό περιλαμβάνει κανόνες αποδοχής και κάθε πεδίο καταγραφής που κατέγραφε τον δρομολογητή ως πελάτη. Διαβάστε αυτούς τους κανόνες πριν από την πρώτη δοκιμή και όχι μετά την πρώτη αποτυχία, γιατί ένας κανόνας που επιτρέπει μόνο τη διεύθυνση του δρομολογητή μπλοκάρει εντελώς τη νέα προέλευση. Περιορίστε την αντικατάσταση στους πελάτες και τις θύρες που τη χρειάζονται και μετά επιβεβαιώστε ότι δεν επιτρέπει σιωπηλά ολόκληρο το tailnet.
sudo nft list ruleset | grep -n '100\.64'
sudo iptables-save | grep -n '100\.64'
Ένας κόμβος που χρησιμεύει ταυτόχρονα ως κόμβος εξόδου και ως δρομολογητής υποδικτύου είναι ένας τεκμηριωμένος συνδυασμός που μπορεί να ρίχνει την ανερχόμενη κίνηση μόλις απενεργοποιηθεί το SNAT υποδικτύου. Ο διαχωρισμός αυτών των ρόλων σε διαφορετικούς κόμβους αφαιρεί την επιφύλαξη και δίνει σε κάθε διαδρομή και πολιτική τείχους προστασίας έναν μόνο ιδιοκτήτη. Αν οι ρόλοι πρέπει να μείνουν μαζί, να περιμένετε αυτή τη συμπεριφορά και να τη δοκιμάσετε πριν κατηγορήσετε έναν πελάτη. Κρατήστε τη διαδρομή, τη ρύθμιση του διακόπτη και την ανάθεση ρόλων σε ένα σημείωμα, γιατί διαβάζονται μαζί όταν αποτύχει η επόμενη σύνδεση.