Προσθέτετε μία γραμμή για να κρατήσετε την τοπική προεπιλεγμένη διαδρομή σας, και μετά το τούνελ δεν φτάνει πλέον στον εσωτερικό διακομιστή DNS. Η γραμμή ήταν pull-filter ignore "route", που δεν σημαίνει "αγνόησε αυτή τη διαδρομή". Σημαίνει "πέτα κάθε προωθημένη επιλογή της οποίας το κείμενο αρχίζει με αυτά τα πέντε γράμματα", και σε έναν κανονικό διακομιστή αυτό περιλαμβάνει τα route-gateway, route-metric και route-ipv6 μαζί με τις ίδιες τις διαδρομές. Η λίστα ελέγχου παρακάτω είναι αυτό που τρέχω πριν αγγίξω ένα προφίλ που πρέπει να χρησιμοποιήσει κάποιος άλλος.

Το φίλτρο ισχύει μόνο για τις προωθημένες επιλογές

Το pull-filter ενεργεί στις γραμμές επιλογών που στέλνει ο διακομιστής αφού εδραιωθεί το τούνελ, και σε τίποτα άλλο. Οι επιλογές που είναι γραμμένες στο τοπικό σας αρχείο δεν επηρεάζονται από αυτό, ούτε η κίνηση εφαρμογών. Αν ελπίζατε να εμποδίσετε μια διεργασία να χρησιμοποιεί το τούνελ, αυτό είναι εντελώς λάθος εργαλείο και κανένας συνδυασμός φίλτρων δεν θα το κάνει.

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

Επιβεβαιώστε τι στέλνει πραγματικά ο διακομιστής πριν γράψετε το μοτίβο. Σε υψηλή λεπτομέρεια ο πελάτης εκτυπώνει τη συμβολοσειρά προωθημένων επιλογών που έλαβε, και αυτή είναι η μόνη έντιμη πηγή για το ακριβές κείμενο με το οποίο συγκρίνετε:

sudo openvpn --config /etc/openvpn/corp.ovpn --verb 4
sudo grep -n 'pull-filter' /etc/openvpn/corp.ovpn

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

Η αντιστοίχιση είναι πρόθεμα, άρα τα κενά είναι όλο το παιχνίδι

Η σύγκριση είναι πρόθεμα συμβολοσειράς, όχι αναλυμένο όνομα επιλογής. Επομένως το "route" αντιστοιχεί στα route-gateway 10.8.0.1, route-ipv6 2001:db8::/32 και route-metric 100. Ένα κενό στο τέλος το περιορίζει στην οικογένεια που πιθανώς εννοούσατε, και το πλήρες πρόθεμα το περιορίζει περαιτέρω σε συγκεκριμένο προορισμό.

Filter textWhat it actually matchesTypical outcome
"route"Every option beginning with those lettersRoutes, gateway, metric and IPv6 routes all dropped
"route "Route entries only, not the hyphenated siblingsThe routes go, the rest survives
"route 10.60."A single destination rangeThe narrowest rule, and the easiest to audit
"dhcp-option DNS"Pushed DNS settingsResolver stays local, internal names stop resolving

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

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

Τρία ρήματα με τρία διαφορετικά αποτελέσματα

Τα accept, ignore και reject δεν είναι τρεις ορθογραφίες της ίδιας ιδέας. Διαφέρουν στο τι κάνει ο πελάτης με μια αντιστοίχιση και στο αν το μαθαίνει κανείς.

Το ignore πετά σιωπηλά την επιλογή που ταιριάζει, που είναι αυτό που θέλετε για ρύθμιση που έχετε αντικαταστήσει σκόπιμα. Το reject την πετά και κάνει τον πελάτη να διαμαρτυρηθεί, που είναι αυτό που θέλετε όταν η απουσία της πρέπει να φαίνεται σε αρχείο καταγραφής αντί να ανακαλύπτεται αργότερα. Το accept είναι η θετική μορφή, χρησιμοποιείται όταν χτίζετε λίστα επιτρεπόμενων αντί να αφαιρείτε μεμονωμένες επιλογές.

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

Ελέγξτε την εφαρμοσμένη διαδρομή και τον resolver, όχι το προφίλ

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

ip route show default
ip route show | grep -c 'proto static'
resolvectl status | grep -A4 'Link.*tun0'
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 https://intranet.example.internal/

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

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

Καταγράψτε την εξαίρεση και ποιος την κατέχει

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

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

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

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