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

Ποιος τερματίζει πραγματικά την κρυπτογραφημένη συνεδρία

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

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

Το NAT ξαναγράφει τον φιλοξενούμενο ώσπου να μοιάζει με τον κεντρικό

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

# on the host: adapter mode and NAT DNS behaviour
VBoxManage showvminfo "lab-vm" | grep -i -E "nic|nat"
VBoxManage modifyvm "lab-vm" --natdnshostresolver1 on

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

Το bridge δίνει στον φιλοξενούμενο δική του μίσθωση και δική του έκθεση

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

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

Γιατί ο φιλοξενούμενος δεν μπορεί να είναι η πύλη του κεντρικού

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

Οι εφαρμόσιμες λύσεις είναι προωθήσεις και διαμεσολαβητές. Μια τοπική προώθηση SSH αφήνει τον κεντρικό να συνδεθεί στο δικό του loopback ενώ ο φιλοξενούμενος μεταφέρει τη ροή στο τούνελ, κάτι που καλύπτει υπηρεσίες TCP χωρίς εγκατάσταση δεύτερου πελάτη. Το να κάνεις την ίδια την κίνηση IP του κεντρικού να χρησιμοποιεί το τούνελ του φιλοξενούμενου αντί γι' αυτό απαιτεί δρομολογητή μέσα στον φιλοξενούμενο μαζί με ρητή διαδρομή στον κεντρικό και μετάφραση στον κεντρικό. Αυτός είναι μικρός σχεδιασμός δικτύου και όχι ένα κουτάκι επιλογής, και χρειάζεται σχέδιο για τη διαδρομή επιστροφής. Όταν ο φιλοξενούμενος υπάρχει μόνο για να τρέχει τον πελάτη, βάλε τον πελάτη στον κεντρικό και σβήσε το περιττό άλμα.

ssh -N -f -L 8080:internal-host.example:80 user@lab-vm

Οι resolvers και οι διαδρομές δεν περνούν τα σύνορα

Το DNS ακολουθεί τον προσαρμογέα που δέχτηκε την επιλογή, οπότε ο φιλοξενούμενος δεν κληρονομεί τον resolver του τούνελ του κεντρικού και ο κεντρικός δεν μαθαίνει ποτέ τον διακομιστή που ωθήθηκε στον φιλοξενούμενο. Οι τιμές dhcp-option DNS που ωθούνται ισχύουν για τη διεπαφή που τις δέχτηκε, και γι' αυτό ένας φιλοξενούμενος με bridge χωρίς πελάτη δεν μπορεί να επιλύσει εσωτερικά ονόματα. Ένας φιλοξενούμενος με NAT χρησιμοποιεί συνήθως τη διαχείριση DNS του hypervisor, και η διαφορά φαίνεται σε μία εντολή ανά περιβάλλον.

# on the host
VBoxManage showvminfo "lab-vm" | grep -i -E "nic|nat"
# inside a Linux guest
ip -4 route
resolvectl status
# inside a Windows guest
Get-DnsClientServerAddress

Διάβασε τον resolver και τη διαδρομή μέσα στον φιλοξενούμενο πριν υποθέσεις ότι κάποιο από τα δύο ακολουθεί τον κεντρικό. Πρόσθεσε τον resolver του τούνελ στον δικό του προσαρμογέα του φιλοξενούμενου όταν εσωτερικά ονόματα πρέπει να επιλύονται εκεί, και μετά επαλήθευσε με ένα όνομα που υπάρχει μόνο πίσω από το τούνελ. Κατέγραψε τη λειτουργία προσαρμογέα, τον ιδιοκτήτη του τούνελ και την πηγή του resolver για κάθε VM, γιατί αυτά τα τρία γεγονότα απαντούν σχεδόν σε κάθε μεταγενέστερη ερώτηση. Άλλοι hypervisors μετονομάζουν τις λειτουργίες και αφήνουν την αρχή άθικτη.

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