NAT ή γεφυρωμένη δικτύωση VM: ποια μεταφέρει την κίνηση VPN;
Οι guest του NAT δανείζονται τη σήραγγα του host μόνο αν ο πελάτης δημιουργεί σήραγγα βάσει διαδρομής· οι γεφυρωμένοι guest δρομολογούν μόνοι τους. Δοκίμασε τον guest και μετά διάλεξε τη λειτουργία που ταιριάζει.
Η γεφύρωση και το NAT δεν είναι δύο τρόποι να συνδέσεις τον ίδιο guest στο VPN σου· αποφασίζουν ποιος κατέχει τα πακέτα του guest πριν μπει σήραγγα στη μέση. Στη λειτουργία NAT ο hypervisor ξαναγράφει την κίνηση του guest και την εκπέμπει από κώδικα στην πλευρά του host, άρα ο guest ακολουθεί όποια διαδρομή δώσει ο host σε αυτόν τον κώδικα. Στη γεφυρωμένη λειτουργία ο guest αποκτά δική του ταυτότητα στο επίπεδο ζεύξης στο φυσικό τμήμα και διαλέγει το δικό του default gateway, κάτι που κάνει τη σήραγγα του host άσχετη γι' αυτόν, εκτός αν ο router του LAN είναι αυτός που κάνει τη σήραγγα. Σταμάτησα να θεωρώ το VM «μέσα στο VPN» και άρχισα να το βλέπω ως ερώτηση για το πού δείχνει η προεπιλεγμένη διαδρομή του guest. Η δοκιμή παρακάτω παίρνει λίγα λεπτά ανά λειτουργία και το ξεκαθαρίζει χωρίς εικασίες.
Το NAT κρατά τον guest πίσω από κώδικα του hypervisor, όπου ισχύουν οι διαδρομές του host
Στο VirtualBox ένας guest NAT κάθεται στο 10.0.2.0/24 με εικονικό gateway στο 10.0.2.2, proxy DNS στο 10.0.2.3 και καμία δική του διαδρομή προς το φυσικό δίκτυο. Τα εξερχόμενα πακέτα τα παίρνει η μηχανή NAT, τα ξαναγράφει ώστε πηγή να είναι ο host και τα περνά στη στοίβα IP του host. Από εκεί η κίνηση του guest είναι ροή του host, και η αναζήτηση διαδρομής γίνεται με βάση τον προορισμό: ένας πελάτης πλήρους σήραγγας που εγκαθιστά 0.0.0.0/1 και 128.0.0.0/1 στον host την πιάνει χωρίς να μάθει ποτέ ότι υπάρχει VM. Το κεφάλαιο της Oracle για τη δικτύωση του VirtualBox απαριθμεί αυτές τις προεπιλογές, αν θέλεις να επιβεβαιώσεις τις διευθύνσεις στη δική σου εγκατάσταση.
Το προεπιλεγμένο δίκτυο του libvirt φτάνει στο ίδιο σημείο από το 192.168.122.0/24, όπου ο dnsmasq μοιράζει leases και ο host κάνει masquerade στο υποδίκτυο, οπότε τα πακέτα του guest φτάνουν ξανά στην απόφαση δρομολόγησης του host. Η εξαίρεση είναι ένας πελάτης που διαλέγει κίνηση με βάση τη διεργασία και όχι τη διαδρομή. Αν η λίστα της διαχωρισμένης σήραγγας περιέχει μόνο το πρόγραμμα περιήγησής σου, η μηχανή NAT δεν είναι σε αυτή τη λίστα, και ο guest φεύγει από το μηχάνημα χωρίς σήραγγα, ενώ το πρόγραμμα περιήγησης του host δείχνει ακόμη καλυμμένο. Ίδιο υποδίκτυο, αντίθετο αποτέλεσμα.
Η γεφύρωση δίνει στον guest δική του θέση στο φυσικό LAN
Σε έναν γεφυρωμένο guest δίνεται εικονική κάρτα δικτύου προσδεδεμένη σε πραγματικό adapter, αποκτά δική του διεύθυνση MAC και παίρνει lease DHCP από το φυσικό δίκτυο. Το default gateway του είναι ο router του LAN, όχι ο hypervisor, και τα frames του βγαίνουν στο καλώδιο μέσω αυτού του adapter. Οι διαδρομές της σήραγγας του host μένουν στον πίνακα του host και δεν ερωτώνται ποτέ, γιατί τα frames του guest δεν μπαίνουν ποτέ στη στοίβα IP του host.
Αυτό κόβει και προς τις δύο κατευθύνσεις. Το mDNS και η περιήγηση SMB αρχίζουν να δουλεύουν επειδή ο guest βλέπει την κίνηση εκπομπής του LAN, και ο guest γίνεται προσβάσιμος από άλλα μηχανήματα στο ίδιο τμήμα χωρίς firewall του host ανάμεσα. Η γεφύρωση επίσης δεν είναι τρόπος να σπρώξεις έναν guest μέσα από υπάρχουσα σήραγγα: το να συνδέσεις ένα VM στη διεπαφή WireGuard ή OpenVPN του host δεν είναι κάτι που κάνουν για σένα το VirtualBox ή το libvirt. Αν ένας γεφυρωμένος guest πρέπει να περάσει από σήραγγα, η σήραγγα πρέπει να τερματίζει κάπου σε αυτό το LAN.
Η δοκιμή που τελειώνει τη συζήτηση
Τρέξε τους ίδιους ελέγχους και στις δύο λειτουργίες και γράψε τις απαντήσεις:
- Στον host, το
curl -s https://ifconfig.meδίνει τη δημόσια διεύθυνση v4. - Στον guest, η ίδια εντολή, και
ip routeσε Linux ήGet-NetRoute -DestinationPrefix 0.0.0.0/0σε Windows για το default gateway. - Ταυτότητα resolver:
resolvectl statusήcat /etc/resolv.confστον guest, για να δεις αν δείχνει στο 10.0.2.3 ή σε κάποιον διακομιστή του LAN. - Οικογένεια διευθύνσεων:
ip -6 addr show scope globalκαι ένα αίτημα v6, γιατί μια σήραγγα v4 δεν λέει τίποτα για μια καθολική διεύθυνση v6 που μπορεί να έχει ο guest.
Ίδιες δημόσιες διευθύνσεις σημαίνει ότι ο guest είναι στη διαδρομή του host. Διεύθυνση guest που ταιριάζει με τη συνηθισμένη έξοδο του LAN σημαίνει ότι δεν είναι. Το βήμα που παραλείπουν οι περισσότεροι είναι ο έλεγχος: κατέβασε τη σήραγγα του host και επανάλαβε το αίτημα από τον guest. Αν ο guest συνεχίζει να περιηγείται, δεν εξαρτιόταν ποτέ από τη σήραγγα του host, ό,τι κι αν υπονοεί το όνομα της λειτουργίας. Στη λειτουργία NAT ο guest πρέπει να χάνει το internet με τη σήραγγα του host κάτω, εκτός αν ο πελάτης είναι ρυθμισμένος να επιτρέπει κίνηση εκτός σήραγγας, κάτι που αξίζει να το ξέρεις από μόνο του.
Δύο σήματα λένε ψέματα. Ένα επιτυχές ping αποδεικνύει προσβασιμότητα, όχι διαδρομή εξόδου. Και το DNS μπορεί να απαντηθεί από το proxy 10.0.2.3 μέσω του resolver του host, ενώ το TCP παίρνει άλλη διαδρομή· έτσι καταλήγεις με σελίδα που φορτώνει και σύνδεση που δεν ολοκληρώνεται ποτέ.
Ποια λειτουργία ταιριάζει στη δουλειά
Η λειτουργία είναι απόφαση δρομολόγησης, οπότε διάλεξέ την με βάση την απαίτηση και όχι τη συνήθεια:
| Requirement | Mode that fits |
|---|---|
| Every guest flow must exit through the host tunnel | NAT, with a host client that tunnels by route, verified from inside the guest |
| The guest needs its own VPN account or profile | Bridged, or NAT with a client running inside the guest, not both |
| The guest must serve SSH, SMB, or a dev server to the LAN | Bridged; NAT needs a port forward, which does not change the outbound path |
| The guest must stay invisible to the LAN | NAT; a bridged guest is another host on the segment |
| The guest needs a real public IPv6 address | Bridged; VirtualBox NAT mode has no IPv6 forwarding |
| Isolation from the LAN with access to the host | Host-only adapter, not NAT |
Η πρώτη γραμμή είναι εκεί που πιάνονται οι άνθρωποι: NAT μαζί με πελάτη πλήρους σήραγγας στον host καλύπτει πράγματι έναν guest, αλλά μόνο όσο ο πελάτης δημιουργεί σήραγγα με βάση τη διαδρομή και το uplink του host είναι αυτή η σήραγγα. Μετακίνησε τον πελάτη σε λίστα επιτρεπόμενων μόνο για το πρόγραμμα περιήγησης και η κάλυψη εξαφανίζεται χωρίς κανένα σφάλμα πουθενά. Η τέταρτη γραμμή είναι το αντίστροφο λάθος: guest γεφυρωμένος για ευκολία που αρχίζει ήσυχα να απαντά σε SMB ή SSH στο LAN του γραφείου.
Αποτυχίες που χρεώνονται στο VPN
Στα Windows η μετάφραση NAT τρέχει μέσα στη διεργασία VM του VirtualBox, οπότε ένας πελάτης ανά εφαρμογή χρειάζεται ακριβώς αυτή την εικόνα στη λίστα του και όχι έναν γενικό κανόνα για εικονικές μηχανές. Όταν μια ενημέρωση πελάτη ξαναχτίζει τη λίστα διεργασιών του, οι guest NAT χάνουν πρώτοι την κάλυψη, και η αναφορά διαβάζεται σαν VM που φτάνει στο LAN αλλά όχι στο internet, ενώ ο host είναι μια χαρά.
Η γεφύρωση σε Wi-Fi είναι η άλλη κλασική περίπτωση. Τα σημεία πρόσβασης σπάνια προωθούν frames με ξένη MAC πηγής, οπότε μια γέφυρα προς το wlan0 είτε αποτυγχάνει εντελώς είτε δουλεύει μέχρι να αρχίσει η απομόνωση πελατών στο σημείο πρόσβασης να τη ρίχνει. Το VirtualBox θα σου προσφέρει πάντως τον ασύρματο adapter στη λίστα του. Αν ο host είναι σε Wi-Fi και ο guest πρέπει να γεφυρωθεί, σχεδίασε να το δοκιμάσεις αντί να το υποθέσεις.
Το MTU είναι το τρίτο. Ένας γεφυρωμένος guest κρατά το MTU των 1500 byte του LAN, και αν τρέχει δικό του πελάτη WireGuard στα 1420, μεγάλα TLS handshakes κολλάνε ενώ μικρά αιτήματα πετυχαίνουν. Κάτω από NAT το MTU της σήραγγας του host είναι πρόβλημα του host, αλλά ο guest εξακολουθεί να πιστεύει στα 1500, και το UDP με το bit don't-fragment σε ισχύ εξαφανίζεται με τον ίδιο τρόπο.
Γράψε τη λειτουργία και ξαναέλεγξε μετά από κάθε αλλαγή adapter
Κατέγραψε τη λειτουργία, τη διεπαφή του host που χρησιμοποιεί η γέφυρα, το default gateway του guest, τον resolver του και τις διευθύνσεις εξόδου v4 και v6. Αυτή η καταγραφή κάνει την επόμενη αποτυχία φθηνή: όταν ένα laptop μετακινηθεί από το dock στο Wi-Fi, ένας γεφυρωμένος guest ακολουθεί τη γέφυρα σε άλλο φυσικό adapter και μπορεί να πάρει lease σε άλλο υποδίκτυο, ενώ ένας guest NAT κρατά τη διεύθυνση 10.0.2.x και κληρονομεί σιωπηλά άλλο uplink.
Πριν κλείσεις το ticket, επιβεβαίωσε καθένα από αυτά:
- Η διεύθυνση εξόδου του guest διαφέρει από τη διεύθυνση εξόδου του host, άρα δεν είναι στη σήραγγα του host.
- Ο resolver είναι το proxy 10.0.2.3 ή κάποιος διακομιστής του LAN, και ξέρεις ποιος απάντησε.
- Δεν υπάρχει καθολική διεύθυνση v6 στον guest, αν ο σχεδιασμός της σήραγγας είναι μόνο v4.
- Με τη σήραγγα του host κάτω, ο guest σταματά να περιηγείται, ή τώρα ξέρεις ότι δεν εξαρτιόταν ποτέ από αυτή.
- Ο guest δεν βλέπει κίνηση εκπομπής του LAN που δεν τον αφορά.