Γιατί ο πλήρης αποκλεισμός του ICMP σπάει μια λειτουργική διαδρομή VPN
Τα μηνύματα ανάδρασης μεγέθους δεν είναι απαντήσεις ping. Όταν δεν φτάνουν ποτέ, τα μικρά πακέτα περνούν, τα μεγάλα εξαφανίζονται και η σήραγγα μοιάζει να τρεμοπαίζει.
Μια σήραγγα που περνά έλεγχο ταυτότητας, μεταφέρει ένα ping και μετά κολλάει στην πρώτη μεγάλη μεταφορά είναι το κλασικό σημάδι ενός μηνύματος ICMP που λείπει και όχι ενός χαλασμένου VPN. Ο αποστολέας δεν μαθαίνει ποτέ ότι ένα πακέτο ήταν πολύ μεγάλο, επαναλαμβάνει το ίδιο μέγεθος και η εφαρμογή περιμένει. Η διόρθωση είναι απόφαση πολιτικής τείχους προστασίας, όχι επανεγκατάσταση του πελάτη. Η σειρά έχει σημασία: μετρήστε πού βρίσκεται το όριο μεγέθους και μετά περιορίστε τον κανόνα που κατάπιε την αναφορά.
Τι μεταφέρει στην πραγματικότητα το ICMP σε αυτή τη διαδρομή
Ανακάλυψη MTU διαδρομής IPv4 βασίζεται στο να αναφέρει ένας δρομολογητής ότι ένα πακέτο με το bit don't-fragment ενεργό δεν μπόρεσε να προωθηθεί. Αυτή η αναφορά είναι μήνυμα ICMP Fragmentation Needed και χωρίς αυτό ο αποστολέας δεν έχει λόγο να μειώσει το μέγεθος του τμήματός του. Το IPv6 είναι αυστηρότερο: οι δρομολογητές δεν κατακερματίζουν κατά τη διέλευση, άρα το μήνυμα ICMPv6 Packet Too Big είναι το μόνο σήμα που κάνει τον αποστολέα να συρρικνωθεί.
Και τα δύο μηνύματα είναι ανάδραση επιπέδου ελέγχου και κανένα δεν είναι διαγνωστική ηχώ. Μια πολιτική που μπλοκάρει το ping και μια που μπλοκάρει όλο το ICMP μοιάζουν σε μια λίστα κανόνων και συμπεριφέρονται πολύ διαφορετικά στο δίκτυο. Η δεύτερη μπορεί να μετατρέψει μια σωστά διαστασιολογημένη σήραγγα σε μονόδρομη διαδρομή για οτιδήποτε μεγαλύτερο από τον μικρότερο κρίκο της αλυσίδας.
Ορισμένα μεταγωγικά υλοποιούν τη δική τους ανακάλυψη με πακέτα ανίχνευσης, όπως περιγράφει το RFC 4821, και εξαρτώνται λιγότερο από αυτή την ανάδραση. Αυτό είναι επιχείρημα να ελέγξετε ποιο μεταγωγικό τρέχετε, όχι να υποθέσετε ότι κάθε σήραγγα είναι άτρωτη.
| Μήνυμα | Σκοπός στη διαδρομή | Αν μπλοκαριστεί |
|---|---|---|
| ICMPv4 τύπος 3 κωδικός 4 | Το πακέτο ήταν πολύ μεγάλο για τον επόμενο κρίκο | Ο αποστολέας επαναλαμβάνει και κολλάει |
| ICMPv6 τύπος 2 | Packet Too Big, το αντίστοιχο του IPv6 | Ίδιο κόλλημα, χωρίς εφεδρική κατάτμηση |
| ICMP τύπος 11 | Ο χρόνος εξαντλήθηκε, το χρησιμοποιεί το traceroute | Τα διαγνωστικά χάνουν άλματα, η κίνηση συνεχίζει να ρέει |
| Αίτημα και απάντηση ηχούς ICMP | Δοκιμή προσβασιμότητας | Το ping αποτυγχάνει, η διαδρομή μπορεί να είναι εντάξει |
Η αποτυχία εξαρτάται από το μέγεθος
Ρωτήστε αν η αποτυχία συσχετίζεται με το μέγεθος του πακέτου. Μια σελίδα σύνδεσης, ένα ερώτημα DNS και μια σύντομη κλήση API πετυχαίνουν, ενώ μια μεταφόρτωση αρχείου, μια μεγάλη απάντηση ή μια λήψη εικόνας κολλάνε. Αυτό το μοτίβο δείχνει ένα όριο μεγέθους κάπου ανάμεσα στα δύο άκρα και όχι έλεγχο ταυτότητας ή δρομολόγηση. Ένα επιτυχημένο μικρό ping δεν λέει σχεδόν τίποτα για το πού βρίσκεται αυτό το όριο.
Μέσα σε μια σήραγγα υπάρχουν δύο επίπεδα που πρέπει να ληφθούν υπόψη: το πακέτο ωφέλιμου φορτίου και το εξωτερικό ενθυλακωμένο πακέτο. Ο εσωτερικός αποστολέας μπορεί να συμπεριφέρεται σωστά ενώ η εξωτερική διαδρομή είναι μικρότερη από ό,τι υποθέτει η σήραγγα, γι' αυτό μετράνε και η δική της ρύθμιση MTU και ο φυσικός κρίκος από κάτω.
Μετρήστε πριν επεξεργαστείτε κανόνες
Ανιχνεύστε με το bit don't-fragment και μέγεθος ωφέλιμου φορτίου που επιλέγετε εσείς, από τον προβληματικό πελάτη προς μια προστατευμένη διεύθυνση:
ping -M do -s 1472 10.20.5.7
ping -M do -s 1300 10.20.5.7
Ωφέλιμο φορτίο 1472 byte συν 28 byte κεφαλίδων είναι πακέτο 1500 byte. Αν η μεγάλη ανίχνευση αποτύχει με σφάλμα κατάτμησης και η μικρότερη περάσει, βρήκατε το όριο· προσαρμόστε για την επιβάρυνση της σήραγγας και επαναλάβετε μέχρι το λειτουργικό μέγεθος να σταθεροποιηθεί.
Έπειτα επιβεβαιώστε ότι το κενό είναι η ίδια η αναφορά. Αν η ανίχνευση αποτύχει σιωπηλά, χωρίς σφάλμα και χωρίς απάντηση, το μήνυμα πιθανότατα απορρίπτεται αντί να παραδίδεται και ο ύποπτος είναι ο κανόνας.
Περιορίστε τον κανόνα και μετά δοκιμάστε ξανά την εργασία
Η διόρθωση πρέπει να επιτρέπει τα συγκεκριμένα μηνύματα ελέγχου, όχι ολόκληρο το πρωτόκολλο. Σε κεντρικό υπολογιστή με iptables η μορφή είναι αποδοχή για συγκεκριμένο τύπο· προσαρμόστε τη σύνταξη σε ό,τι διαχειρίζεται το τείχος προστασίας στην πλατφόρμα σας:
iptables -I INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
ip6tables -I INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
Αφήστε τις απαντήσεις ηχούς μπλοκαρισμένες αν αυτή είναι η τοπική πολιτική, αφού η διαδρομή δεν τις χρειάζεται. Έπειτα δοκιμάστε ξανά τη μεταφορά που απέτυχε αρχικά, από νέα σύνδεση, και επιβεβαιώστε ότι οι μετρητές του κανόνα δείχνουν τα μηνύματα να φτάνουν.
Αν η μεγάλη μεταφορά κολλάει ακόμη και αφού επιτραπούν τα μηνύματα, το υπόλοιπο όριο βρίσκεται αλλού: ένα MTU σήραγγας πολύ ψηλά, ένας διαμεσολαβητής που ξαναγράφει πακέτα ή ένα ενδιάμεσο κουτί που απορρίπτει αντί να αναφέρει. Ο κανόνας ICMP ήταν απαραίτητος, όχι αρκετός.