Κοντέινερ Windows και VPN: γιατί χαλάει η τοπική δικτύωση
Ένα κοντέινερ Windows βασίζεται στον πίνακα δρομολόγησης του κεντρικού υπολογιστή, οπότε ένα VPN που μπλοκάρει το τοπικό υποδίκτυο παίρνει μαζί του και το πρόθεμα του κοντέινερ. Η λειτουργία Linux ακολουθεί άλλη διαδρομή.
Σε ένα φορητό υπολογιστή, με ένα συνδεδεμένο πελάτη VPN, τα κοντέινερ Linux συνεχίζουν να μιλούν μεταξύ τους και τα κοντέινερ Windows σταματούν. Η μεταβλητή δεν είναι η εικόνα· είναι η διαδρομή που παίρνουν τα πακέτα προς τον κεντρικό υπολογιστή. Τα κοντέινερ Windows στο προεπιλεγμένο δίκτυο δανείζονται τον πίνακα δρομολόγησης και τη μετάφραση του κεντρικού υπολογιστή, οπότε μια πολιτική που αλλάζει τη δρομολόγηση του κεντρικού υπολογιστή αλλάζει και αυτά. Επιβεβαιώστε το με αναζήτηση διαδρομής πριν επανεγκαταστήσετε οτιδήποτε.
Πού μπαίνουν τα πακέτα ενός κοντέινερ Windows στον κεντρικό υπολογιστή
Ένα κοντέινερ στο προεπιλεγμένο δίκτυο nat παίρνει διεύθυνση από ένα πρόθεμα της υπηρεσίας Host Networking Service, συνήθως κάπου μέσα στο 172.16.0.0/12, και φτάνει στον κεντρικό υπολογιστή μέσω εικονικού προσαρμογέα. Ο κεντρικός υπολογιστής κατέχει τη διαδρομή για αυτό το πρόθεμα και μεταφράζει την κίνηση προς τον προσαρμογέα που είναι ενεργός. Δεν υπάρχει ξεχωριστή εικονική μηχανή στη μέση αυτής της διαδρομής.
Αυτός ο σχεδιασμός κάνει την αποτυχία μηχανική. Όταν το κοντέινερ στέλνει ένα πακέτο, ο κεντρικός υπολογιστής εκτελεί αναζήτηση διαδρομής για το πρόθεμα του κοντέινερ. Όποια διαδρομή κερδίσει, εκεί πηγαίνει το πακέτο, και το κοντέινερ δεν έχει γνώμη γι' αυτό.
Τι αλλάζει ο πελάτης VPN σε αυτή τη διαδρομή
Ένας εταιρικός πελάτης εγκαθιστά συχνά ένα ευρύ σύνολο διαδρομών και ένα φίλτρο που αρνείται την πρόσβαση στο τοπικό υποδίκτυο όσο το τούνελ είναι ενεργό. Η πρόθεση είναι αμυντική: ένα παραβιασμένο τοπικό δίκτυο δεν πρέπει να φτάνει σε προστατευμένη μηχανή. Η παρενέργεια είναι ότι η διαδρομή του κεντρικού υπολογιστή προς το πρόθεμα του κοντέινερ δεν είναι πλέον το τοπικό δίκτυο NAT.
Αντί γι' αυτό, η αναζήτηση ταιριάζει με το τούνελ και το πακέτο παραδίδεται στην πύλη, η οποία δεν έχει ακούσει ποτέ για αυτή τη διεύθυνση κοντέινερ. Το Ping αποτυγχάνει, η εφαρμογή λήγει, και το κοντέινερ φαίνεται χαλασμένο ενώ το εικονίδιο VPN λάμπει. Κοιτάξτε τον πίνακα του κεντρικού υπολογιστή όσο είστε συνδεδεμένοι και η ανταγωνιστική διαδρομή είναι ορατή.
| Container mode | Outbound path | Typical result behind the VPN |
|---|---|---|
| Windows, default nat | Host routes and translates container traffic | Container prefix follows the tunnel and fails |
| Windows, transparent | Container sits on the physical link | Depends on the local subnet being allowed |
| Linux engine on Docker Desktop | VM egress proxied by a host process | Often keeps working |
Γιατί τα κοντέινερ Linux συμπεριφέρονται διαφορετικά
Η μηχανή Linux εκτελεί τα κοντέινερ μέσα σε μια ελαφριά εικονική μηχανή, και οι εξερχόμενες συνδέσεις από αυτή τη μηχανή ανοίγονται από έναν διακομιστή μεσολάβησης στην πλευρά του κεντρικού υπολογιστή για λογαριασμό του κοντέινερ. Ο κεντρικός υπολογιστής ξεκινά την υποδοχή, οπότε ο κανόνας του VPN για το πρόθεμα του κοντέινερ δεν ισχύει για αυτόν με τον ίδιο τρόπο, και το φορτίο εργασίας συνεχίζει να φτάνει στο δίκτυο.
Αυτή η διαφορά εξηγεί επίσης γιατί οι συνταγές Linux δεν μεταφέρονται. Ένα κοντέινερ Linux που χρειάζεται το δικό του τούνελ παίρνει μια συσκευή TUN συν την ικανότητα NET_ADMIN. Τα κοντέινερ Windows δεν εκθέτουν καμία διεπαφή ως συσκευή, οπότε αυτό το μοτίβο δεν έχει αντίστοιχο σε εκείνη την πλευρά.
Αποδείξτε τη διαδρομή και μετά επιλέξτε σχεδιασμό
Συλλέξτε στοιχεία από τον κεντρικό υπολογιστή, όχι από το κοντέινερ, γιατί ο κεντρικός υπολογιστής εκτελεί την αναζήτηση:
docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"
Εκτελέστε την έξοδο διαδρομών μία φορά πριν συνδεθεί το VPN και μία φορά μετά. Αν στη δεύτερη έξοδο το πρόθεμα του κοντέινερ δείχνει στον προσαρμογέα του τούνελ, η διάγνωση είναι πλήρης και η επανεκκίνηση των κοντέινερ δεν θα βοηθήσει.
Η πρώτη επιλογή είναι απόφαση πολιτικής: ρωτήστε τον ιδιοκτήτη του δικτύου αν μπορεί να επιτραπεί τοπική πρόσβαση LAN για αυτή τη συσκευή. Αρκετοί εταιρικοί πελάτες το εκθέτουν ως ρύθμιση, όμως αυτό αποδυναμώνει ένα σκόπιμο όριο. Ζητήστε το ως τεκμηριωμένη εξαίρεση με ιδιοκτήτη και ημερομηνία αναθεώρησης. Ένας διακόπτης ανά συσκευή στον οποίο κανείς δεν επιστρέφει είναι ο τρόπος με τον οποίο μια αμυντική πολιτική εξαφανίζεται ήσυχα.
Όπου η πολιτική πρέπει να σταθεί, μετακινήστε το φορτίο εργασίας αντί να παλεύετε με τη διαδρομή. Ένα διαφανές δίκτυο με ρητό υποδίκτυο και πύλη βάζει τα κοντέινερ στον τοπικό σύνδεσμο, ένα φορτίο εργασίας Linux τρέχει πίσω από τον μεσολαβητή της εικονικής μηχανής, και μια ξεχωριστή εικονική μηχανή με δικό της πελάτη κρατά τη δική της πολιτική. Επιλέξτε ένα σκόπιμα και δοκιμάστε το μέσα από το κοντέινερ, γιατί εκεί προέρχεται το αίτημα του χρήστη.