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

Το σύμπτωμα: ο δεύτερος πελάτης κερδίζει σιωπηλά

OpenVPN: η επιλογή redirect-gateway def1 δεν αντικαθιστά το 0.0.0.0/0. Προσθέτει τα 0.0.0.0/1 και 128.0.0.0/1: μαζί καλύπτουν κάθε διεύθυνση IPv4, και κάθε πρόθεμα κερδίζει μια απλή προεπιλεγμένη διαδρομή σε μήκος. Η αρχική προεπιλεγμένη διαδρομή μένει στον πίνακα και παύει να χρησιμοποιείται για συνηθισμένη κίνηση, και μια διαδρομή κεντρικού υπολογιστή προς τον διακομιστή VPN κρατά το τούνελ από το να συλλάβει τα δικά του εξωτερικά πακέτα. Και οι δύο πελάτες το κάνουν, και ο δεύτερος απλώς εγκαθιστά το ζεύγος του αργότερα.

Γι' αυτό το πρώτο τούνελ φαίνεται νεκρό αντί για αποσυνδεδεμένο. Η διεπαφή του είναι ενεργή, το κανάλι ελέγχου του ζει, και καμία κίνηση εφαρμογών δεν το φτάνει πια. Η αντίστροφη αναφορά έχει το ίδιο απόν push: ένα τηλέφωνο που συνδέεται αλλά δεν στέλνει τίποτα μιλά συνήθως με διακομιστή που δεν διαφήμισε ποτέ το redirect-gateway, οπότε η συσκευή κρατά τη δική της προεπιλεγμένη διαδρομή και φτάνει μόνο στην πισίνα.

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

Διαβάστε ποιο τούνελ κερδίζει στην πραγματικότητα

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

ip route show
ip route get 198.51.100.24
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.24

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

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

Windows: εμποδίστε ένα προφίλ να κατέχει την προεπιλεγμένη διαδρομή

Τα Windows κρατούν αποθηκευμένα προφίλ, και ο ενσωματωμένος πελάτης επιτρέπει στο ένα να εξαρτάται από το άλλο ώστε το πρώτο να σηκώνεται αυτόματα όταν καλεί το δεύτερο. Το προφίλ που συνδέθηκε πιο πρόσφατα τείνει να κρατά την προεπιλεγμένη διαδρομή, οπότε πρακτικός ιδιοκτήτης είναι η τελευταία κλήση και όχι η πρώτη. Δώστε σε κάθε προφίλ τις δικές του push διαδρομές και ενεργοποιήστε το split tunneling για εκείνο που δεν πρέπει να κατέχει την προεπιλεγμένη διαδρομή.

Set-VpnConnection -Name "Contoso" -SplitTunneling $true
rasdial Contoso

Το split tunneling το αλλάζει: μόνο τα προθέματα που σπρώχνει ο διακομιστής φτάνουν στον πίνακα, αφήνοντας την προεπιλεγμένη διαδρομή στο πρώτο τούνελ. Ο σχεδιασμός εξακολουθεί να αποτυγχάνει αν και οι δύο διακομιστές σπρώχνουν προεπιλεγμένη διαδρομή, γιατί τότε κερδίζει η τελευταία σύνδεση και καμία ρύθμιση στην πλευρά του πελάτη δεν το αλλάζει. Διορθώστε το push στην πλευρά του διακομιστή ή δεχτείτε έναν ιδιοκτήτη.

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

Linux: κρατήστε το δεύτερο τούνελ έξω από τον κύριο πίνακα

Η εκτέλεση δύο στιγμιοτύπων openvpn --config σε ένα μηχάνημα βάζει και τους δύο πελάτες στον ίδιο πίνακα, και τρεις επιλογές τους χωρίζουν με αυξανόμενη απομόνωση. Η ελαφρύτερη είναι να σταματήσετε εντελώς τον δεύτερο πελάτη από το να επεξεργάζεται τον πίνακα, με route-nopull και ρητές διαδρομές, ή ένα σκριπτ route-up που εγκαθιστά μόνο ό,τι σκοπεύετε. Τότε το δεύτερο τούνελ μεταφέρει ακριβώς τα προθέματα που ονομάζετε και τίποτα άλλο. Τότε αποφασίζετε ποια προθέματα πάνε πού αντί να το ανακαλύπτετε μετά.

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

ip rule add from 10.44.7.0/24 table 100
ip route add default dev tun1 table 100
sysctl net.ipv4.conf.all.rp_filter

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

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

Μερικές φορές μόνο ένα πρόγραμμα πρέπει να χρησιμοποιεί το δεύτερο τούνελ. Στο Linux, η δρομολόγηση πολιτικής ανά χρήστη, cgroup ή θύρα φτάνει σε αυτό το αποτέλεσμα, και ένας μεμονωμένος προορισμός μπορεί να καρφιτσωθεί σε μια διεπαφή χωρίς να αγγίξετε καθόλου την προεπιλεγμένη. Μια εφαρμογή που καρφιτσώνει το socket της σε μία διεπαφή δεν συμβουλεύεται καθόλου τον πίνακα δρομολόγησης, οπότε ένας εκτοξευτής μπορεί να συνεχίσει να χρησιμοποιεί τον φυσικό προσαρμογέα μέχρι να επιλεγεί μια διεύθυνση στις δικές του ρυθμίσεις.

Η αλυσίδωση είναι διαφορετική πράξη από το να τρέχετε δύο τούνελ δίπλα-δίπλα. Το να αλυσιδώσετε το A πάνω από το B σημαίνει ότι η διεύθυνση του εσωτερικού διακομιστή πρέπει να είναι προσβάσιμη από μέσα στο εξωτερικό τούνελ. Ο εξωτερικός πελάτης επίσης δεν πρέπει να εκλάβει τα κρυπτογραφημένα πακέτα του εσωτερικού πελάτη ως διαρροή. Ένας πελάτης μέσα σε εικονική μηχανή είναι η χονδροειδής αλλά αξιόπιστη εκδοχή· και οι δύο σε έναν κεντρικό υπολογιστή απαιτούν την εργασία δρομολόγησης παραπάνω συν μια εξωτερική διαδρομή προς τον εσωτερικό διακομιστή που δεν μπαίνει ποτέ στο εσωτερικό τούνελ.

Γράψτε τον ιδιοκτήτη της προεπιλεγμένης διαδρομής, τη λίστα προθεμάτων που μεταφέρει κάθε τούνελ και τη διαδρομή DNS. Αυτά τα τρία γεγονότα μετατρέπουν το επόμενο περιστατικό σε αναζήτηση αντί για έρευνα.

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