Τίποτα στο socket δεν θυμάται ποια διεπαφή μετέφερε το αίτημα, οπότε μια προεπιλεγμένη διαδρομή VPN πλήρους σήραγγας μπορεί να αιχμαλωτίσει μια απάντηση που ανήκει στο WAN. Η υπηρεσία δεν αγνοεί τη διεπαφή εισόδου· το Linux δρομολογεί μια τοπικά παραγόμενη απάντηση με βάση τον προορισμό και την πολιτική πηγής. Ένας κανόνας βάσει πηγής μπορεί αντίθετα να στέλνει μόνο τις απαντήσεις της υπηρεσίας μέσω πλήρους πίνακα WAN, αφήνοντας τη συνηθισμένη έξοδο στη σήραγγα. Η θύρα παραμένει ανοιχτή ενώ η απάντηση φεύγει από τη λάθος διαδρομή, γι’ αυτό το σύμπτωμα φαίνεται μονόπλευρο.

Η παρανόηση: οι απαντήσεις ακολουθούν τη διεπαφή από την οποία ήρθαν

Φαίνεται λογικό ένα πακέτο που φτάνει στο eth0 να φεύγει από το eth0. Τα φίλτρα πακέτων χωρίς κατάσταση μπορούν να γραφτούν έτσι, και το tcpdump στην πλευρά εισόδου δείχνει το αίτημα ακριβώς εκεί που αναμένεται. Η δρομολόγηση δεν λειτουργεί έτσι για την κίνηση που δημιουργεί ο ίδιος ο κεντρικός υπολογιστής.

Μόλις η υπηρεσία δεχτεί τη σύνδεση, η απάντησή της είναι ένα νέο τοπικά παραγόμενο πακέτο. Ο πυρήνας συμβουλεύεται τους κανόνες δρομολόγησης για τον προορισμό και την πηγή της απάντησης, και η προεπιλεγμένη διαδρομή του VPN είναι μια απολύτως έγκυρη απάντηση. Τίποτα στο socket δεν θυμάται ποια διεπαφή μετέφερε το αίτημα.

Γι’ αυτό το σύμπτωμα φαίνεται μονόπλευρο: τα αιτήματα φτάνουν, οι απαντήσεις εξαφανίζονται. Γι’ αυτό και η προσθήκη κανόνα firewall για τη θύρα εισόδου δεν αλλάζει τίποτα. Το πακέτο δεν μπλοκάρεται στην είσοδο· δρομολογείται αλλού στην έξοδο. Ακολουθήστε την απάντηση με αναζήτηση προσδιορισμένη ως προς την πηγή και η παράκαμψη γίνεται ορατή.

Τι δρομολογεί στην πραγματικότητα ο πυρήνας: η διεύθυνση πηγής

Η λαβή που χρειάζεστε είναι η τοπική διεύθυνση που χρησιμοποιεί η υπηρεσία για τις απαντήσεις. Σε έναν κεντρικό υπολογιστή με την ενδεικτική διεύθυνση eth0 192.0.2.10/24 και πύλη 192.0.2.1, αυτή η διεύθυνση υπάρχει στη διεπαφή. Σε ένα cloud VM, η δημόσια διεύθυνση μπορεί να μεταφράζεται ανάντη και να απουσιάζει από το φιλοξενούμενο σύστημα, οπότε χρησιμοποιήστε τη διεύθυνση που κατέχει πραγματικά ο κεντρικός υπολογιστής.

Εξετάστε την τρέχουσα κατάσταση πριν δεσμεύσετε αριθμό πίνακα ή προτεραιότητα κανόνα. Οι υπάρχοντες κανόνες πολιτικής μπορούν να επισκιάσουν έναν νέο, και ένας παλιός πίνακας με τον ίδιο αριθμό μπορεί να φέρει ήδη άσχετες διαδρομές:

ip -4 addr show dev eth0
ip -4 rule show
ip -4 route show table all

Στη συνέχεια επιλέξτε πίνακα κατά πηγή. Ο κανόνας ταιριάζει με απαντήσεις που φέρουν ήδη 192.0.2.10, ακριβώς την τοπικά τερματισμένη κίνηση που θέλετε να εξαιρέσετε. Η προωθημένη κίνηση και τα πακέτα από άλλες τοπικές διευθύνσεις δεν ταιριάζουν.

Χτίστε πλήρη πίνακα επιστροφής, όχι μισή προεπιλεγμένη διαδρομή

Ένας πίνακας με μόνο μια προεπιλεγμένη διαδρομή δεν αρκεί. Ο πυρήνας πρέπει ακόμα να επιλύσει την πύλη, και αυτή η επίλυση χρειάζεται το συνδεδεμένο πρόθεμα στον ίδιο πίνακα. Ένας πίνακας που του λείπει αυτό το πρόθεμα αποτυγχάνει στην επίλυση της πύλης ακόμη και όταν η προεπιλεγμένη διαδρομή του φαίνεται σωστή. Προσθέστε και τα δύο και μετά κατευθύνετε τον κανόνα πηγής στον πίνακα:

