Το «File exists» του OpenVPN σε μια διαδρομή δεν είναι πρόβλημα αρχείου
Το μήνυμα προέρχεται από τον πίνακα δρομολόγησης του πυρήνα, όχι από το σύστημα αρχείων. Διαβάστε την καταχώριση που κατέχει ήδη το πρόθεμα πριν αλλάξετε την πολιτική LAN.
Ξεκινήστε εκεί όπου εμφανίζεται το μήνυμα. Ένας πελάτης συνδέεται, η σήραγγα ανεβαίνει και μετά το αρχείο καταγραφής αναφέρει ότι η εντολή προσθήκης διαδρομής του Linux απέτυχε με File exists. Τίποτα σε αυτή την πρόταση δεν αναφέρεται σε πιστοποιητικό, κλειδί ή αρχείο ρυθμίσεων, αν και οι λέξεις το υπονοούν. Ο πυρήνας περιγράφει τον πίνακα δρομολόγησής του και το πρόθεμα που ζητήσατε να εγκατασταθεί έχει ήδη καταχώριση.
Ακολουθήστε την αλληλουχία του ίδιου του πελάτη: τι ζήτησε, τι περιείχε ήδη ο πίνακας, ποιος έβαλε εκείνη την καταχώριση εκεί και μόνο τότε τι πρέπει να αλλάξει. Κάθε βήμα αφαιρεί έναν πιθανό κάτοχο.
Τι ζητούσε στην πραγματικότητα ο πελάτης
Πριν από την αποτυχία, ο πελάτης καταγράφει τη διαδρομή που σκοπεύει να προσθέσει, συνήθως ως προορισμό, μάσκα δικτύου, πύλη και μερικές φορές ως μετρική ή πίνακα. Αυτή η γραμμή είναι το αίτημα. Το σφάλμα που ακολουθεί είναι η απάντηση του πυρήνα, και τα δύο πρέπει να διαβάζονται δίπλα-δίπλα.
journalctl -u openvpn-client@office -b --no-pager | grep -nE 'route|File exists'
openvpn --config /etc/openvpn/client/office.ovpn --verb 4 --log /tmp/ovpn.log
Μια κατάσταση εξόδου μη μηδενική από τον βοηθό διαδρομών είναι λιγότερο κατατοπιστική από το κείμενο που βρίσκεται από κάτω, επειδή διαφορετικές απαντήσεις του πυρήνα παράγουν μη μηδενική κατάσταση. Κρατήστε το ακριβές μήνυμα· η διάκριση ανάμεσα σε υπάρχουσα καταχώριση και μη προσβάσιμη πύλη καθορίζει ποια από τις επόμενες ενότητες ισχύει.
Διαβάστε την υπάρχουσα διαδρομή, όχι μόνο τη διεύθυνση
Η αναζήτηση στον πίνακα για το ίδιο τετραπλό με τελείες δεν αρκεί. Ένα αντικείμενο διαδρομής προσδιορίζεται από την οικογένεια διευθύνσεων, τον πίνακα, το πρόθεμα προορισμού, τη μετρική, το πρωτόκολλο και τη συσκευή εξόδου, και οι καταχωρίσεις που μοιράζονται ένα πρόθεμα μπορούν νόμιμα να συνυπάρχουν όταν αυτά τα χαρακτηριστικά διαφέρουν. Αυτό που συγκρούεται είναι ολόκληρο το αντικείμενο, όχι το κείμενο.
ip -4 route show table all | grep -F '10.40.'
ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5
Η τελευταία εντολή απαντά σε διαφορετικό ερώτημα από τις δύο πρώτες: όχι τι υπάρχει, αλλά ποια καταχώριση θα διάλεγε ο πυρήνας για αυτόν τον προορισμό τώρα. Και οι δύο όψεις είναι χρήσιμες, και διαφωνούν αρκετά συχνά ώστε να αξίζει η σύγκριση πριν καταλήξετε σε κάτι. Η ασυμφωνία μεταξύ τους είναι η ενδιαφέρουσα περίπτωση, όχι σφάλμα στρογγυλοποίησης.
Σημειώστε το πρόθεμα, τον πίνακα, τη μετρική και τη συσκευή δίπλα στο αποτυχημένο αίτημα. Αν η υπάρχουσα καταχώριση έχει τα ίδια χαρακτηριστικά και το ίδιο επόμενο άλμα, έχετε διπλή οδηγία και όχι πρόβλημα δρομολόγησης.
Τέσσερις κάτοχοι που μπορεί να έχει ένα πρόθεμα
Οι συνδεδεμένες διαδρομές προέρχονται από μια εκχωρημένη διεύθυνση και το σύστημα τις επαναδημιουργεί όποτε υπάρχει αυτή η διεύθυνση. Ένας πελάτης DHCP ή ένας διαχειριστής συνδέσεων εγκαθιστά διαδρομές ως μέρος του δικού του κύκλου ζωής. Ένας άλλος πελάτης VPN μπορεί να μεταφέρει ήδη το ίδιο πρόθεμα. Και ένα τοπικό hook ή script μπορεί να προσθέσει μία που τίποτα άλλο δεν γνωρίζει.
Κάθε κάτοχος χρειάζεται διαφορετική διόρθωση. Μια συνδεδεμένη διαδρομή δεν είναι δική σας για διαγραφή· η αφαίρεσή της μπορεί να κόψει την τοπική πρόσβαση πριν η σήραγγα γίνει χρηστική, και ο πυρήνας θα την επαναφέρει. Μια διαδρομή που ανήκει σε διαχειριστή πρέπει να αλλάζει μέσω αυτού του διαχειριστή, όχι με χειροκίνητο ip route del που η επόμενη επανασύνδεση ακυρώνει.
Μια διατηρούμενη διεπαφή κάνει την ίδια σύγχυση ευκολότερη. Όταν η συσκευή σήραγγας επιβιώνει από μια επανασύνδεση, οι διαδρομές που εγκαταστάθηκαν από προσαρμοσμένο κώδικα ρύθμισης μπορεί να υπάρχουν ακόμη στη δεύτερη εκτέλεση, ώστε ένα script που υποθέτει καθαρή κατάσταση να αποτυγχάνει τη δεύτερη φορά και να λειτουργεί την πρώτη. Είτε καθαρίστε σκόπιμα την παλιά καταχώριση είτε κάντε τον κώδικα ρύθμισης idempotent.
Το block-local απαντά σε διαφορετικό ερώτημα
Όταν ένα προφίλ στέλνει όλη την κίνηση μέσα από τη σήραγγα, ο πελάτης πρέπει να αποφασίσει τι συμβαίνει με το τοπικό δίκτυο. Η σημαία block-local αλλάζει αυτή την απόφαση δρομολογώντας το τοπικό LAN μέσα από τη σήραγγα, διατηρώντας την τεκμηριωμένη εξαίρεση για την πύλη του LAN· πρόκειται για επιλογή πολιτικής κίνησης με ορατές συνέπειες στην προσβασιμότητα.
Δεν εξηγεί γιατί η προσθήκη διαδρομής επέστρεψε σφάλμα υπάρχουσας καταχώρισης, και η υιοθέτησή της ως καθολικής επισκευής κρύβει την πραγματική σύγκρουση πίσω από μια αλλαγή πολιτικής. Αν οι τοπικοί σας πόροι γίνουν μη προσβάσιμοι μετά από επεξεργασία προφίλ, αυτή η σημαία είναι από τα πρώτα πράγματα που πρέπει να ελέγξετε· αν η προσθήκη διαδρομής αποτυγχάνει, δεν είναι η απάντηση.
Αντιμετωπίστε την ως απόφαση για το ποιοι προορισμοί παραμένουν τοπικοί, παρμένη συνειδητά και καταγεγραμμένη. Δεν είναι διακόπτης για δοκιμή όταν το αρχείο καταγραφής φαίνεται ανησυχητικό.
Κλείστε τον κύκλο: αφαιρέστε το διπλό στην πηγή του
Μόλις μάθετε ποιος κάτοχος κρατά την καταχώριση, αφαιρέστε τη διπλή οδηγία εκεί όπου ορίζεται. Μπορεί να είναι μια γραμμή route στο προφίλ, ένα push από τον διακομιστή ή ένα hook που δεν χρειάζεται πια να εκτελείται.
ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5
journalctl -u openvpn-client@office -b --no-pager | tail -n 15
Στη συνέχεια επανασυνδεθείτε και επιβεβαιώστε τρία πράγματα: η σήραγγα ανεβαίνει, ο επιδιωκόμενος προορισμός επιλύεται στη διαδρομή που θέλατε, και η αποτυχία εξαφανίζεται χωρίς να εμφανιστεί νέα στη θέση της. Ένα καθαρό αρχείο καταγραφής με λάθος επιλεγμένη διαδρομή δεν είναι διόρθωση.
Αν το πρόθεμα σημαίνει το τοπικό LAN από τη μία πλευρά και ένα απομακρυσμένο δίκτυο από την άλλη, το πρόβλημα είναι επικάλυψη διευθύνσεων και όχι διπλό, και καμία διαγραφή δεν θα κάνει και τις δύο σημασίες αληθινές ταυτόχρονα. Αυτή η περίπτωση χρειάζεται διαφορετικό σχέδιο για ένα από τα δύο δίκτυα. Αποφασίστε ποια πλευρά θα επαναριθμηθεί πριν αγγίξετε οποιαδήποτε από τις δύο.