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

Ξεκινήστε από αυτό που επιστρέφει ο resolver

Ένας πελάτης ζητά vpn-a.example και λαμβάνει μια διεύθυνση· αυτή η διεύθυνση συν μια θύρα είναι το σύνολο αυτού που καλεί. Το όνομα δαπανάται τοπικά, κατά την αναζήτηση, και δεν γίνεται ποτέ πεδίο στο δίκτυο, οπότε ο δέκτης στο άλλο άκρο δεν μπορεί να δει ποια ετικέτα χρησιμοποιήθηκε. Στρέψτε τα vpn-a.example και vpn-b.example σε έναν κεντρικό υπολογιστή και οι δύο αναζητήσεις δίνουν τον ίδιο προορισμό, γι' αυτό ο δαίμονας απορροφά και τις δύο συνδέσεις σε ένα στιγμιότυπο χωρίς να καταγράψει διαφορά. Τα προφίλ που βασίζονται σε διεύθυνση συμπεριφέρονται ακριβώς όπως αυτά που βασίζονται σε όνομα, για τον ίδιο λόγο.

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

Ο μόνος επιλογέας που μετράει ταξιδεύει μέσα στο πακέτο

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

Σε τυπική διάταξη η χειραψία TLS που προστατεύει το κανάλι ελέγχου γίνεται αφού εδραιωθεί η εξωτερική συνεδρία και μεταφέρεται μέσα της, οπότε ένας δέκτης που δεν τερμάτισε εκείνη τη συνεδρία βλέπει αδιαφανή ροή. Μπορεί ακόμα να πει ότι είναι OpenVPN, επειδή ο opcode και η πλαισίωση στα πρώτα byte είναι αναγνωρίσιμα, αλλά το όνομα διακομιστή, αν υπάρχει, βρίσκεται στο κρυπτογραφημένο μέρος. Ένας σχεδιασμός που περιμένει να διαβάσει εικονικό host από το εξωτερικό πακέτο διαβάζει ένα πεδίο που το πρωτόκολλο δεν γράφει ποτέ εκεί. Αυτό προκύπτει από το πώς είναι χτισμένο το τούνελ, όχι από κενό που θα μπορούσε να κλείσει μια εξυπνότερη αντιστοίχιση μοτίβου.

Πού σταματάει ένας διαχωριστής πρωτοκόλλου

Ένας πολυπλέκτης του είδους που τεκμηριώνει το έργο sslh ακούει σε μία θύρα, επιθεωρεί τα πρώτα byte και παραδίδει τη σύνδεση σε όποιο backend μιλάει το πρωτόκολλο που αναγνώρισε. Αυτό είναι πραγματική αξία όταν μία θύρα πρέπει να εξυπηρετεί SSH, HTTPS και OpenVPN μαζί.

Το sslh κρατά ξεχωριστό probe για κάθε πρωτόκολλο, και το probe του για TLS μπορεί να βγάλει όνομα διακομιστή ή τιμή ALPN από ένα γνήσιο ClientHello. Η αναγνώριση γνήσιου OpenVPN είναι διαφορετική ταξινόμηση από την ανάγνωση επέκτασης TLS, και τα δύο δεν συνθέτονται, γιατί ένας πελάτης που δεν στέλνει ποτέ ClientHello στην υποδοχή ακρόασης αφήνει το probe χωρίς τίποτα να διαβάσει. Ένας κανόνας που ταιριάζει με OpenVPN επομένως απαντά «αυτός είναι πελάτης OpenVPN» και δεν πάει παραπέρα. Δύο backend OpenVPN πίσω από αυτόν τον κανόνα είναι δυσδιάκριτα, το frontend δεν έχει καμία βάση για επιλογή, και κάθε συνεδρία καταλήγει στο ίδιο σημείο. Η πολυπλεξία μοιράζεται μία θύρα ανάμεσα σε διαφορετικές υπηρεσίες· δεν κάνει εικονική φιλοξενία μέσα σε μία υπηρεσία.

Διατάξεις που χωρίζουν πραγματικά δύο διακομιστές

Ο φθηνότερος έντιμος διαχωρισμός είναι μια δεύτερη δημόσια διεύθυνση, μία ανά στιγμιότυπο, και τα υπάρχοντα προφίλ φέρουν ήδη το αναγκαίο επειδή δείχνουν σε διαφορετικές διευθύνσεις. Ο επόμενος είναι διαφορετική θύρα στην ίδια διεύθυνση, που δεν κοστίζει τίποτα πέρα από έναν αριθμό σε κάθε προφίλ. Το TCP και το UDP κρατούν ξεχωριστούς πίνακες θυρών, οπότε 1194/tcp και 1194/udp είναι άσχετες υποδοχές και από μία από κάθε μία μπορεί να συνυπάρχει σε έναν κεντρικό υπολογιστή· αυτός είναι διαχωρισμός μεταφοράς και όχι δρομολόγηση με όνομα, και συχνά μπερδεύεται με αυτήν. Και οι δύο επιλογές περνούν έλεγχο firewall, επειδή ο κανόνας ταιριάζει με κάτι που το πακέτο πράγματι περιέχει.

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

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

Αποδείξτε τον επιλογέα πριν χτίσετε

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

ss -lntup | grep -E ':443|:1194'
openssl s_client -connect vpn-a.example:443 -servername vpn-a.example </dev/null | head -n 20
journalctl -u openvpn-server@server-a -n 20 --no-pager

Η γραμμή openssl δίνει πιστοποιητικό μόνο εκεί όπου κάτι σε αυτή τη διεύθυνση τερματίζει TLS· απέναντι σε γνήσιο δέκτη OpenVPN κολλάει ή αποτυγχάνει, και αυτό είναι από μόνο του η απάντηση για το τι εκθέτει το εξωτερικό επίπεδο. Η γραμμή journal, διαβασμένη σε κάθε backend, δείχνει ποιο στιγμιότυπο δέχτηκε τη συνεδρία. Τα αρχεία καταγραφής του frontend καταγράφουν τι ταξινομήθηκε και ποτέ τι σκόπευε, οπότε το backend παραμένει η μόνη αυθεντία για το πού προσγειώθηκε ένας χρήστης.

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

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