Τι πραγματικά σταματά το route-nopull του OpenVPN να σπρώχνει ο διακομιστής
Το route-nopull αφαιρεί δρομολογήσεις και επιλογές DHCP που σπρώχνονται, όχι τη χειραψία. Διαλέξτε ανάμεσα σε αυτό, το pull-filter ή τίποτα, και μετά προσθέστε τις δρομολογήσεις μόνοι σας.
Έβαλες το route-nopull σε ένα προφίλ πελάτη για να σταματήσεις το τούνελ να καταπίνει την προεπιλεγμένη διαδρομή σου, και τώρα το υποδίκτυο του γραφείου είναι απρόσιτο ενώ ο πελάτης λέει ακόμη ότι είναι συνδεδεμένος. Και οι δύο παρατηρήσεις είναι αληθινές, και τίποτα δεν απέτυχε. Η σημαία λέει στον πελάτη να παραλείψει τις διαδρομές και τις εγγραφές DHCP που σπρώχνει ο διακομιστής, μια στενότερη οδηγία από ό,τι περιμένουν οι περισσότεροι όταν την προσθέτουν. Αυτό που μένει είναι ένα λειτουργικό τούνελ χωρίς άποψη για το ποιοι προορισμοί πρέπει να το χρησιμοποιούν.
Αυτό το κενό είναι ολόκληρη η απόφαση για την οποία μιλά αυτό το άρθρο. Είτε ο διακομιστής περιγράφει το δίκτυο, είτε το κάνει ο πελάτης, και η σημαία παραδίδει αυτή τη δουλειά στον πελάτη χωρίς να κάνει τίποτα από αυτή για σένα.
Τι σβήνει η σημαία τη στιγμή της σύνδεσης
Ένας πελάτης OpenVPN που τραβά παίρνει συνήθως από τον διακομιστή μετά την ταυτοποίηση ένα πακέτο: διαδρομές, ανακατεύθυνση της προεπιλεγμένης πύλης, διακομιστές DNS και μερικές οδηγίες συντονισμού. Με το route-nopull σε ισχύ ο πελάτης εξακολουθεί να δέχεται τη συνεδρία, εξακολουθεί να επαληθεύει πιστοποιητικά, εξακολουθεί να διαπραγματεύεται κρυπτογραφικά και keepalive, και εξακολουθεί να ανεβάζει τη διεπαφή. Αυτό που πετά είναι η εφαρμογή των γραμμών route που σπρώχνονται και των γραμμών dhcp-option που σπρώχνονται, μαζί με το DNS.
Η σύγχυση προέρχεται από μια πράσινη ένδειξη δίπλα σε μια νεκρή εφαρμογή. Το τούνελ υπάρχει· η αντιστοίχιση των προορισμών σε αυτό το τούνελ δεν υπάρχει. Τίποτα στον πίνακα κατάστασης του πελάτη δεν ξεχωρίζει το «συνδεδεμένος και δρομολογεί» από το «συνδεδεμένος και αδρανής», γιατί και τα δύο είναι η ίδια κατάσταση από την πλευρά του τούνελ.
Γιατί ένα ζωντανό τούνελ μπορεί να μη δρομολογεί τίποτα
Η διεπαφή εμφανίζεται με τη δική της διεύθυνση και, σε σύνδεση σημείου προς σημείο, συχνά δεν έχει τίποτα πιο συγκεκριμένο από μια διαδρομή κεντρικού υπολογιστή προς τον ομότιμο. Ένα ιδιωτικό υποδίκτυο γίνεται προσβάσιμο μόνο όταν κάποια διαδρομή δείχνει σε αυτή τη διεπαφή με το σωστό πρόθεμα, και με το σπρώξιμο απενεργοποιημένο αυτή η διαδρομή δεν φτάνει ποτέ. Ούτε το κατεβασμένο προφίλ μπορεί συνήθως να βοηθήσει, γιατί γράφτηκε με την παραδοχή ότι ο διακομιστής θα παρείχε ακριβώς αυτή την πληροφορία. Γι’ αυτό η διεπαφή μπορεί να φαίνεται υγιής ενώ το υποδίκτυο μένει σκοτεινό.
Το να διαβάσεις το προφίλ αποδεικνύει λοιπόν πολύ λίγα. Διάβασε την τρέχουσα κατάσταση, στο συνδεδεμένο μηχάνημα:
ip addr show tun0
ip route show dev tun0
ip route get 10.20.5.10
Μια διεύθυνση χωρίς διαδρομή υποδικτύου στη δεύτερη εντολή είναι η υπογραφή αυτού του προβλήματος. Η τρίτη εντολή απαντά τότε στην ερώτηση που πραγματικά νοιάζει τους χρήστες, γιατί αναφέρει τη διεπαφή που θα διάλεγε ο πυρήνας για έναν συγκεκριμένο προορισμό αντί για τη λίστα που ήλπιζες ότι θα χρησιμοποιήσει. Αν απαντά μέσω της φυσικής σύνδεσης, το τούνελ δεν είναι καθόλου στη διαδρομή.
Η επίλυση ονομάτων αποτυγχάνει για σχετικό λόγο, όχι για ξεχωριστό. Οι εγγραφές dhcp-option DNS που σπρώχνονται παραλείπονται από την ίδια σημαία, οπότε τα ερωτήματα για εσωτερικούς υπολογιστές πάνε στον διαλυτή που παρείχε το τοπικό δίκτυο. Αυτός ο διαλυτής δεν έχει ζώνη για το γραφείο, οπότε το ερώτημα αποτυγχάνει ή επιστρέφει δημόσια απάντηση, και η αποτυχία μοιάζει με πρόβλημα διακομιστή ενώ είναι πρόβλημα ρύθμισης του πελάτη. Το να δοκιμάσεις μια διεύθυνση πριν από ένα όνομα είναι αυτό που ξεχωρίζει τα δύο.
Η επιλογή ανάμεσα στη σημαία και σε φίλτρο προθέματος
Οι δύο επιλογές λύνουν διαφορετικές μορφές του ίδιου παραπόνου, και η κακή επιλογή είναι αυτή που παράγει την κατάσταση συνδεδεμένος-αλλά-άχρηστος. Η μία αντικαθιστά την πολιτική που σπρώχνεται συνολικά, ενώ η άλλη τη διορθώνει κατά πρόθεμα. Ο πίνακας δίνει τη σύντομη εκδοχή, και η παράγραφος μετά από αυτόν καλύπτει το κομμάτι που πιάνει τους ανθρώπους.
| Setting | What the client keeps | Reasonable when |
|---|---|---|
| no option | every pushed route and DHCP entry | the server's view of the network is correct |
route-nopull | the session, none of the pushed routing or DNS | you will write the full local policy yourself |
pull-filter | everything except lines matching your prefixes | the push is nearly right and one or two lines are wrong |
Το pull-filter είναι αντιστοιχιστής προθεμάτων με τρία ρήματα, οπότε μπορεί να δεχτεί μια οικογένεια γραμμών, να τις αγνοήσει σιωπηλά ή να απορρίψει τη σύνδεση εντελώς όταν εμφανιστεί ένα πρόθεμα. Η τελευταία συμπεριφορά είναι αυτή που αξίζει να ξέρεις: ένας κανόνας απόρριψης μετατρέπει μια διαφωνία πολιτικής σε αποτυχημένη χειραψία αντί για σιωπηλή παράλειψη. Το εγχειρίδιο του OpenVPN 2.6 απαριθμεί τα αποδεκτά προθέματα και την ακριβή σημασιολογία κάθε ρήματος.
Ένας συνηθισμένος μέσος δρόμος είναι να απορρίψεις μόνο το redirect-gateway και να αφήσεις τις διαδρομές του γραφείου και το DNS να φτάσουν όπως προβλέπεται. Αυτό κρατά το σπρώξιμο λειτουργικό για τα μέρη που ο διακομιστής καταλαβαίνει καλύτερα από σένα, ενώ εμποδίζει τη μία γραμμή που θα έπαιρνε την προεπιλεγμένη διαδρομή σου.
Προσθήκη διαδρομών και διαλυτή με το χέρι
Αν κρατήσεις τη σημαία, το προφίλ πρέπει να πει αυτό που θα έλεγε ο διακομιστής. Οι οδηγίες route στην πλευρά του πελάτη εφαρμόζονται αφού εδραιωθεί η σύνδεση, οπότε λειτουργούν μαζί με τη σημαία αντί να μπλοκάρονται από αυτή. Βάλ’ τες στο προφίλ, όχι σε διαδραστική γραμμή εντολών, αλλιώς η επόμενη επανασύνδεση δεν θα αναπαράγει τη λειτουργική κατάσταση.
route-nopull
route 10.20.0.0 255.255.0.0
dhcp-option DNS 10.20.0.53
Η γραμμή DNS βρίσκεται σε άβολη θέση: είναι οδηγία στην πλευρά του πελάτη, αλλά μερικοί πελάτες την εφαρμόζουν μόνο μέσω της ενσωμάτωσης DNS της πλατφόρμας, που μπορεί να την αντικαταστήσει όταν αλλάξει η σύνδεση. Σε σύστημα με systemd, το να ορίσεις τον διαλυτή απευθείας στη διεπαφή του τούνελ είναι πιο προβλέψιμο από το να ελπίζεις ότι ο πελάτης θα κερδίσει τον διαγωνισμό προτεραιότητας:
resolvectl dns tun0 10.20.0.53
resolvectl domain tun0 ~corp.example.com
Ο τομέας δρομολόγησης έχει τόση σημασία όση η διεύθυνση. Χωρίς αυτόν, τα ερωτήματα για δημόσια ονόματα μπορεί να στέλνονται και στον εσωτερικό διαλυτή, και κάθε εσωτερικός διαλυτής που αρνείται την αναδρομή θα χαλάσει την περιήγηση αφήνοντας τη ζώνη να δουλεύει. Με αυτόν, μόνο ονόματα κάτω από αυτό το επίθεμα δρομολογούνται στον διαλυτή του τούνελ και όλα τα άλλα ακολουθούν τη φυσική σύνδεση.
Έλεγχος του αποτελέσματος: διεύθυνση, όνομα και η εξωτερική διαδρομή
Τρεις δοκιμές ξεχωρίζουν τις πιθανές αστοχίες. Πάρε την ιδιωτική διεύθυνση με IP, μετά τον ίδιο υπολογιστή με όνομα, μετά έναν συνηθισμένο δημόσιο ιστότοπο. IP που δουλεύει με όνομα που αποτυγχάνει δείχνει τον διαλυτή· IP που αποτυγχάνει με όνομα που δουλεύει δείχνει τη δρομολόγηση· αν αποτύχουν και τα δύο, συνήθως το τούνελ δεν είναι στη διαδρομή.
Μετά κοίτα προς τα έξω και όχι προς τα μέσα. Η δική του διαδρομή του τελικού σημείου του τούνελ πρέπει να επιβιώσει της αλλαγής, και οποιοδήποτε μπλοκάρισμα πρέπει να περιορίζεται στο τούνελ χωρίς να πιάνει το τελικό σημείο. Ένας πελάτης που συνεχίζει να περιηγείται αφού πέσει το τούνελ είναι πρόβλημα πολιτικής, όχι δρομολόγησης, και δεν θα εμφανιστεί σε καμία από τις τρεις δοκιμές παραπάνω.
Γράψε την τελική λίστα στην τεκμηρίωση του προφίλ: τις διαδρομές, τον διαλυτή, τους τομείς και τον λόγο ύπαρξης του καθενός. Μια επανασύνδεση που αναπαράγει τον ίδιο πίνακα είναι η μόνη απόδειξη ότι η τοπική πολιτική είναι πλήρης. Αν οι εφαρμογές εξακολουθούν να αποτυγχάνουν με το τούνελ σηκωμένο και τις τρεις δοκιμές περασμένες, το επόμενο σημείο να κοιτάξεις είναι η κατηγορία προβλημάτων συνδεδεμένος-αλλά-offline και όχι πιστοποιητικά που έχουν ήδη επαληθευτεί.