Μαύρη τρύπα MTU: γιατί τα μικρά αιτήματα λειτουργούν αλλά τα ανεβάσματα κολλάνε
Τα μικρά αιτήματα ολοκληρώνονται ενώ ένα μεγάλο ανέβασμα κρέμεται για πάντα, και ο αποστολέας δεν μαθαίνει ποτέ ότι η διαδρομή είναι στενότερη. Μετρήστε το ακριβές μέγεθος όπου σπάει.
Μια σελίδα φορτώνει, μια μικρή κλήση API επιστρέφει και μετά ένα ανέβασμα αρχείου κρέμεται μέχρι να τα παρατήσει ο πελάτης. Τίποτα στο αρχείο καταγραφής του διακομιστή δεν το εξηγεί, γιατί τα πακέτα απορρίφθηκαν στη μέση της διαδρομής χωρίς να σταλεί πίσω μια χρήσιμη απάντηση. Αυτό το μοτίβο είναι μια μαύρη τρύπα MTU: ένας σύνδεσμος στενότερος από ό,τι υποθέτει ο αποστολέας, μαζί με μια σιωπηλή άρνηση να το πει. Το μέγεθος που αποτυγχάνει είναι επαναλήψιμο, και αυτό είναι που το κάνει διαγνώσιμο.
Τι κάνει την τρύπα μαύρη
Κάθε σύνδεσμος έχει μια μέγιστη μονάδα μετάδοσης, και ένα πακέτο μεγαλύτερο από το όριο του επόμενου άλματος πρέπει είτε να κατακερματιστεί είτε να απορριφθεί με ένα μήνυμα ICMP που το λέει. Η ανακάλυψη MTU της διαδρομής εξαρτάται από το αν αυτό το μήνυμα φτάνει και τηρείται. Το φιλτράρισμα ή η αγνόησή του αφήνει τον αποστολέα να επαναλαμβάνει ένα πακέτο που δεν χωράει ποτέ.
Η ενθυλάκωση το κάνει συνηθισμένο γύρω από VPN, γιατί μια σήραγγα προσθέτει μια εξωτερική κεφαλίδα σε ένα πακέτο που είχε ήδη διαστασιολογηθεί για τον φυσικό σύνδεσμο. Το εσωτερικό πακέτο είναι νόμιμο στα 1500 byte και το ενθυλακωμένο δεν είναι, οπότε πεθαίνει στα σύνορα ενώ τα μικρά πακέτα περνούν. Μια ολοκληρωμένη χειραψία και μια σελίδα σύνδεσης που λειτουργεί αποδεικνύουν μόνο ότι τα μικρά πακέτα λειτουργούν. Το μεγαλύτερο πακέτο που προσπαθεί να στείλει η εφαρμογή είναι αυτό που έχει σημασία.
Βρείτε το μέγεθος όπου σπάει
Αναζητήστε δυαδικά το μέγεθος του ωφέλιμου φορτίου με μια δοκιμή χωρίς κατάτμηση, από έναν κεντρικό υπολογιστή στη μία πλευρά της σήραγγας σε έναν στην άλλη. Το μεγαλύτερο ωφέλιμο φορτίο που περνά είναι το αξιοποιήσιμο MTU διαδρομής σας μείον τα έξοδα της κεφαλίδας.
ping -M do -s 1400 -c 2 192.0.2.20
ping -M do -s 1200 -c 2 192.0.2.20
ping -f -l 1372 192.0.2.20
Ένα ωφέλιμο φορτίο 1472 byte περνά σε μια καθαρή διαδρομή Ethernet 1500 byte μόλις προστεθούν τα 28 byte των κεφαλίδων IPv4 και ICMP. Όταν η ίδια δοκιμή περνά μόνο με μικρότερο ωφέλιμο φορτίο αφού σηκωθεί η σήραγγα, η διαφορά είναι τα έξοδα ενθυλάκωσης, και τα σύνορα της σήραγγας είναι εκεί όπου θα έπρεπε να έχει παραχθεί το μήνυμα απόρριψης. Καταγράψτε και τους δύο αριθμούς, πριν και μετά τη σύνδεση, γιατί αυτό το ζεύγος είναι η απόδειξη. Επαναλάβετε τη δοκιμή για το IPv6 όταν η εφαρμογή το χρησιμοποιεί, αφού η κεφαλίδα είναι μεγαλύτερη και το κατώφλι αποτυχίας μετακινείται.
Διαβάστε τα στοιχεία πριν κατηγορήσετε τη σήραγγα
Σφάλματα απομακρυσμένων εφαρμογών, συμφόρηση και συνηθισμένη απώλεια κολλάνε επίσης τα ανεβάσματα, οπότε μια αποτυχημένη μεταφορά δεν ταυτοποιεί μια μαύρη τρύπα. Αυτό που τα χωρίζει είναι η σχέση μεγεθών: μια επαναλήψιμη επιτυχία στα 1200 byte και ένα επαναλήψιμο κόλλημα στα 1400 byte, στην ίδια κατεύθυνση, μέσα από το ίδιο τελικό σημείο.
Μια καταγραφή και στα δύο άκρα δείχνει τα μεγάλα πακέτα να φεύγουν και να μη φτάνουν ποτέ, χωρίς απόρριψη ανάμεσά τους. Αυτή είναι η στιγμή να κοιτάξετε τη συσκευή συνόρων αντί για τον διακομιστή, ο οποίος απαντά σε κάθε αίτημα που πράγματι λαμβάνει. Η συμφόρηση επίσης κολλάει, αλλά κολλάει διαφορετικά μεγέθη σε διαφορετικές στιγμές, και αυτό είναι διαφορετική υπογραφή.
Ελέγξτε την επισκευή και στα δύο μεταφορικά
Η υποστηριζόμενη επισκευή είναι να αφήσετε τα σύνορα να αναφέρουν το πραγματικό όριο, ή να περιορίσετε εκεί το μέγιστο μέγεθος τμήματος του TCP ώστε να μην επιχειρείται υπερμέγεθες τμήμα. Το να χαμηλώσετε κάθε MTU στο δίκτυο ή να απενεργοποιήσετε το τείχος προστασίας κρύβει το σύμπτωμα και αφήνει μια διαμόρφωση για την οποία κανείς δεν θα μπορεί να συλλογιστεί αργότερα.
ip link show dev tun0
sudo nft list ruleset | grep -i -E 'mtu|mss'
sysctl net.ipv4.tcp_mtu_probing
ping -M do -s 1400 -c 2 192.0.2.20
Επαληθεύστε με την ίδια δοκιμή μεγέθους, μετά με την εφαρμογή που απέτυχε, και ελέγξτε ένα δεύτερο πρωτόκολλο, γιατί οι εφαρμογές UDP δεν λαμβάνουν ποτέ τη διόρθωση μεγέθους τμήματος του TCP. Κρατήστε τις αρχικές τιμές στο δελτίο, γιατί μια επισκευή που δεν μπορεί να αντιστραφεί είναι ένα δεύτερο πρόβλημα που περιμένει να συμβεί. Αν η δοκιμή μεγέθους περνά και το ανέβασμα ακόμη κολλάει, η μαύρη τρύπα δεν ήταν η αιτία, και η έρευνα πρέπει να προχωρήσει αντί να διευρύνει την αλλαγή.