Ο κανόνας δρομολόγησης διαβάζει το σημάδι του πακέτου, όχι το conntrack
Η δρομολόγηση βάσει πολιτικής διαβάζει το σημάδι του πακέτου· το conntrack αποθηκεύει διαφορετική τιμή με μεγαλύτερη διάρκεια ζωής. Η αντιγραφή μεταξύ τους είναι ένα βήμα που κάποιος πρέπει να γράψει.
Τέσσερις έλεγχοι χωρίζουν έναν κανόνα σημαδιού που λειτουργεί από μια διαδρομή που λειτουργεί: ποιο σημάδι διαβάζει ο κανόνας, αν το πακέτο το φέρει ακόμη κατά την αναζήτηση, αν ένα σημάδι σύνδεσης αποκαταστάθηκε σε μεταγενέστερα πακέτα και αν η μάσκα και η προτεραιότητα του αντίστοιχου κανόνα τής επιτρέπουν να ενεργοποιηθεί. Ένας μετρητής που αυξάνεται αποδεικνύει μόνο ότι κάποιος κανόνας ταίριαξε με κάτι. Δεν λέει τίποτα για το τι έφερε το πακέτο όταν ο πυρήνας διάλεξε τη διαδρομή του.
Τα δύο σημάδια ζουν σε διαφορετικά σημεία και λήγουν με διαφορετικά χρονοδιαγράμματα.
Δύο σημάδια, δύο ζωές
Ένα σημάδι πακέτου ανήκει σε ένα skb, ταξιδεύει μαζί του μέσα από τα hooks και καταναλώνεται από τον επιλογέα fwmark της δρομολόγησης βάσει πολιτικής. Ένα σημάδι σύνδεσης ανήκει στην καταχώριση conntrack, παραμένει σε όλα τα πακέτα αυτής της ροής και είναι αόρατο στον κανόνα δρομολόγησης μέχρι κάτι να το αντιγράψει πίσω. Η αποθήκευση ενός σημαδιού πακέτου στη σύνδεση είναι αποθήκευση· η αποκατάστασή του είναι ξεχωριστή ενέργεια. Κανένα από τα δύο δεν γίνεται αυτόματα.
Γι' αυτό ένα σύνολο κανόνων μπορεί να φαίνεται συνεπές ενώ η απόφαση δρομολόγησης βλέπει μηδέν: η τιμή αποθηκεύτηκε και τίποτα δεν την αποκατέστησε.
Η αντιγραφή μεταξύ τους είναι βήμα που γράφετε εσείς
Οι δύο δηλώσεις που μετράνε κινούνται σε αντίθετες κατευθύνσεις: η μία αποθηκεύει το σημάδι του πακέτου στη σύνδεση, η άλλη φορτώνει το σημάδι της σύνδεσης στο πακέτο. Ποια χρειάζεστε εξαρτάται από το πότε γίνεται η ταξινόμηση σε σχέση με τη ροή. Ένας σχεδιασμός μπορεί να χρειάζεται μόνο το σημάδι του πακέτου, και το να προσθέσετε σήμανση conntrack επειδή κάποια λύση ανάγκης χρησιμοποιούσε και τα δύο είναι ο τρόπος με τον οποίο μια απλή πολιτική αποκτά δεύτερη λειτουργία αστοχίας.
ct mark set meta mark meta mark set ct mark
Γράψτε την κατεύθυνση δίπλα στον κανόνα, γιατί δεν είναι προφανής από τη σύνταξη με την πρώτη ματιά. Η πρώτη γραμμή αποθηκεύει, η δεύτερη αποκαθιστά, και καμία δεν συνεπάγεται την άλλη.
Ταξινομήστε πριν από την αναζήτηση που το καταναλώνει
Η κίνηση που παράγεται τοπικά και η κίνηση που προωθείται από ένα LAN περνούν από διαφορετικά hooks και φτάνουν σε αποφάσεις δρομολόγησης σε διαφορετικές στιγμές. Ένας κανόνας εξόδου που λειτουργεί για τις συνδέσεις του ίδιου του δρομολογητή δεν αποδεικνύει ότι το πακέτο ενός προωθημένου πελάτη σημάνθηκε πριν από την αναζήτησή του. Βάλτε την ταξινόμηση εκεί όπου η αναζήτηση που την καταναλώνει δεν έχει συμβεί ακόμη, και ελέγξτε αν μεταγενέστεροι κανόνες στην ίδια αλυσίδα αντικαθιστούν την τιμή. Η σειρά μέσα σε μια αλυσίδα είναι μέρος της διαμόρφωσης, όχι λεπτομέρεια υλοποίησης.
Η διατήρηση της κατάστασης σύνδεσης χρειάζεται επίσης ρητό σχέδιο. Αν ταξινομηθεί μόνο το πρώτο πακέτο μιας ροής, τα μεταγενέστερα πακέτα χρειάζονται την αποκατάσταση του αποθηκευμένου σημαδιού, αλλιώς θα πάρουν τη διαδρομή χωρίς σημάδι. Αυτή είναι η διαφορά ανάμεσα σε ένα σημάδι που περιγράφει μια σύνδεση και σε ένα που περιγράφει ένα πακέτο.
Ρωτήστε τη διαδρομή με σημαδεμένη ερώτηση
ip route get 10.77.0.10 mark 0x2
Εξετάστε τους κανόνες και τον πίνακα, μετά ρωτήστε τη διαδρομή με το σημάδι να περιλαμβάνεται, μαζί με την πηγή ή τη διεπαφή εισόδου όταν αυτές επηρεάζουν την πολιτική. Μια απλή αναζήτηση χωρίς σημάδι απαντά σε άλλη ερώτηση και θα αναφέρει ευχαρίστως τη διαδρομή που δεν θέλατε. Ελέγξτε τη μάσκα και την προτεραιότητα του κανόνα καθώς και την τιμή του, και επιβεβαιώστε ότι ο επιλεγμένος πίνακας περιέχει μια χρησιμοποιήσιμη διαδρομή.
Ένας μετρητής που αυξάνεται είναι απόδειξη ότι κάποιος κανόνας ταίριαξε με κάποιο πακέτο. Δεν είναι απόδειξη ότι το τελικό πακέτο έφερε το επιδιωκόμενο σημάδι στο σωστό σημείο απόφασης.
Διαβάστε το σημάδι, την κατεύθυνση, τον χρόνο και τη μάσκα. Τέσσερις έλεγχοι, και η διαδρομή παύει να είναι μυστήριο.