Γιατί μια VPN κολλάει στις μεγάλες μεταφορές και όχι στις μικρές
Τα μικρά αιτήματα απαντούν ενώ οι μεγάλες μεταφορές παγώνουν. Συγκρίνετε το όριο διεπαφής, το όριο διαδρομής και το δηλωμένο ωφέλιμο φορτίο TCP πριν αντιγράψετε σταθερό MTU.
Μια σελίδα φορτώνει, ένα ping πετυχαίνει, και η αντιγραφή ενός αρχείου κολλάει κάθε φορά στο ίδιο σημείο. Αυτό το μοτίβο δείχνει μέγεθος πακέτου και όχι εύρος ζώνης ή διαπιστευτήρια. Η ενθυλάκωση προσθέτει byte σε κάθε πακέτο, οπότε ένα ωφέλιμο φορτίο που χωρούσε στην αρχική διαδρομή μπορεί να ξεπεράσει το όριο όταν περάσει από σήραγγα. Σε αυτές τις συζητήσεις τρεις διαφορετικοί αριθμοί ονομάζονται MTU, και η σύγχυσή τους οδηγεί σε μια ρύθμιση που διορθώνει τη μία εφαρμογή και σπάει την άλλη.
Τρεις αριθμοί που οι άνθρωποι αποκαλούν MTU
Το MTU διεπαφής είναι το ρυθμισμένο όριο για ένα πακέτο σε εκείνη τη ζεύξη. Το MTU διαδρομής είναι το μικρότερο όριο κατά μήκος της διαδρομής και ανακαλύπτεται αντί να ρυθμίζεται. Το TCP MSS είναι το μέγεθος ωφέλιμου φορτίου που ένας ομότιμος δηλώνει ότι μπορεί να δεχτεί, και προκύπτει από τα άλλα δύο αντί να είναι ξεχωριστό φυσικό όριο.
Μια σήραγγα έχει εσωτερική και εξωτερική όψη. Το εξωτερικό πακέτο μεταφέρει το ενθυλακωμένο συν όσες κεφαλίδες χρειάζεται το πρωτόκολλο, άρα το χρησιμοποιήσιμο εσωτερικό μέγεθος είναι μικρότερο από αυτό που επιτρέπει η εξωτερική διαδρομή. Η διαδρομή προς τον διακομιστή VPN διαφέρει επίσης από τη διαδρομή του διακομιστή προς τον προορισμό.
Η ανακάλυψη MTU διαδρομής επιτρέπει σε έναν αποστολέα να μάθει το μέγεθος που λειτουργεί, αλλά εξαρτάται από την άφιξη ανατροφοδότησης. Όταν μια ενδιάμεση συσκευή φιλτράρει τα σχετικά μηνύματα ICMP, ο αποστολέας συνεχίζει να στέλνει πακέτα που δεν ολοκληρώνονται ποτέ, και αυτή είναι η κλασική μαύρη τρύπα. Το σύμπτωμα είναι χαρακτηριστικό μόλις το ξέρεις: η χειραψία πετυχαίνει, το πρώτο φορτίο πλήρους μεγέθους εξαφανίζεται, και η σύνδεση τελικά επαναφέρεται ή κολλάει. Τίποτα στο αρχείο καταγραφής της εφαρμογής δεν μοιάζει με πρόβλημα δικτύου.
Ελέγξτε τη διαδρομή με φορτίο που ελέγχετε
Μια δοκιμή είναι απόδειξη για μία διαδρομή και ένα μέγεθος, όχι προτεινόμενη ρύθμιση. Χρησιμοποιήστε έναν κεντρικό υπολογιστή που απαντά και αλλάξτε μόνο το μέγεθος του φορτίου.
ping -M do -s 1372 -c 2 203.0.113.20 ping -4 -f -l 1372 vpn.example
Η πρώτη εντολή στέλνει δοκιμή Linux με απενεργοποιημένη κατάτμηση και φορτίο 1372 byte, και η δεύτερη κάνει το ίδιο στα Windows όπου το φορτίο ορίζεται με -l. Μια απάντηση σημαίνει ότι αυτό το μέγεθος επέζησε της διαδρομής. Ένα μήνυμα ότι απαιτείται κατάτμηση είναι κατατοπιστικό, ενώ ένα timeout είναι διφορούμενο επειδή ο κεντρικός υπολογιστής ή μια ενδιάμεση συσκευή μπορεί απλώς να απορρίψει το ICMP.
Κατεβάστε το μέγεθος σε λίγα βήματα αντί να κάνετε δυαδική αναζήτηση μέχρι το byte. Προσπαθείτε να διαπιστώσετε αν υπάρχει ανώτατο όριο μεγέθους, όχι να δημοσιεύσετε έναν αριθμό για κάθε δίκτυο. Ο αριθμός που θα βρείτε ισχύει για αυτή τη διαδρομή, αυτό το πρωτόκολλο και αυτή την οικογένεια διευθύνσεων.
Τα IPv4 και IPv6 κατατμίζονται διαφορετικά, άρα ένα αποτέλεσμα δοκιμής από τη μία οικογένεια δεν λέει τίποτα για την άλλη. Δοκιμάστε την οικογένεια που χρησιμοποιεί πραγματικά η εφαρμογή.
Το clamping MSS βοηθά μόνο το TCP
Στο TCP το πραγματικό φορτίο διαπραγματεύεται κατά τη χειραψία, και ένας δρομολογητής στη διαδρομή μπορεί να ξαναγράψει αυτή την τιμή προς τα κάτω ώστε και τα δύο άκρα να στέλνουν μικρότερα τμήματα. Αυτό κάνει το clamping MSS, και λειτουργεί χωρίς να αγγίξει καθόλου τον πελάτη.
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ip link show tun0
Ο πρώτος κανόνας περιορίζει το δηλωμένο MSS στο MTU διαδρομής για τις προωθούμενες χειραψίες TCP, και ο δεύτερος δείχνει το δικό του MTU της διεπαφής σήραγγας ώστε να το συγκρίνετε με αυτό που επιτρέπει η διαδρομή. Το clamping είναι η λιγότερο επεμβατική διόρθωση για μια εφαρμογή TCP που κολλάει μετά τη χειραψία.
Για UDP δεν κάνει τίποτα. Ένας πελάτης φωνής ή παιχνιδιού που στέλνει μεγάλα datagram θα αγνοήσει εντελώς μια ρύθμιση MSS, επειδή δεν υπάρχει χειραψία για να ξαναγραφτεί. Αν η εφαρμογή που αποτυγχάνει είναι UDP, κοιτάξτε αντί γι' αυτό τις επιλογές μεγέθους πακέτου του ίδιου του πελάτη. Τα δύο πρωτόκολλα αποτυγχάνουν διαφορετικά και επισκευάζονται με διαφορετικά εργαλεία, γι' αυτό το πρωτόκολλο ανήκει στην πρώτη πρόταση του δελτίου.
OpenVPN εκθέτει επιλογές όπως tun-mtu, mssfix και ρυθμίσεις σχετικές με κατάτμηση, και η συμπεριφορά τους εξαρτάται από την έκδοση και από το αν το κανάλι δεδομένων είναι AEAD. Διαβάστε το εγχειρίδιο για την έκδοση που χρησιμοποιείται και αλλάξτε μία επιλογή κάθε φορά.
Αλλάξτε μία υποστηριζόμενη ρύθμιση και επαναλάβετε και τις δύο δοκιμές
Κρατήστε το αρχικό προφίλ, αλλάξτε μία υποστηριζόμενη τιμή και επαναλάβετε και το μικρό αίτημα που λειτουργούσε και τη μεγάλη μεταφορά που απέτυχε. Αν αλλάζει μόνο η μεγάλη, κυνηγούσατε το μέγεθος. Αν αλλάζουν και οι δύο, κάτι άλλο κινήθηκε μαζί της.
Μια χαμηλότερη τιμή μπορεί να μειώσει το σύμπτωμα προσθέτοντας επιβάρυνση, άρα ο μικρότερος δυνατός αριθμός δεν είναι ο στόχος. Ο στόχος είναι ένα μέγεθος που η διαδρομή μεταφέρει αξιόπιστα με τη λιγότερη σπατάλη. Σημειώστε την τιμή, τη διαδρομή και την έκδοση του πελάτη στο δελτίο, γιατί ο ίδιος αριθμός που εφαρμόζεται αλλού είναι εικασία.
Αν το ίδιο προφίλ λειτουργεί από άλλο αξιόπιστο δίκτυο, κρατήστε αυτή τη διαφορά στη διάγνωση αντί να κηρύξετε τον πελάτη διορθωμένο. Η μεταβλητή που άλλαξε είναι η διαδρομή, και η διαδρομή είναι αυτό που μέτρησε η δοκιμή.