Γιατί ένα κοντέινερ macvlan δεν μπορεί να απαντήσει σε πελάτη VPN
Ένα κοντέινερ macvlan δεν μπορεί να μιλήσει με τον δικό του κεντρικό υπολογιστή και οι απαντήσεις του μπορεί να βγουν από τη λάθος πύλη. Προσθέστε μια διαδρομή shim στην πλευρά του υπολογιστή και μετά επιλέξτε ένα μοντέλο πηγής.
Φανταστείτε έναν κεντρικό υπολογιστή Linux που τερματίζει ένα VPN και ταυτόχρονα εκτελεί ένα κοντέινερ σε δίκτυο macvlan. Το LAN είναι 192.168.60.0/24, το κοντέινερ έχει τη διεύθυνση 192.168.60.210 και οι πελάτες VPN έρχονται από το 10.95.0.0/24. Ο πελάτης φτάνει στην υπηρεσία, η απάντηση δεν επιστρέφει ποτέ και κάθε κανόνας τείχους προστασίας στον υπολογιστή φαίνεται σωστός. Δύο ξεχωριστοί περιορισμοί παράγουν αυτό το σύμπτωμα και η διόρθωση του ενός αφήνει τον άλλο στη θέση του.
Δύο περιορισμοί, ένα σύμπτωμα
Ο πρώτος περιορισμός είναι η απομόνωση: ο οδηγός macvlan του Docker δεν επιτρέπει σε ένα κοντέινερ να μιλήσει με τον δικό του υπολογιστή μέσω της γονικής διεπαφής. Η κίνηση ανάμεσα στη στοίβα του υπολογιστή και το κοντέινερ δεν έχει διαδρομή, όποια μορφή κι αν έχουν οι διαδρομές στον υπολογιστή.
Ο δεύτερος περιορισμός είναι η διαδρομή επιστροφής. Η προεπιλεγμένη πύλη του κοντέινερ είναι συνήθως ο δρομολογητής του LAN, οπότε μια απάντηση προς πελάτη VPN βγαίνει από αυτόν τον δρομολογητή. Αν ο δρομολογητής δεν έχει διαδρομή πίσω προς τη δεξαμενή VPN, η απάντηση απορρίπτεται κάπου στη μέση.
Οι δύο βλάβες φαίνονται ίδιες από την πλευρά του πελάτη: ένα αίτημα φτάνει και μια απάντηση δεν έρχεται ποτέ. Χρειάζονται διαφορετικές επισκευές και ένας ευρύς κανόνας masquerade μπορεί να κρύψει ποια από τις δύο είναι ακόμη χαλασμένη. Γι’ αυτό η πρώτη δοκιμή είναι μια καταγραφή στην πλευρά του κοντέινερ και όχι άλλη μια αλλαγή τείχους προστασίας. Αν το αίτημα δεν εμφανιστεί ποτέ εκεί, τότε ισχύει ο περιορισμός της απομόνωσης.
Χτίστε το shim στην πλευρά του υπολογιστή, στενά
Μια δεύτερη διεπαφή macvlan στον υπολογιστή, συνδεδεμένη στον ίδιο γονέα σε λειτουργία γέφυρας, δίνει στη στοίβα του υπολογιστή δική της ταυτότητα σε αυτό το τμήμα του LAN. Δεσμεύστε της μια διεύθυνση έξω από τη δεξαμενή DHCP και έξω από το εύρος του κοντέινερ και δρομολογήστε μόνο το κοντέινερ μέσα από αυτή.
ip link add macvlan-vpn link eth0 type macvlan mode bridge ip address add 192.168.60.250/32 dev macvlan-vpn ip link set macvlan-vpn up ip route add 192.168.60.210/32 dev macvlan-vpn src 192.168.60.250
Η πρώτη εντολή δημιουργεί τη διεπαφή σε λειτουργία γέφυρας, που είναι η τεκμηριωμένη προεπιλογή για αυτόν τον οδηγό και η λειτουργία που θέλετε για κίνηση ανάμεσα στον υπολογιστή και το κοντέινερ. Η δεύτερη εκχωρεί /32 ώστε η διεύθυνση να μην συγκρούεται με το πρόθεμα του LAN και η τέταρτη στέλνει μόνο τη διεύθυνση του κοντέινερ μέσα από το shim.
Μην ανακατευθύνετε ολόκληρο το LAN μέσα από τη νέα διεπαφή. Η συνηθισμένη συνδεδεμένη διαδρομή μένει όπως είναι και η διαδρομή του υπολογιστή είναι στενή επίτηδες, ώστε ένα κοντέινερ να αποκτήσει διαδρομή χωρίς να αλλάξει η συμπεριφορά του υπόλοιπου τμήματος. Μια προεπιλεγμένη διαδρομή προς το shim θα ήταν άλλος σχεδιασμός με άλλες συνέπειες. Κρατήστε την συγκεκριμένη και η ακτίνα ζημιάς μένει μικρή.
Αυτές οι εντολές αλλάζουν τις ρυθμίσεις δικτύου σε έναν ενεργό υπολογιστή. Σε μια συσκευή ή μια διαχειριζόμενη πλατφόρμα, χρησιμοποιήστε τον υποστηριζόμενο μηχανισμό διαμόρφωσης της πλατφόρμας, γιατί μια διαδραστική αλλαγή μέσω root-shell μπορεί να μην επιβιώσει από μια αναβάθμιση.
Αποφασίστε πώς διατηρείται η πηγή
Με το shim στη θέση του, το κοντέινερ μπορεί να φτάσει στον υπολογιστή και το ερώτημα γίνεται ποια διεύθυνση πηγής φέρει η απάντηση. Η διατήρηση της αρχικής πηγής VPN είναι το καθαρότερο μοντέλο: το κοντέινερ βλέπει την πραγματική διεύθυνση του πελάτη και τα αρχεία καταγραφής και οι κανόνες πρόσβασης της υπηρεσίας μπορούν να τη χρησιμοποιήσουν.
Για να λειτουργήσει αυτό, η διαμόρφωση δικτύου του κοντέινερ πρέπει να στέλνει για αυτή τη διαδρομή την κίνηση του 10.95.0.0/24 στη διεύθυνση 192.168.60.250 ως πύλη του. Αυτή είναι μια υποστηριζόμενη ρύθμιση διαδρομής ή πύλης μέσα στη διαμόρφωση του ίδιου του κοντέινερ, όχι ένα τέχνασμα στην πλευρά του υπολογιστή. Επιβεβαιώστε την μέσα από το κοντέινερ αντί να υποθέσετε ότι η ρύθμιση εφαρμόστηκε. Μια προεπιλεγμένη πύλη που δείχνει ακόμη στον δρομολογητή του LAN θα συνεχίσει να στέλνει απαντήσεις στην ίδια τρύπα.
Αν ο εγκεκριμένος σχεδιασμός κρύβει αντίθετα τις πηγές VPN, περιορίστε τη μετάφραση στενά: την πραγματική δεξαμενή VPN, το shim ως διεπαφή εξόδου και το συγκεκριμένο κοντέινερ και την υπηρεσία.
iptables -t nat -A POSTROUTING -s 10.95.0.0/24 -o macvlan-vpn -j SNAT --to-source 192.168.60.250
Αντιστοιχίστε το shim ως διεπαφή εξόδου, όχι το τούνελ. Ένας κανόνας που ονομάζει το τούνελ ως διεπαφή εξόδου δεν θα ταιριάξει με πακέτο που κατευθύνεται προς το κοντέινερ και αυτό είναι το λάθος που συνήθως περιέχει μια τέτοια ρύθμιση. Κρατήστε τον κανόνα τόσο στενό όσο η πρόταση παραπάνω και επανεξετάστε τον όταν αλλάξει η δεξαμενή.
Ελέγξτε από τον πελάτη, όχι από τον υπολογιστή
Ένα αίτημα από τον ίδιο τον υπολογιστή, δεσμευμένο στη διεύθυνση του shim, αποδεικνύει ότι το shim μπορεί να φτάσει στο κοντέινερ. Δεν αποδεικνύει ότι το κοντέινερ μπορεί να επιστρέψει κίνηση σε διατηρημένη πηγή 10.95.0.x, γιατί η διεύθυνση πηγής σε αυτή τη δοκιμή είναι του ίδιου του shim.
curl -sS --interface 192.168.60.250 -o /dev/null -w '%{http_code}\n' http://192.168.60.210:8080/health
sudo tcpdump -ni macvlan-vpn host 192.168.60.210Η πρώτη εντολή δοκιμάζει το σκέλος από τον υπολογιστή προς το κοντέινερ και η δεύτερη δείχνει τι περνά πραγματικά από το shim όσο ένας πραγματικός πελάτης VPN κάνει το αίτημα. Κοιτάξτε τη διεύθυνση πηγής στην πορεία εισόδου και αν εμφανίζεται απάντηση με την ίδια ροή.
Η προώθηση πρέπει να είναι ενεργοποιημένη στον υπολογιστή και η διαδρομή προώθησης χρειάζεται άδεια για τη δεξαμενή VPN προς το shim στη θύρα της υπηρεσίας καθώς και για τις εδραιωμένες απαντήσεις. Ένας κανόνας INPUT στον υπολογιστή δεν εξουσιοδοτεί προωθούμενη κίνηση και αυτός είναι ένας συνηθισμένος λόγος που το πακέτο απορρίπτεται αφού η δρομολόγηση φαίνεται σωστή.
Εκτελέστε την πραγματική εφαρμογή με πραγματικά διαπιστευτήρια και μετά ελέγξτε ότι μια δεύτερη, άσχετη υπηρεσία στο ίδιο κοντέινερ εξακολουθεί να σας αρνείται την πρόσβαση. Αν ο μόνος τρόπος για να λειτουργήσει ήταν να ανοίξετε κάθε κανόνα προώθησης, ο σχεδιασμός δεν έχει ολοκληρωθεί. Σημειώστε και ποια διεύθυνση πηγής κατέγραψε η υπηρεσία, γιατί αυτή θα χρησιμοποιούν οι δικοί της κανόνες πρόσβασης από εδώ και πέρα.