Το HTTPS σε container μέσα από εταιρικό VPN κολλάει; Δοκιμάστε το σκέλος DTLS
Η σύνδεση μέσα στο container δουλεύει αλλά το HTTPS κολλάει, οπότε δοκιμάστε το κανάλι δεδομένων UDP. Απενεργοποιήστε το DTLS, συγκρίνετε τις δύο ροές και μετά ελέγξτε το MTU πριν κρατήσετε τη σημαία.
Μέσα σε ένα container πίσω από εταιρικό VPN, το DNS επιλύεται, η σελίδα σύνδεσης φορτώνει, ένα endpoint υγείας απαντά και μετά ένα αίτημα HTTPS κολλάει μέχρι να λήξει το χρονικό όριο. Η ανακατασκευή του image και η αλλαγή μεταβλητών proxy δεν αλλάζουν τίποτα, γιατί το κομμάτι που αποτυγχάνει δεν βρίσκεται στο image. Ο πελάτης πιστοποιείται μέσω ενός μεταφορέα και μεταφέρει μαζικά δεδομένα μέσω άλλου, και μόνο ο δεύτερος είναι χαλασμένος.
Δύο μεταφορείς, ένα μπερδεμένο σύμπτωμα
Ένας εταιρικός πελάτης βασισμένος σε TLS συνήθως πιστοποιείται μέσω μιας συνηθισμένης σύνδεσης TLS και μετά διαπραγματεύεται ένα δεύτερο κανάλι δεδομένων βασισμένο σε UDP για τη συνεδρία. Όταν αυτό το δεύτερο σκέλος δουλεύει, η απόδοση και η καθυστέρηση βελτιώνονται. Όταν φιλτράρεται ή δεν χωρά στη διαδρομή, όλα πριν τη μαζική μεταφορά πετυχαίνουν και η ίδια η μεταφορά σταματά, που είναι ακριβώς το μοτίβο πιο πάνω.
Ένα container δεν αλλάζει αυτή τη διαπραγμάτευση· αλλάζει τη διαδρομή που παίρνουν τα εξωτερικά πακέτα. Ο host μεταφράζει τη ροή του container, οπότε τα datagrams UDP φεύγουν από διαφορετική θύρα προέλευσης από τον τοπικό socket του πελάτη και επιστρέφουν μέσω μιας εγγραφής μετάφρασης που λήγει σε πολύ συντομότερο χρονόμετρο από μια εδραιωμένη ροή TCP. Αν το tunnel δουλεύει στον host και αποτυγχάνει στο container, σύγκρινε αυτές τις δύο ροές πριν κατηγορήσεις την εφαρμογή. Αυτή η σύγκριση ξεκαθαρίζει περισσότερα από κάθε ανακατασκευή image.
Αποφασίστε με πείραμα, όχι με διαίσθηση
Το φθηνότερο πείραμα απενεργοποιεί το κανάλι δεδομένων UDP και επαναλαμβάνει το αίτημα. Χρησιμοποιήστε τον πελάτη γραμμής εντολών αντί για το περιτύλιγμα επιφάνειας εργασίας, ώστε η σημαία να εφαρμοστεί πραγματικά: openconnect vpn.example.net --user=you --interface=tun0 --no-dtls. Αν το αίτημα που κολλούσε τώρα ολοκληρώνεται, το σκέλος DTLS ήταν το πρόβλημα και τα υπόλοιπα θόρυβος.
Επιβεβαιώστε το αποτέλεσμα και προς τις δύο κατευθύνσεις από το ίδιο container, ένα μαζικό αίτημα με τη σημαία και ένα χωρίς. Μια αλλαγή συμπεριφοράς που ακολουθεί τη σημαία είναι απόδειξη· μια σελίδα που τελικά φορτώνει δεν είναι.
Αν η σημαία το διορθώνει, αποφασίστε γιατί
Τρεις συνθήκες παράγουν το ίδιο σύμπτωμα και απαιτούν διαφορετικές αντιδράσεις. Η διαδρομή μπορεί να φιλτράρει εντελώς το UDP, που κάνει τη σημαία τη σωστή μόνιμη απάντηση για αυτό το δίκτυο. Η διαδρομή μπορεί να επιτρέπει UDP αλλά να ρίχνει μεγάλα datagrams, που δείχνει σε MTU και όχι σε φιλτράρισμα. Ή η διαδρομή μπορεί να έχει τόσες απώλειες ώστε το σκέλος UDP να αποδίδει χειρότερα από το TCP, που είναι απόφαση χωρητικότητας και όχι προσβασιμότητας.
Διαχωρίστε τις πριν τεκμηριώσετε μια παράκαμψη. Το φιλτράρισμα επιβιώνει σε κάθε μέγεθος πακέτου, τα προβλήματα MTU εμφανίζονται μόνο πάνω από ένα κατώφλι, και η απώλεια φαίνεται ως επαναμετάδοση και μεταβλητή καθυστέρηση, όχι ως καθαρό κόλλημα. Κάθε δοκιμή περιορίζει την αιτία χωρίς να αλλάζει τη διαμόρφωση του πελάτη.
Ελέγξτε το μέγεθος πακέτου πριν κρατήσετε την παράκαμψη
Αν το μέγεθος είναι η αιτία, η διεπαφή του tunnel δέχεται πακέτα που η διαδρομή δεν μπορεί να μεταφέρει, και το πρόβλημα επιστρέφει σε κάθε μεταφορέα μόλις μεγαλώσουν τα ωφέλιμα φορτία. Συγκρίνετε τις διεπαφές: ip link show tun0 στον host, μετά docker network inspect bridge για να διαβάσετε το MTU που καταγράφεται στις επιλογές δικτύου. Μια γέφυρα container που μένει στα 1500 bytes κάτω από tunnel που μεταφέρει λιγότερα είναι το συνηθισμένο εύρημα.
Δοκιμάστε προς τα πάνω από ένα γνωστό καλό μέγεθος με δοκιμή μη-κατάτμησης μέσα στο tunnel, μετά χαμηλώστε το MTU του δικτύου του container ή συσφίξτε το TCP MSS στο tunnel. Οποιαδήποτε από τις δύο διορθώσεις κάνει συχνά τη διαδρομή UDP ξανά χρησιμοποιήσιμη και αφαιρεί την ανάγκη για τη σημαία, που είναι το καλύτερο αποτέλεσμα όταν το φιλτράρισμα δεν είναι η αιτία.
Αποφασίστε τι είστε πρόθυμοι να ανταλλάξετε
Με το κανάλι δεδομένων απενεργοποιημένο, το tunnel μεταφέρει το φορτίο του μέσα σε σύνδεση TCP. Σε καθαρή διαδρομή αυτό είναι απλώς πιο αργό· σε διαδρομή με απώλειες, ένα χαμένο τμήμα καθυστερεί όλα όσα ακολουθούν και η εξωτερική επαναμετάδοση ανταγωνίζεται την εσωτερική. Αυτή η ανταλλαγή ταιριάζει στη διαδραστική ανάπτυξη και τις μικρές κλήσεις API και ταιριάζει άσχημα σε μαζικές μεταφορές ή μεγάλες συνεδρίες μέσω κινητών ζεύξεων.
Όποια επιλογή κι αν διαλέξετε, καταγράψτε ποιον μεταφορέα χρησιμοποίησε τελικά το tunnel και γιατί. Ένα container που εξαρτάται σιωπηλά από μια σημαία που πρόσθεσε κάποιος μήνες πριν είναι η επόμενη διακοπή, και όποιος την αποσφαλματώνει δεν θα ξέρει αν η σημαία ήταν παράκαμψη για φιλτράρισμα ή απομεινάρι από πείραμα MTU.