ip -4 route add table 100 192.0.2.0/24 dev eth0 src 192.0.2.10
ip -4 route add table 100 default via 192.0.2.1 dev eth0
ip -4 rule add priority 1000 from 192.0.2.10/32 lookup 100

Χρησιμοποιήστε το πραγματικό πρόθεμα και την πραγματική πύλη αντί να αντιγράψετε το παράδειγμα. Μια cloud διεπαφή ρυθμισμένη ως /32 με πύλη on-link χρειάζεται διαφορετική συνδεδεμένη διαδρομή, και ένας πίνακας χτισμένος από λάθος πρόθεμα αποτυγχάνει στο πρώτο άλμα. Το χαρακτηριστικό src δηλώνει την προτιμώμενη πηγή για αυτή τη διαδρομή· δεν αντικαθιστά τον κανόνα πηγής.

Και η σειρά έχει σημασία. Ένας ευρύς κανόνας με χαμηλότερο αριθμό προτεραιότητας αξιολογείται πρώτος, οπότε ο κανόνας πηγής πρέπει να φτάνει πριν από οποιονδήποτε κανόνα που θα έστελνε αυτή την κίνηση πίσω στον κύριο πίνακα. Ελέγξτε τις προτεραιότητες με το ip rule show αφού τον προσθέσετε, όχι μόνο στην εκκίνηση.

Επαληθεύστε με αναζήτηση προσδιορισμένη ως προς την πηγή

Ζητήστε από τον πυρήνα να δρομολογήσει έναν δοκιμαστικό προορισμό από τη διεύθυνση της υπηρεσίας. Η απάντηση πρέπει να αναφέρει το eth0 και την πύλη WAN, όχι τη σήραγγα:

ip -4 route get 198.51.100.25 from 192.0.2.10

Στη συνέχεια δημιουργήστε μια νέα εξουσιοδοτημένη σύνδεση και παρατηρήστε και τις δύο κατευθύνσεις. Μια αναζήτηση που επιλέγει τον σωστό πίνακα ενώ η ζωντανή σύνδεση εξακολουθεί να αποτυγχάνει δείχνει φιλτράρισμα αντίστροφης διαδρομής ή κανόνα firewall, όχι τον πίνακα. Ελέγξτε αυτούς τους ελέγχους πριν απενεργοποιήσετε οτιδήποτε καθολικά.

Τοποθετήστε τις τελικές διαδρομές και τον κανόνα κάτω από τον διαχειριστή δικτύου που κατέχει τη διεπαφή. Οι αλλαγές διεύθυνσης, η ανανέωση DHCP και οι επανασυνδέσεις VPN ξαναγράφουν όλη την κατάσταση του πυρήνα, και ένας κανόνας που προστέθηκε με το χέρι εξαφανίζεται ή δείχνει σε παρωχημένη πύλη μετά το επόμενο συμβάν.

Πού σταματά αυτή η εξαίρεση

Ο κανόνας εξαιρεί τοπικά τερματισμένη κίνηση από μία διεύθυνση πηγής. Δεν καλύπτει θύρες που δημοσιεύει το Docker, DNAT ή υπηρεσίες που προωθούνται μέσω του κεντρικού υπολογιστή, γιατί αυτά τα πακέτα δρομολογούνται ως προωθημένη κίνηση και ποτέ δεν φέρουν την τοπική πηγή του κεντρικού υπολογιστή με τον ίδιο τρόπο. Τέτοια σχέδια συνήθως χρειάζονται ένα σημάδι που τίθεται στην είσοδο και έναν κανόνα που ταιριάζει με το σημάδι.

Επίσης δεν κάνει τη δημόσια διεύθυνση του κεντρικού υπολογιστή να εμφανιστεί στη διεπαφή. Όταν ένα ανάντη NAT κατέχει αυτή τη διεύθυνση, η απάντηση πρέπει ακόμα να φύγει από τη διαδρομή που περιμένει αυτό το NAT, γι’ αυτό ο πίνακας WAN πρέπει να αντιγράφει την αρχική πύλη και το πρόθεμα αντί για ένα μαντεμένο δημόσιο εύρος.

Κρατήστε την εξαίρεση τεκμηριωμένη με τον αριθμό πίνακα, την προτεραιότητα κανόνα και την ακριβή διεύθυνση πηγής. Η επόμενη αλλαγή στο VPN ή στη διεπαφή μπορεί να τη σπάσει σιωπηλά, και μια σημείωση που ονομάζει τις τρεις τιμές ελέγχεται γρηγορότερα από το να ξαναβρείτε το σύμπτωμα από μια αναφορά πελάτη.

Αν η υπηρεσία εξακολουθεί να απαντά στη λάθος διαδρομή αφού περάσει η αναζήτηση πηγής, συγκρίνετε τη διεύθυνση πηγής του ζωντανού socket με αυτή στον κανόνα. Μια υπηρεσία δεσμευμένη σε διεύθυνση μπαλαντέρ μπορεί να επιλέξει διαφορετική πηγή από τη διεύθυνση που δοκιμάσατε, και αυτή η αναντιστοιχία είναι το υπόλοιπο κενό.

Σχετικά άρθρα