Ο host συνεχίζει να απαντά στο SSH αφού ανέβει ένα VPN πλήρους σήραγγας, ενώ μια υπηρεσία δημοσιευμένη μέσω Docker στο ίδιο μηχάνημα σωπαίνει. Δεν υπάρχει πρόβλημα στον listener: το container τρέχει, η αντιστοίχιση θύρας υπάρχει και το πακέτο φτάνει. Το container είναι υγιές και το αίτημα πράγματι το φτάνει. Αυτό που διαφέρει είναι από πού ξεκινά η απάντηση όταν το Linux επιλέγει τη διαδρομή του, και αυτή η διαφορά καθορίζει ποιο από τα δύο σχέδια παρακάτω χρειάζεστε.

Ακολουθήστε την πλειάδα μέσα από το NAT προορισμού

Πάρτε έναν host στη διεύθυνση 192.0.2.10 που δημοσιεύει TCP 2222 σε ένα container στη διεύθυνση 172.30.240.5:22. Ένα αίτημα από 198.51.100.25 μεταφράζεται πριν φτάσει στο container, και το container απαντά ως εαυτός.

WAN request:      198.51.100.25 -> 192.0.2.10:2222
after DNAT:       198.51.100.25 -> 172.30.240.5:22
container reply:  172.30.240.5:22 -> 198.51.100.25

Στην απόφαση δρομολόγησης του host η απάντηση εξακολουθεί να φέρει τη διεύθυνση προέλευσης του container. Η αντίστροφη μετάφραση αποκαθιστά αργότερα τη δημοσιευμένη πλειάδα, και γι' αυτό το πακέτο φαίνεται λάθος ακριβώς τη στιγμή που επιλέγεται η διαδρομή.

Γιατί ένας κανόνας μόνο για τον host το χάνει

Ένας κανόνας που επιλέγει τον πίνακα WAN μόνο για πακέτα από 192.0.2.10 καλύπτει τους δικούς του δαίμονες του host και χάνει εντελώς αυτή την προωθημένη απάντηση. Η διεύθυνση προέλευσης στην απάντηση είναι 172.30.240.5, όχι ο host.

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

Η αντιστοίχιση μετά το DNAT είναι άλλο hook

Η τεκμηρίωση του Docker για τα firewalls σημειώνει ότι το συνηθισμένο φιλτράρισμα χρήστη βλέπει τον προορισμό μετά το DNAT, οπότε η αντιστοίχιση της δημοσιευμένης θύρας 2222 σε έναν κανονικό κανόνα δεν είναι το ίδιο με την αντιστοίχιση της θύρας 22 του container. Αν η αρχική πλειάδα έχει σημασία, χρησιμοποιήστε τον υποστηριζόμενο μηχανισμό αρχικού προορισμού αντί να μαντεύετε ποια θύρα είναι ορατή.

Αυτή η σύγχυση hook παράγει κανόνες που φαίνονται σωστοί και δεν ταιριάζουν ποτέ. Ελέγξτε τους μετρητές στον ίδιο τον κανόνα πριν ξαναγράψετε την πολιτική. Ένας κανόνας με μηδέν χτυπήματα σας λέει ότι αξιολογείται κάπου όπου το πακέτο δεν φτάνει ποτέ.

Σχέδιο A: μεταφέρετε την απόφαση ως κατάσταση σύνδεσης

Ένα σημάδι σύνδεσης μπορεί να μεταφέρει την απόφαση εισόδου μέσα από τη μετάφραση, αλλά πρέπει να αποκατασταθεί στο πακέτο πριν από την αναζήτηση διαδρομής που έχει σημασία. Τα στάδια είναι:

  1. Δεσμεύστε ένα πεδίο σημαδιού και προτεραιότητα κανόνα που δεν συγκρούονται με το Docker, το VPN ή άλλον κάτοχο πολιτικής.
  2. Προσδιορίστε μόνο την επιδιωκόμενη νέα σύνδεση WAN σε σημείο πριν από το DNAT όπου είναι διαθέσιμη η παρακολούθηση συνδέσεων.
  3. Καταγράψτε την απόφαση στο σημάδι σύνδεσης, χωρίς να εξαναγκάσετε το ίδιο το αρχικό αίτημα στον πίνακα WAN.
  4. Στην κατεύθυνση της απάντησης, αποκαταστήστε μόνο τα δικά σας bits σημαδιού στο πακέτο πριν από τη δρομολόγηση.
  5. Επιλέξτε έναν πλήρη πίνακα WAN αρκετά νωρίς ώστε ένας κανόνας VPN να μην μπορεί να κερδίσει πρώτος.

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

Σχέδιο B: τερματίστε στον host

Ένα σκόπιμα διαμορφωμένο frontend στην πλευρά του host, όπως ένας διακομιστής μεσολάβησης TCP ή ένας αντίστροφος διακομιστής μεσολάβησης μπροστά από το container, κρατά την απάντηση να προέρχεται από τη διεύθυνση του host. Τότε οι κανόνες που γράφτηκαν για τον host συμπεριφέρονται όπως αναμένεται, και το container μένει στο ιδιωτικό του δίκτυο.

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

Επαληθεύστε την αλλαγή, όχι την πρόθεση

Ανοίξτε μια νέα εξουσιοδοτημένη σύνδεση από τη δημόσια πλευρά και επιβεβαιώστε ότι η απάντηση φεύγει από τη διεπαφή που θέλετε. Στη συνέχεια ελέγξτε ότι ένα άσχετο αίτημα που ξεκίνησε το container εξακολουθεί να ακολουθεί το VPN.

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

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