Ανακάλυψη MTU διαδρομής μέσω VPN: μέγεθος και το κενό ICMP
Ένα τούνελ μικραίνει το πακέτο που μπορεί να μεταφέρει η διαδρομή, και η ανακάλυψη λειτουργεί μόνο αν φτάσει η ανατροφοδότηση. Μετρήστε, δοκιμάστε και επαληθεύστε τη διαδρομή αντί να μαντεύετε.
Ένα τούνελ ολοκληρώνει τη χειραψία του, τα μικρά αιτήματα επιστρέφουν και η πρώτη μεγάλη μεταφορά κολλάει. Αυτό το μοτίβο δείχνει το MTU διαδρομής πολύ πριν δείξει τη ρυθμαπόδοση. Κάθε ζεύξη κατά μήκος της διαδρομής περιορίζει το μέγεθος του πακέτου, και η ενθυλάκωση ξοδεύει μέρος αυτού του περιθωρίου σε εξωτερικές κεφαλίδες, οπότε το εσωτερικό πακέτο πρέπει να είναι μικρότερο από ό,τι θα υποδήλωνε η ακατέργαστη διαδρομή. Η αποτυχία είναι σιωπηλή, και αυτό ακριβώς την κάνει ακριβή στη διάγνωση.
Τι μετρά πραγματικά το MTU διαδρομής
Το MTU διαδρομής είναι το μικρότερο MTU ζεύξης στη διαδρομή μεταξύ δύο hosts, όχι το MTU που εμφανίζεται στη τοπική σας διεπαφή. Η τοπική τιμή είναι το σημείο όπου αρχίζει η εκτίμηση, και η διαδρομή αποφασίζει πού πρέπει να τελειώσει. Γι' αυτό ένα πανομοιότυπο τούνελ μπορεί να λειτουργεί σε ένα δίκτυο πρόσβασης και να κολλάει σε άλλο: άλλαξε η διαδρομή, όχι η διαμόρφωση. Το να μετράς μία φορά και να υποθέτεις παντού είναι το λάθος που κρατά αυτό το πρόβλημα ζωντανό.
Για ένα τούνελ, ο αριθμός που μετρά είναι το εσωτερικό MTU, δηλαδή το περιθώριο της εξωτερικής διαδρομής μείον ό,τι καταναλώνει η ενθυλάκωση. Το WireGuard προσθέτει μια εξωτερική κεφαλίδα IP και μια κεφαλίδα UDP· άλλα μεταγωγικά προσθέτουν τις δικές τους. Ορίστε το εσωτερικό μέγεθος πολύ ψηλά και κάθε πακέτο πλήρους μεγέθους θα χρειάζεται κατακερματισμό που μπορεί να μη συμβεί ποτέ.
Γιατί ένα τούνελ μικραίνει το χρησιμοποιήσιμο πακέτο
Αν η διεπαφή του τούνελ διατηρεί το MTU της φυσικής ζεύξης, κάθε μεγάλο πακέτο εξαρτάται από το αν κάποιος πιο κάτω είναι πρόθυμος να το κατακερματίσει. Το IPv4 το επιτρέπει καταρχήν, αλλά ένας δρομολογητής στον οποίο έχει δοθεί εντολή να μην κατακερματίζει επιστρέφει σφάλμα. Οι δρομολογητές IPv6 δεν κατακερματίζουν ποτέ κατά τη διέλευση, οπότε η ίδια ρύθμιση συμπεριφέρεται διαφορετικά ανά οικογένεια διευθύνσεων. Σε κάθε περίπτωση ο αποστολέας δεν μαθαίνει τίποτα μέχρι να αναφέρει κάτι πίσω.
Η πρακτική συνέπεια είναι ένα μέγεθος που ταιριάζει στη χειραψία και όχι στο ωφέλιμο φορτίο. Ένα TLS ClientHello ή ένα ερώτημα DNS είναι αρκετά μικρά ώστε να διασχίσουν μια συρρικνωμένη διαδρομή ανέπαφα, ενώ μια μαζική μεταφορά δεν είναι. Γι' αυτό τα συμπτώματα συγκεντρώνονται γύρω από συγκεκριμένες λειτουργίες και όχι συγκεκριμένους hosts.
Η ανακάλυψη λειτουργεί μόνο όταν φτάσει η ανατροφοδότηση
Η ανακάλυψη IPv4 βασίζεται στο bit απαγόρευσης κατακερματισμού: ένας δρομολογητής που δεν μπορεί να προωθήσει το πακέτο επιστρέφει ICMP fragmentation-needed με το MTU του επόμενου άλματος, και ο αποστολέας μειώνει την εκτίμησή του. Το IPv6 χρησιμοποιεί αντί γι' αυτό μηνύματα Packet Too Big, επειδή οι δρομολογητές δεν κατακερματίζουν κατά τη διέλευση. Και οι δύο μηχανισμοί υποθέτουν ότι το μήνυμα βρίσκει τον δρόμο πίσω στον αποστολέα, μέσα από το τούνελ και πέρα από οποιοδήποτε τείχος προστασίας στην επιστροφή. Όταν αυτή η υπόθεση αποτυγχάνει, ο αποστολέας συνεχίζει να δοκιμάζει ένα μέγεθος που η διαδρομή δεν μπορεί να μεταφέρει.
Ένα τείχος προστασίας που επιτρέπει echo request και echo reply δεν έχει κατ' ανάγκη επιτρέψει αυτούς τους τύπους σφάλματος. Το ICMP είναι μια οικογένεια, και τα μέλη που μετράνε εδώ είναι τα σφάλματα, όχι το ζεύγος echo. Ελέγξτε την πολιτική ελέγχου κίνησης και στα δύο άκρα του τούνελ και στη διαδρομή μεταξύ τους, και ακολουθήστε τις υποστηριζόμενες οδηγίες της πλατφόρμας αντί να επιτρέπετε κάθε τύπο ICMP παντού.
Το ίδιο φιλτράρισμα μπορεί να βρίσκεται μέσα στο τούνελ. Αν η εσωτερική διαδρομή απορρίπτει το σφάλμα αλλά η εξωτερική το μεταφέρει, ο αποστολέας μπορεί να προσαρμοστεί σε ένα όριο που η ενθυλακωμένη κίνηση δεν βλέπει ποτέ πραγματικά.
Δοκιμάστε τη διαδρομή αντί να μαντεύετε έναν αριθμό
Κρατήστε σταθερά τον προορισμό, το δίκτυο πρόσβασης και το τούνελ, και μεταβάλετε μόνο το μέγεθος του πακέτου. Μια δοκιμή απαγόρευσης κατακερματισμού που αποτυγχάνει με υπόδειξη MTU σας δίνει το όριο του επόμενου άλματος· επαναλάβετε μέχρι να περάσει ένα μέγεθος και καταγράψτε και το μέγεθος και την οικογένεια διευθύνσεων.
ping -M do -s 1400 10.60.20.10
ping -M do -s 1300 10.60.20.10
ping -6 -M do -s 1300 2001:db8::10
Ένα ping που ταιριάζει δεν αποδεικνύει ότι τα τμήματα πλήρους μεγέθους μιας πραγματικής εφαρμογής ταιριάζουν, γι' αυτό επαναλάβετε τη δοκιμή με τη μεταφορά που απέτυχε πραγματικά. Συγκρίνετε τη μεγαλύτερη δοκιμή που λειτουργεί με το MTU του τούνελ που διαμορφώσατε, και κρατήστε τους δύο αριθμούς χωριστούς στις σημειώσεις σας. Αν διαφέρουν κατά περίπου μια κεφαλίδα, βρήκατε το κόστος της ενθυλάκωσης και όχι βλάβη.
Το PLPMTUD, που περιγράφεται στο RFC 4821, κάνει δοκιμές προς τα πάνω και χρησιμοποιεί επιβεβαιώσεις μεταφοράς αντί να εμπιστεύεται τα σφάλματα που παραδίδονται. Βοηθά σε διαδρομές που φιλτράρουν ICMP, αλλά η υποστήριξη ποικίλλει ανά στοίβα και εφαρμογή. Μια ροή TCP μπορεί να ανακάμψει μόνη της, ενώ μια εφαρμογή UDP με σταθερό μέγεθος datagram συνεχίζει να αποτυγχάνει.
Επιλέξτε μια τιμή και καταγράψτε το σκεπτικό
Η μείωση του MTU του τούνελ είναι ταυτόχρονα διαγνωστικό και θεμιτή διόρθωση μόλις γνωρίζετε τη διαδρομή. Δεν υποκαθιστά τη γνώση του ποια διαδρομή και ποιος μηχανισμός ανατροφοδότησης εμπλέκονταν, γιατί μια τιμή ρυθμισμένη για κινητή ζεύξη θα είναι άσκοπα μικρή σε σύνδεση οπτικής ίνας. Καταγράψτε το επιλεγμένο μέγεθος, τη δοκιμή που το δικαιολόγησε και το βήμα επαναφοράς.
Ο μηχανισμός IPv4 περιγράφεται στο RFC 1191 και η καθοδήγηση πακετοποίησης IPv6 στο RFC 8201· η αναφορά και των δύο εμποδίζει τον επόμενο μηχανικό να ξαναβγάλει την υπόθεση. Αν η μεταφορά εξακολουθεί να κολλάει στο μέγεθος που επιλέξατε, σταματήστε να μειώνετε τον αριθμό και κοιτάξτε το επόμενο επίπεδο. Μια διαδρομή που αποτυγχάνει σε κάθε μέγεθος δεν είναι πρόβλημα MTU.