Γιατί ένα κοντέινερ Docker δεν φτάνει τους διακομιστές πίσω από το VPN
Τα κοντέινερ γέφυρας έχουν δικό τους χώρο ονομάτων, οπότε η σήραγγα του host είναι αόρατη σε αυτά. Συγκρίνετε δικτύωση host, συσκευή tun και macvlan πριν αλλάξετε το DNS.
Ένα κοντέινερ που δεν φτάνει τίποτα πίσω από το εταιρικό VPN ζει συνήθως σε διαφορετικό χώρο ονομάτων δικτύου από τη σήραγγα. Οι διαδρομές, οι διακομιστές DNS και τα σημάδια του τείχους προστασίας του πελάτη host ανήκουν στη στοίβα του host· ένα κοντέινερ δικτύου γέφυρας έχει τη δική του. Αυτό το ένα γεγονός εξηγεί τις περισσότερες αναφορές που φτάνουν σε μια ομάδα πλατφόρμας, και είναι επίσης ο λόγος που το «το VPN είναι χαλασμένο» και το «το Docker παρακάμπτει το VPN» μπορούν να είναι και τα δύο λάθος ταυτόχρονα. Δύο πολύ διαφορετικές ρυθμίσεις κρύβονται πίσω από ένα σύμπτωμα, οπότε προσδιορίστε ποια έχετε πριν αλλάξετε οποιαδήποτε ρύθμιση.
Βρείτε ποιος χώρος ονομάτων κατέχει τη σήραγγα
Στο Docker Desktop για macOS ή Windows τα κοντέινερ εκτελούνται μέσα σε μια εικονική μηχανή Linux. Ένας πελάτης VPN εγκατεστημένος στην επιφάνεια εργασίας δημιουργεί σήραγγα στο λειτουργικό σύστημα της επιφάνειας εργασίας και η εικονική μηχανή δεν τη βλέπει ποτέ. Καμία ρύθμιση κοντέινερ δεν το διορθώνει, επειδή η διεπαφή που θα χρειαζόταν το κοντέινερ δεν υπάρχει καθόλου στον χώρο ονομάτων δικτύου του.
Σε host Linux η σήραγγα ζει στον χώρο ονομάτων του host και τα κοντέινερ γέφυρας τη φτάνουν συνήθως μέσω του πίνακα δρομολόγησης του host με NAT πηγής να εφαρμόζεται στην έξοδο. Όταν αυτή η διαδρομή αποτυγχάνει, η αιτία είναι συνήθως πολιτική προώθησης, φιλτράρισμα αντίστροφης διαδρομής ή επικαλυπτόμενο υποδίκτυο και όχι διαδρομή που λείπει. Επιβεβαιώστε σε ποιον από τους δύο κόσμους βρίσκεστε πριν διαβάσετε περισσότερα:
docker info --format '{{.OperatingSystem}}'
docker run --rm --net=host alpine ip route | head -5
docker run --rm alpine ip route | head -5
Η διαφορά ανάμεσα σε αυτούς τους δύο πίνακες δρομολόγησης είναι όλο το πρόβλημα σε μία οθόνη. Αν η όψη του host περιέχει τη διεπαφή σήραγγας και η όψη της γέφυρας όχι, βλέπετε απομόνωση χώρων ονομάτων και όλα τα υπόλοιπα είναι επιλογή για το πώς θα τη διασχίσετε.
Το δίκτυο host είναι δοκιμή, όχι σχεδιασμός
Η εκτέλεση κοντέινερ με δίκτυο host, το οποίο το Docker τεκμηριώνει ως κοινή χρήση του χώρου ονομάτων δικτύου του host, το κάνει να κληρονομεί απευθείας τη διεπαφή σήραγγας και τις διαδρομές της. Αν το ίδιο αίτημα πετύχει τότε, η θεωρία των διαδρομών επιβεβαιώνεται και η αποτυχία είναι απομόνωση χώρων ονομάτων, όχι διαπιστευτήρια, DNS ή κανόνας πρόσβασης.
docker run --rm --net=host curl -sS -o /dev/null -w '%{http_code}\n' https://api.internal/health
Κρατήστε το ως διαγνωστικό. Το δίκτυο host παραιτείται από τη δημοσίευση θυρών και το μεγαλύτερο μέρος της απομόνωσης που θέλατε από ένα κοντέινερ, και στο Docker Desktop το «host» σημαίνει την εικονική μηχανή, όχι την επιφάνεια εργασίας, οπότε μια επιτυχία ή αποτυχία εκεί μπορεί να σας παραπλανήσει αν ξεχάσετε ποιον host απευθύνατε.
Συσκευή tun και τα προνόμια που τη συνοδεύουν
Ένας πελάτης VPN μέσα στο κοντέινερ χρειάζεται συσκευή σήραγγας και άδεια για να τη ρυθμίσει. Η συνήθης συντόμευση είναι το --privileged, που παρέχει κάθε συσκευή και χαλαρώνει την πολιτική ασφαλείας σε όλο το κοντέινερ. Αυτό είναι πολύ περισσότερο από ό,τι απαιτεί αυτή η εργασία και δύσκολα δικαιολογείται σε μια αναθεώρηση.
sudo modprobe tun
docker run --rm -it --device /dev/net/tun --cap-add NET_ADMIN myvpn-client
Η στενότερη μορφή αντιστοιχίζει τον μεμονωμένο κόμβο συσκευής και προσθέτει μόνο την ικανότητα διαχείρισης δικτύου. Φορτώστε πρώτα το module στον host ώστε να υπάρχει ο κόμβος. Αν το κοντέινερ ξεκινήσει και ο πελάτης αναφέρει ότι δεν μπορεί να ανοίξει τη συσκευή σήραγγας, ελέγξτε την αντιστοίχιση πριν υποψιαστείτε το προφίλ, γιατί αυτό το σφάλμα είναι συνήθως κυριολεκτικό.
Αυτός ο σχεδιασμός σημαίνει επίσης ότι ο πελάτης εκτελείται ανά κοντέινερ. Αυτή είναι η σωστή απάντηση όταν κάθε φόρτος εργασίας χρειάζεται τη δική του σήραγγα, και η λάθος όταν απλώς θέλατε η σήραγγα του host να είναι ορατή, κάτι που η ομάδα πλατφόρμας πιθανότατα υπέθετε ότι κάνετε.
Το NAT της γέφυρας αλλάζει την πηγή που βλέπει το VPN
Με την προεπιλεγμένη γέφυρα, η εξερχόμενη κίνηση του κοντέινερ μεταφράζεται στη διεύθυνση του host. Πίσω από VPN η εταιρική πλευρά βλέπει επομένως τη διεύθυνση σήραγγας του host και όχι του κοντέινερ, οι κανόνες πρόσβασης ανά πηγή συμπεριφέρονται σαν να έκανε το αίτημα ο host, και δύο κοντέινερ γίνονται δυσδιάκριτα για τον διακομιστή VPN.
Το macvlan ή το ipvlan δίνει αντίθετα στο κοντέινερ μια διεύθυνση LAN, που βοηθά την ανακάλυψη στο LAN και κάνει το κοντέινερ να μοιάζει με ομότιμο στο τμήμα. Παρακάμπτει επίσης εντελώς τη σήραγγα του host, οπότε ένα τέτοιο κοντέινερ δεν θα φτάσει προθέματα μόνο-VPN εκτός αν το VPN είναι προσβάσιμο και από αυτό το LAN.
Και οι δύο μορφές είναι νόμιμες· απαντούν σε διαφορετικές απαιτήσεις. Αν η απαίτηση είναι «αυτό το κοντέινερ πρέπει να φτάνει μια υπηρεσία μόνο-VPN», επιλέγετε ανάμεσα σε δρομολόγηση μέσω του host και τερματισμό της σήραγγας μέσα στο κοντέινερ. Καταγράψτε αυτή την επιλογή πριν την ανάπτυξη, όχι μετά το πρώτο αποτυχημένο αίτημα. Ό,τι κι αν επιλέξετε, καταγράψτε τη διεύθυνση πηγής που θα δει το απομακρυσμένο άκρο, γιατί αυτό θα δείξουν οι κανόνες πρόσβασης και τα αρχεία καταγραφής του. Ένας σχεδιασμός που δεν μπορεί να δηλώσει αυτή τη διεύθυνση δεν είναι ολοκληρωμένος.
Το DNS ακολουθεί τον δαίμονα, όχι τη σήραγγα
Ένα κοντέινερ παίρνει τη ρύθμιση του resolver κατά την εκκίνηση, αντιγραμμένη από τον δαίμονα ή από την εικόνα. Οι διευθύνσεις που στέλνει το VPN μετά τη σύνδεση φτάνουν πολύ αργά για αυτό το αντίγραφο και στέλνονται στον resolver του host και όχι στο κοντέινερ.
Ορίστε τον resolver ρητά για την υπηρεσία ή κατευθύνετέ τον σε εσωτερικό resolver προσβάσιμο μέσω της σήραγγας. Ένα κοντέινερ που επιλύει ένα ιδιωτικό όνομα σε δημόσια διεύθυνση συνήθως χρησιμοποιεί δημόσιο resolver, δεν υποφέρει από χαλασμένη διαδρομή, και η διόρθωση ανήκει στο αρχείο compose ή στη ρύθμιση του δαίμονα.
Η ίδια λογική ισχύει για το ζήτημα της διεύθυνσης εξόδου. Αν κάθε κοντέινερ πρέπει να εμφανίζεται από διαφορετική διεύθυνση VPN, μία σήραγγα host δεν μπορεί να το προσφέρει επειδή το NAT τις συνενώνει σε μία πηγή. Οι εφικτές μορφές είναι ένας πελάτης στον χώρο ονομάτων κάθε κοντέινερ ή ένα sidecar που κατέχει τη σήραγγα και μοιράζεται τη στοίβα του, και τα δύο αλλάζουν τον τρόπο διευθυνσιοδότησης της εφαρμογής.
Λίστα ελέγχου πριν κλείσετε το εισιτήριο: προσδιορίστε τον χώρο ονομάτων που κατέχει τη σήραγγα, αποδείξτε τη διαδρομή με δίκτυο host, αντιστοιχίστε μόνο τη συσκευή tun που χρειάζεστε, θυμηθείτε τη διεύθυνση πηγής μετά το NAT, ορίστε τον resolver ρητά και αντιμετωπίστε τις διευθύνσεις εξόδου ανά κοντέινερ ως αρχιτεκτονική απόφαση και όχι ως σημαία.