MSS clamping σε πύλη VPN: τι διορθώνει και τι όχι
Το clamping ξαναγράφει το MSS στις χειραψίες TCP ώστε τα τμήματα να χωρούν στο τούνελ. Δεν διορθώνει ποτέ το UDP ούτε έναν χαλασμένο έλεγχο path-MTU. Τρεις έλεγχοι, με σειρά.
Τα μικρά αιτήματα λειτουργούν, οι μεγάλες λήψεις κολλάνε, και κάποιος προτείνει MSS clamping. Η πρόταση είναι αρκετά συχνά σωστή ώστε να αξίζει δοκιμή με τη σωστή σειρά, και αρκετά συχνά λάθος ώστε να σπαταλήσετε ένα απόγευμα αν την εφαρμόσετε στα τυφλά. Οι τρεις έλεγχοι παρακάτω ξεχωρίζουν ένα πραγματικό πρόβλημα μεγέθους TCP από πρόβλημα UDP, από χαλασμένη ανίχνευση path-MTU και από ένα clamp που δεν βλέπει ποτέ τη χειραψία που υποτίθεται ότι ξαναγράφει.
Ξεκινήστε από το σχήμα της βλάβης
Μια βλάβη μεγέθους έχει υπογραφή: η σύνδεση εγκαθίσταται, η πιστοποίηση και οι μικρές απαντήσεις πετυχαίνουν, και μετά μια μεταφορά σταματά επ' αόριστον μόλις χρειαστεί τμήμα πλήρους μεγέθους. Σελίδες που φορτώνουν κείμενο αλλά δεν ολοκληρώνουν ποτέ μια εικόνα είναι η ίδια βλάβη σε μικρότερη κλίμακα. Αν δεν συνδέεται τίποτα καθόλου, το πρόβλημα είναι νωρίτερα στη διαδρομή και το clamping δεν θα βοηθήσει. Ένα clamp δεν μπορεί να επιδιορθώσει μια χειραψία που δεν έφτασε ποτέ.
Η υπογραφή υπάρχει επειδή η χειραψία είναι το σημείο όπου συμφωνείται το μέγεθος τμήματος. Κάθε πλευρά διαφημίζει ένα μέγιστο μέγεθος τμήματος ως επιλογή TCP, και οι αποστολείς σέβονται τη διαφήμιση του ομολόγου. Αν η διαδρομή δεν μπορεί να μεταφέρει τόσο μεγάλο τμήμα, η βλάβη εμφανίζεται αργότερα, όταν ο αποστολέας επιτέλους δοκιμάσει ένα.
Κρατήστε τη μεταφορά στο οπτικό σας πεδίο καθώς διαβάζετε αυτό το σύμπτωμα. Το clamping είναι ξαναγράψιμο επιλογής TCP, οπότε μια φωνητική ή βιντεοκλήση που κολλάει κάτω από το ίδιο τούνελ δεν είναι πρόβλημα MSS και δεν θα βελτιωθεί από αυτό. Γράψτε τη μεταφορά πριν αγγίξετε μια επιλογή TCP.
Κοστολογήστε τη διαδρομή και μετά συγκρίνετέ τη με το τούνελ
Δύο αριθμοί μετρούν και συχνά μπερδεύονται. Το path-MTU είναι το μεγαλύτερο πακέτο που μεταφέρει η διαδρομή χωρίς κατάτμηση, και το διαφημιζόμενο MSS για IPv4 είναι αυτή η τιμή μείον τα 40 byte κεφαλίδων IP και TCP, ή μείον 60 για IPv6. Η ενθυλάκωση του τούνελ καταναλώνει μέρος του προϋπολογισμού πριν καν αρχίσει το εσωτερικό πακέτο.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
Το ping με το bit do-not-fragment σας λέει αν επιβιώνει ένα πακέτο αυτού του μεγέθους ωφέλιμου φορτίου· προσαρμόστε το μέγεθος ώσπου να αποτύχει και βρήκατε εμπειρικά το όριο της διαδρομής. Η έξοδος του tracepath αναφέρει το MTU που ανακαλύφθηκε κατά μήκος της διαδρομής, που είναι ταχύτερο όταν λειτουργεί και λιγότερο αξιόπιστο όταν ένα ενδιάμεσο άλμα φιλτράρει τους ανιχνευτές.
Τώρα αφαιρέστε το κόστος του τούνελ. Μια εξωτερική κεφαλίδα IP, μια κεφαλίδα UDP και μια κεφαλίδα ειδική για το τούνελ βγαίνουν όλες από τα ίδια 1500 byte, άρα το χρησιμοποιήσιμο εσωτερικό MTU σε ένα τυπικό υπόστρωμα Ethernet είναι χαμηλότερο από ό,τι υποδηλώνει ο φυσικός σύνδεσμος. Αν το υπολογισμένο εσωτερικό MTU είναι κάτω από αυτό που διαφημίζουν οι ομόλογοί σας, βρήκατε πραγματικό υποψήφιο για clamp και όχι εικασία. Αν η υπολογισμένη τιμή είναι ήδη πάνω από τη διαφήμιση των ομολόγων, σταματήστε εδώ και κοιτάξτε αλλού.
Τοποθετήστε το clamp εκεί όπου περνά η χειραψία
Ένα clamp λειτουργεί ξαναγράφοντας την επιλογή MSS στα πακέτα SYN και SYN-ACK καθώς διασχίζουν την πύλη. Αν ο κανόνας κάθεται σε διεπαφή που καμία από τις δύο κατευθύνσεις δεν διασχίζει ποτέ, η διαπραγμάτευση ολοκληρώνεται αμετάβλητη και το σύμπτωμα παραμένει, γι' αυτό η τοποθέτηση καθορίζει το αποτέλεσμα περισσότερο από την τιμή.
| Symptom | What it points to | Next check |
|---|---|---|
| Handshake completes, large transfer stalls | Segment size larger than the path can carry | Path MTU against the tunnel's effective MTU |
| Nothing connects, small or large | Routing, firewall or keying failure | Not MSS; look at the tunnel state |
| Only UDP applications stall | Datagram size or a dropped ICMP error | Platform-specific UDP handling, not clamping |
| Fixed after reconnect, returns later | Clamp applied to one direction or one interface | Rule placement and the handshake path |
Η κατεύθυνση είναι το άλλο μισό. Το clamping μίας κατεύθυνσης διορθώνει τις μισές ροές και αφήνει τις υπόλοιπες να αποτυγχάνουν με τρόπο που μοιάζει διακοπτόμενος, οπότε εφαρμόστε το και στις δύο κατευθύνσεις της προωθούμενης κίνησης. Η κλασική μορφή στο Linux για διεπαφή τούνελ είναι ένας κανόνας mangle που ταιριάζει πακέτα SYN:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Προσέξτε τι κάνει στην πραγματικότητα το --clamp-mss-to-pmtu: παράγει την τιμή από το MTU της διαδρομής, που δεν είναι πάντα ο πραγματικός προϋπολογισμός ωφέλιμου φορτίου του τούνελ. Σε τούνελ βασισμένο σε διαδρομή, όπου η εσωτερική διαδρομή και η εξωτερική πορεία διαφέρουν, μια ρητή τιμή υπολογισμένη στον προηγούμενο έλεγχο είναι πιο προβλέψιμη από μια αυτόματη.
Επαληθεύστε με νέα σύνδεση και κρατήστε την ανάδραση ζωντανή
Μια εγκατεστημένη σύνδεση κρατά το MSS που διαπραγματεύτηκε, οπότε η δοκιμή στην ίδια συνεδρία δεν αποδεικνύει τίποτα. Ανοίξτε νέα σύνδεση μετά την αλλαγή και διαβάστε τη διαπραγματευμένη τιμή απευθείας αντί να τη συνάγετε από μια μεταφορά που τυχαίνει να ολοκληρωθεί.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
Η πρώτη εντολή αναφέρει το MSS του socket μαζί με την κατάσταση συμφόρησής του, που είναι η ταχύτερη επιβεβαίωση ότι το clamp ενήργησε. Η δεύτερη επιβεβαιώνει ότι ο κανόνας που νομίζετε ότι προσθέσατε είναι ο κανόνας που υπάρχει, στον πίνακα όπου τοποθετήθηκε.
Έπειτα προστατέψτε τον μηχανισμό που δεν διορθώσατε. Η ανίχνευση path-MTU εξαρτάται από το να φτάνουν τα μηνύματα ICMP fragmentation-needed στον αποστολέα, οπότε ένα τείχος προστασίας που τα απορρίπτει θα συνεχίσει να χαλάει μεγάλες μεταφορές ακόμη και με σωστό clamp. Επιτρέψτε αυτά τα μηνύματα για τη διαδρομή του τούνελ, ή δεχτείτε ότι το clamping αντισταθμίζει μια πολιτική που επιλέξατε.
Τέλος, αντισταθείτε στον πειρασμό να δείτε το clamp ως κουμπί ρύθμισης. Περιορίζει το μέγεθος τμήματος, που κοστίζει ρυθμαπόδοση σε διαδρομές που δεν το χρειάστηκαν ποτέ. Εφαρμοσμένο μετά τους τρεις ελέγχους είναι στοχευμένη επισκευή· εφαρμοσμένο πρώτο είναι αλλαγή που κρύβει την αρχική βλάβη και προσθέτει δεύτερη μεταβλητή σε κάθε επόμενη δοκιμή. Αυτή η ανταλλαγή αξίζει να γίνει σκόπιμα, όχι εξ ορισμού.
Σημειώστε το path-MTU που μετρήσατε, το κόστος τούνελ που αφαιρέσατε, τον κανόνα που προσθέσατε και το MSS που είδατε μετά. Τέσσερις αριθμοί κάνουν το επόμενο περιστατικό αναζήτηση αντί για έρευνα.