Πώς οι κανόνες τομέα του Apple VPN On Demand ενεργοποιούν μια σήραγγα
Ένας κανόνας τομέα αποφασίζει μόνο πότε ανοίγει η σήραγγα. Πώς λειτουργεί ο έλεγχος DNS connect-if-needed, γιατί οι διαδρομές εξακολουθούν να επιλέγουν κίνηση και πώς να δοκιμάσετε το προφίλ.
Η σήραγγα ανοίγει όταν ζητάτε ένα εσωτερικό όνομα και μένει κλειστή όταν η επόμενη εφαρμογή το χρειάζεται εξίσου. Αυτό δεν είναι σφάλμα της εφαρμογής· είναι η μορφή ενός κανόνα τομέα. Η διαμόρφωση on-demand της Apple περιγράφει συνθήκες για τη δημιουργία σύνδεσης και η μορφή τομέα αυτών των συνθηκών ρωτά τον resolver του συστήματος πριν κινηθεί έστω ένα πακέτο. Δύο ερωτήματα συγχέονται διαρκώς: πότε πρέπει να ανέβει η σήραγγα και τι μεταφέρει μόλις υπάρξει. Το πρώτο είναι έναυσμα, το δεύτερο πολιτική διαδρομών και resolver, και ένα προφίλ συνήθως ορίζει και τα δύο στο ίδιο payload, γι' αυτό ένας σωστός κανόνας τομέα μπορεί να σας αφήσει στο λάθος δίκτυο.
Το έναυσμα και η επιλογή κίνησης βρίσκονται σε διαφορετικά επίπεδα
Ένας κανόνας on-demand ζει στο λεξικό on-demand ενός payload VPN: μια διατεταγμένη λίστα κανόνων, ο καθένας με μια ενέργεια και ένα σύνολο συνθηκών αντιστοίχισης. Το σύστημα τους αξιολογεί όταν αλλάζει η συνδεσιμότητα ή όταν κάτι προσπαθεί να φτάσει στο δίκτυο, και η ενέργεια αποφασίζει αν η σήραγγα ανεβαίνει, αξιολογείται, αποσυνδέεται ή αγνοείται. Όλα αυτά συμβαίνουν στο επίπεδο δικτύωσης της πλατφόρμας, πριν η εφαρμογή σας αποκτήσει socket.
Αυτό που ακολουθεί είναι μια ξεχωριστή ομάδα κλειδιών: οι ρυθμίσεις IPv4 και IPv6 της σήραγγας, οι συμπεριλαμβανόμενες και εξαιρούμενες διαδρομές της, οι διευθύνσεις διακομιστών DNS και, σε iOS και iPadOS, η αντιστοίχιση ανά εφαρμογή που καθορίζει ποιες εφαρμογές επιτρέπεται να χρησιμοποιούν τη σήραγγα. Ένα προφίλ μπορεί να συνδυάσει ένα ευρύ έναυσμα με στενή διαδρομή ή ένα στενό έναυσμα με προεπιλεγμένη διαδρομή. Διαβάστε μόνο το ένα μισό και το άλλο θα μοιάζει με δυσλειτουργία.
Κρατώ ένα εργαστηριακό προφίλ που συνδέεται όποτε ζητείται οτιδήποτε κάτω από έναν εσωτερικό τομέα, αλλά δρομολογεί μόνο ένα /16 στη σήραγγα. Κάνει ακριβώς ό,τι λέει το payload του, και είναι επίσης ο τύπος προφίλ που παράγει δελτία: οι άνθρωποι υποθέτουν ότι μια συνδεδεμένη σήραγγα σημαίνει ότι η κίνησή τους είναι μέσα της.
Τι ρωτά πραγματικά ένας κανόνας τομέα τον resolver
Η μορφή τομέα του κανόνα, που συχνά ονομάζεται connect-if-needed, δεν εξετάζει payload πακέτων ούτε παρακολουθεί URL. Όταν επιλύεται ένα όνομα, το σύστημα το συγκρίνει με τους τομείς του κανόνα και, σε αντιστοίχιση, ρωτά αν το όνομα μπορεί να επιλυθεί μέσω των διακομιστών DNS που παρέχει η σήραγγα. Αν απαντήσει ο resolver της σήραγγας, το όνομα θεωρείται εσωτερικό και η σύνδεση ξεκινά. Αν απαντήσει ο τοπικός resolver, το όνομα θεωρείται εξωτερικό και δεν εμφανίζεται σήραγγα. Η επισκόπηση ανάπτυξης της Apple τα περιγράφει ως ανίχνευση δικτύου και στη συνέχεια αξιολόγηση σύνδεσης.
Δύο συνέπειες προκύπτουν. Το προφίλ πρέπει να ονομάζει διακομιστές DNS μέσα στη σήραγγα· ένας κανόνας τομέα χωρίς resolver σήραγγας δεν έχει τι να συγκρίνει, οπότε η αξιολόγηση δεν μπορεί να δώσει την αντιστοίχιση που περιμένετε. Και η αναζήτηση πρέπει να φτάσει στον resolver του συστήματος. Μια εφαρμογή ή πρόγραμμα περιήγησης που τρέχει το δικό του κρυπτογραφημένο DNS, μια επέκταση που απαντά τοπικά ή μια σύνδεση σε κυριολεκτική διεύθυνση δεν παράγουν ποτέ την επίλυση ονόματος που περίμενε ο κανόνας. Ένα από τα μεγαλύτερα απογεύματα που έχω περάσει τελείωσε όταν ανακάλυψα ότι ο πελάτης μπροστά από τη σήραγγα χρησιμοποιούσε DNS over HTTPS.
Η προσωρινή μνήμη αφαιρεί επίσης το έναυσμα. Ένα όνομα που είναι ήδη στην προσωρινή μνήμη μπορεί να απαντηθεί χωρίς τον έλεγχο που θα ξεκινούσε τη σήραγγα, οπότε ένας κανόνας που δούλευε χθες αποτυγχάνει μετά από επανεκκίνηση ή αφού η σήραγγα είναι πάνω για λίγο. Στο macOS το sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder επαναφέρει την κατάσταση· στο iOS η εναλλαγή λειτουργίας πτήσης ή η επανεκκίνηση της συσκευής σας δίνει ένα συγκρίσιμο καθαρό ξεκίνημα.
Εύρος αντιστοίχισης: ονόματα, εφαρμογές και δίκτυα
Η αντιστοίχιση τομέα είναι ένας τύπος μεταξύ πολλών. Ένας κανόνας μπορεί επίσης να αντιστοιχεί στον τύπο διεπαφής (Wi-Fi, κυψελοειδές, Ethernet) και σε συγκεκριμένο SSID, και οι καταχωρίσεις ανά εφαρμογή ή τομέα Safari δένουν μια σήραγγα με μια ροή εργασίας. Αυτή η δέσμευση εξηγεί την παράξενη εμπειρία όπου μόνο μία εφαρμογή συμπεριφέρεται διαφορετικά από όλες τις άλλες: οι άλλες εφαρμογές είναι εκτός εύρους της σήραγγας, οπότε συνεχίζουν να χρησιμοποιούν την τοπική διαδρομή ακόμη και όταν το εικονίδιο της σήραγγας λέει συνδεδεμένο.
Η σειρά μετράει περισσότερο απ' όσο περιμένουν οι άνθρωποι. Οι κανόνες αξιολογούνται διαδοχικά και ο πρώτος που ταιριάζει παρέχει την ενέργεια, οπότε ένας ευρύς κανόνας σύνδεσης σε οποιοδήποτε Wi-Fi πάνω από έναν στενό κανόνα τομέα θα κερδίσει σιωπηλά και θα κάνει τον κανόνα τομέα μη δοκιμάσιμο. Πριν ξαναγράψετε τη λίστα τομέων, επιβεβαιώστε ότι κανένας προηγούμενος κανόνας δεν ταίριαξε ήδη.
Γι' αυτό το always-on δεν είναι απλώς ένας αυστηρότερος κανόνας on-demand. Η επιβολή always-on είναι ξεχωριστή λειτουργία ανάπτυξης με δικές της απαιτήσεις εποπτείας και διαχείρισης· κρατά μια σήραγγα ανοιχτή αντί να αντιδρά σε ένα όνομα. Αν χρειάζεστε σήραγγα που δεν πέφτει ποτέ, ο κανόνας τομέα είναι το λάθος εργαλείο.
Τρόποι αποτυχίας που μιμούνται σπασμένο κανόνα
Οι περισσότερες αναφορές ότι ένας κανόνας τομέα δεν λειτουργεί καταλήγουν σε ένα από πέντε σημεία, και μόνο το τελευταίο είναι το κείμενο του κανόνα.
| What you see | Layer | First check |
|---|---|---|
| Tunnel comes up, internal site still fails | route or resolver after connect | netstat -rn, scutil --dns |
| Tunnel never comes up for that name | trigger path | fresh lookup, cache flush, private DNS |
| Tunnel comes up for every app | scope, or an earlier rule | rule order, per-app mapping |
| Tunnel drops and will not return on the same Wi-Fi | interface or SSID match, admission | captive portal, SSID string, auth prompt |
| Tunnel returns after you disconnect it | profile ownership | profiles show |
Οι captive πύλες αξίζουν δική τους γραμμή, γιατί το Wi-Fi ξενοδοχείων και αεροδρομίων υποκλέπτει ακριβώς την αναζήτηση από την οποία εξαρτάται ο κανόνας. Μέχρι η πύλη να δεχτεί τη συσκευή, ο διακομιστής DNS της σήραγγας είναι απρόσιτος, ο έλεγχος αποτυγχάνει και η αποτυχία μοιάζει με λάθος γραμμένο τομέα. Η αυθεντικοποίηση είναι η άλλη σιωπηλή περίπτωση: ο κανόνας μπορεί να ενεργοποιηθεί, η σήραγγα να αρχίσει να συνδέεται και η σύνδεση να πεθάνει σε ληγμένο πιστοποιητικό ή σε προτροπή που εμφανίζεται σε άλλη οθόνη.
Το IPv6 δημιουργεί μια παραλλαγή που διαγιγνώσκεται εύκολα λάθος. Ένα όνομα με δύο οικογένειες διευθύνσεων μπορεί να απαντηθεί πρώτα από εγγραφή AAAA, ενώ η λίστα διαδρομών της σήραγγας μεταφέρει μόνο IPv4. Ένα πρόγραμμα περιήγησης πετυχαίνει, άλλο αποτυγχάνει και η λίστα τομέων είναι εντελώς αθώα.
Δοκιμάστε με πραγματικό αίτημα, με αυτή τη σειρά
Διαβάστε την πολιτική πριν μαντέψετε. Στο macOS το sudo profiles show -type configuration εκτυπώνει τα εγκατεστημένα προφίλ μαζί με το payload VPN, το scutil --nc list δείχνει την κατάσταση υπηρεσίας και το scutil --nc show <service> εκτυπώνει το λεξικό on-demand που χρησιμοποιεί το σύστημα. Σε επιτηρούμενο iPhone ή iPad το ίδιο payload έρχεται από την κονσόλα διαχείρισης ή από αναφορά MDM. Τα αρχεία καταγραφής δικτύου είναι διαθέσιμα με το log stream --predicate 'subsystem == "com.apple.networkextension"' στο macOS και μέσω της κονσόλας της συσκευής όταν το τηλέφωνο είναι συνδεδεμένο.
Έπειτα δοκιμάστε με όνομα κεντρικού υπολογιστή που δεν είχε ερωτηθεί νωρίτερα στη συνεδρία. Επιλέξτε ένα όνομα στη ζώνη DNS της σήραγγας που γνωρίζετε ότι επιλύεται εσωτερικά, ζητήστε το μία φορά και παρατηρήστε αν εμφανίζεται η σήραγγα. Εκτελέστε την ίδια αναζήτηση δύο φορές: η δεύτερη προσπάθεια ασκεί τη διαδρομή της προσωρινής μνήμης και η διαφορά μεταξύ τους σας λέει αν το έναυσμα είναι η επίλυση ή η δρομολόγηση.
Αφού ανέβει η σήραγγα, επαληθεύστε τα δύο επίπεδα ξεχωριστά. Τα netstat -rn -f inet και netstat -rn -f inet6 δείχνουν πού δείχνει κάθε πρόθεμα, το scutil --dns δείχνει τη σειρά των resolver και ποια διεπαφή κατέχει κάθε resolver, και το nettop -m route δείχνει ποια διεπαφή μετέφερε τα byte. Αν η σήραγγα είναι πάνω και ο resolver σωστός αλλά ο πόρος εξακολουθεί να αποτυγχάνει, σταματήστε να επεξεργάζεστε τον κανόνα· ελέγξτε την εξουσιοδότηση από την πλευρά του διακομιστή και τη διαδρομή επιστροφής.
Όταν ο κανόνας ανήκει σε κάποιον άλλο
Αν η σήραγγα επανεμφανιστεί αφού την αποσυνδέσετε, ο κανόνας συνήθως ανήκει σε προφίλ και όχι σε εφαρμογή: διαμόρφωση που ωθήθηκε μέσω MDM, ένα εναπομείναν προσωπικό προφίλ ή προφίλ που εγκατέστησε άλλος πελάτης. Το sudo profiles show -type configuration μαζί με αναζήτηση για τα κλειδιά on-demand θα το περιορίσει, και η διαδρομή αφαίρεσης είναι το προφίλ, όχι ο διακόπτης στη γραμμή μενού. Η διαγραφή της καταχώρισης υπηρεσίας ή της εφαρμογής αφήνει τον κανόνα πίσω και η επόμενη εγκατάσταση τον κληρονομεί ξανά.
Μία δοκιμή καθορίζει την ιδιοκτησία: αποσυνδέστε, περιμένετε, ζητήστε ξανά το εσωτερικό όνομα. Αν η σήραγγα επιστρέψει, το έναυσμα λειτουργεί όπως σχεδιάστηκε και το ανοιχτό ερώτημα είναι ποιος τη διαχειρίζεται και αν αυτό το εύρος είναι το επιθυμητό.
Πριν το καταγράψετε ως σφάλμα, περάστε από τους ίδιους πέντε ελέγχους: διευθύνσεις resolver της σήραγγας παρούσες στο payload, όνομα που δεν ήταν στην προσωρινή μνήμη, κανένας προηγούμενος κανόνας που ταίριαξε ήδη, διαδρομή AAAA που καλύπτει η λίστα διαδρομών και η εφαρμογή εντός του εύρους της σήραγγας. Όταν ισχύουν και τα πέντε, ο κανόνας κάνει τη δουλειά του και το σφάλμα βρίσκεται πιο πέρα στη διαδρομή.