Οι επιπλέον διαδρομές VPN του Mac χρειάζονται ιδιοκτήτη, όχι σενάριο σύνδεσης
Μια διαδρομή που προστίθεται μία φορά στη σύνδεση δεν είναι πολιτική επανασύνδεσης. Δώσε στα απομακρυσμένα προθέματα έναν ιδιοκτήτη και αποφάσισε πώς εμφανίζονται, αλλάζουν και εξαφανίζονται με αυτή τη σύνδεση.
Το να φτάνεις σε ένα ιδιωτικό πρόθεμα μέσω VPN είναι μια απαίτηση με διάρκεια: ισχύει όσο αυτή η σύνδεση είναι χρησιμοποιήσιμη και τελειώνει όταν τελειώνει η σύνδεση. Ένα σενάριο σύνδεσης δεν μπορεί να το εκφράσει, γιατί η σύνδεση και το σήκωμα της σήραγγας είναι διαφορετικές στιγμές, και η σήραγγα που υπάρχει κατά τη σύνδεση μπορεί να μην είναι αυτή που μεταφέρει κίνηση ένα λεπτό αργότερα. Η πρώτη απόφαση δεν είναι ποια εντολή θα τρέξεις. Είναι ποιο συστατικό κατέχει το πρόθεμα.
Το πρόθεμα χρειάζεται ιδιοκτήτη, όχι μια στιγμή
Ξεκίνα γράφοντας την απαίτηση ως πρόταση με υποκείμενο: φτάσε 10.77.0.0/24 μέσω του Office VPN όσο αυτή η σύνδεση είναι ενεργή. Αυτή η πρόταση ονομάζει το πρόθεμα, τη σύνδεση και τη συνθήκη, και αποκλείει αμέσως δύο δημοφιλή υποκατάστατα: ένα hook σύνδεσης και ένα όνομα διεπαφής όπως ppp0 ή utun2.
Τα ονόματα διεπαφών εκχωρούνται κατά την εκτέλεση και δεν είναι σταθερά μεταξύ επανασυνδέσεων. Ένα hook που ταιριάζει το όνομα που είδε την περασμένη εβδομάδα είτε δεν θα ενεργοποιηθεί είτε θα ενεργοποιηθεί πάνω στη διεπαφή κάποιου άλλου. Και τα δύο αποτελέσματα εμφανίζονται ως σφάλμα δρομολόγησης και όχι ως η παρωχημένη παραδοχή που είναι. Η ίδια ένσταση ισχύει για κάθε σενάριο που βασίζεται σε όνομα που υπάρχει μόνο όσο είναι σηκωμένη μία συγκεκριμένη σήραγγα.
Χρησιμοποίησε υποστηριζόμενη πηγή πρόθεσης διαδρομής
Η πύλη, ένα διαχειριζόμενο προφίλ ή ο τεκμηριωμένος μηχανισμός διαδρομών του πελάτη που κατέχει είναι το σωστό μέρος, όταν αυτός ο μηχανισμός μπορεί να εκφράσει την απαίτηση. Ποιο ισχύει εξαρτάται από το πρωτόκολλο και τον πάροχο, και τα κλειδιά δεν ταξιδεύουν μεταξύ τους, οπότε μια τιμή που ρυθμίζει ένα προφίλ OpenVPN δεν σου λέει τίποτα για τον εγγενή πελάτη L2TP ή IKEv2.
| Mechanism | Can carry extra prefixes | Who owns the lifetime |
|---|---|---|
| Gateway-pushed routes | Often, if the gateway is configured for it | The connection |
| Managed profile settings | Depends on the client and profile format | The profile |
| Provider tunnel settings | Yes, as included and excluded routes | The provider process |
| Manual command | Yes, once | Nobody |
Για όσους αναπτύσσουν σήραγγες πακέτων, οι ρυθμίσεις σήραγγας IPv4 της Apple εκθέτουν ρητά τις συμπεριλαμβανόμενες και εξαιρούμενες διαδρομές, και το IPv6 έχει το αντίστοιχό του. Αυτά είναι API που χρησιμοποιεί ο πάροχος, όχι απόδειξη ότι κάθε εγγενές πάνελ VPN προσφέρει στον διαχειριστή αυθαίρετη λίστα διαδρομών. Αν ο τρέχων συνδυασμός δεν μπορεί να εκφράσει τα προθέματα που χρειάζεσαι, το επόμενο βήμα είναι μια υποστηριζόμενη διαδρομή ρύθμισης από τον πάροχο, όχι μια άλλη εφαρμογή εγκατεστημένη με την ελπίδα ότι θα συμπεριφερθεί καλύτερα.
Η διάρκεια ζωής περιλαμβάνει τον καθαρισμό
Μερικές φορές ένας εξωτερικός βοηθός είναι πραγματικά απαραίτητος, και τότε το «πρόσθεσε τη διαδρομή» είναι το μικρότερο μέρος της δουλειάς του. Πρέπει να ξέρει ποια σύνδεση εξυπηρετεί και ποια διεπαφή χρησιμοποιεί αυτή η σύνδεση, να περιμένει μέχρι να σταθεροποιηθεί η σχετική κατάσταση δικτύου, να παραμένει idempotent όταν τρέχει δύο φορές στη σειρά, και να μην καθαρίζει τίποτα που δεν εγκατέστησε το ίδιο.
Η τελευταία ρήτρα είναι αυτή που πονάει. Ένας βοηθός που διαγράφει κάθε διαδρομή που ταιριάζει με το πρόθεμα του γραφείου θα διαγράψει αργά ή γρήγορα μια διαδρομή που δεν πρόσθεσε. Η διακοπή που προκύπτει χρεώνεται στον πελάτη VPN, γιατί ο πελάτης είναι το κομμάτι που βλέπει ο χρήστης. Το να αποφασίσεις τι κατέχει ένας βοηθός πριν τον γράψεις είναι φθηνότερο από το να εξηγείς μετά γιατί ένα τοπικό υποδίκτυο σταμάτησε να απαντά.
Ο αγώνας της επανασύνδεσης
Σκέψου μια γρήγορη επανασύνδεση. Η συνεδρία A πέφτει, η συνεδρία B ανεβαίνει και εγκαθιστά τη διαδρομή της, και μετά ο καθαρισμός της A, που είχε καθυστερήσει, εκτελείται επιτέλους. Αν αυτός ο καθαρισμός αφαιρεί διαδρομές κατά πρόθεμα, παίρνει μαζί του την έγκυρη κατάσταση της B, και η σύνδεση που δούλευε πριν από ένα δευτερόλεπτο δρομολογεί τώρα στο κενό.
Αυτός είναι ένας αγώνας ιδιοκτησίας, και το να προσθέσεις ύπνο στο σενάριο αλλάζει μόνο ποια πλευρά τον κερδίζει. Η λύση είναι να κάνεις τον καθαρισμό υπό όρους ταυτότητας: σύγκρινε τη διεπαφή και τη συνεδρία που εγκατέστησε ο βοηθός με εκείνες που είναι ακόμη τρέχουσες, και αφαίρεσε μόνο όταν ταιριάζουν.
Τι να δοκιμάσεις και τι δεν μπορεί να κάνει μια διαδρομή
Η αποδοχή πρέπει να καλύπτει τέσσερις μεταβάσεις: την πρώτη σύνδεση, μια επανασύνδεση σε διαφορετική διεπαφή, μια αποτυχημένη απόπειρα σύνδεσης και την τελική αποσύνδεση. Μετά από καθεμία, διάβασε τη διαδρομή που επέλεξε πραγματικά το σύστημα για μια διεύθυνση στην απομακρυσμένη πλευρά, όχι αυτή που περίμενες.
route -n get 10.77.0.5
netstat -rn -f inet
Συμπεριέλαβε και τις δύσκολες περιπτώσεις στον ίδιο γύρο: IPv6 όπου απαιτείται, ένα τοπικό πρόθεμα που επικαλύπτει το απομακρυσμένο, και τη διαδρομή προς το ίδιο το δημόσιο τελικό σημείο VPN, που πρέπει να συνεχίσει να λειτουργεί όσο η σήραγγα είναι ενεργή. Μετά γράψε τι δεν είναι μια διαδρομή. Επιλέγει πακέτα· δεν παρέχει άδεια στην απομακρυσμένη πλευρά και δεν δημιουργεί διαδρομή επιστροφής, και αυτά παραμένουν χωριστές απαιτήσεις με χωριστούς ιδιοκτήτες.
Το αποτέλεσμα που θέλεις είναι ένα πρόθεμα που ακολουθεί τον υποστηριζόμενο ιδιοκτήτη της σύνδεσής του σε κάθε μετάβαση, και όχι μια εντολή που κατά τύχη πέτυχε μία φορά στο μηχάνημα όπου γράφτηκε.