Ξεχωριστή έξοδος: πισίνα VPN στο usb0, κίνηση πύλης στο eth0
Οι προωθημένοι πελάτες VPN μπορούν να βγαίνουν από το usb0, ενώ η πύλη κρατά την προεπιλεγμένη διαδρομή eth0. Χτίστε έναν πλήρη επιλεγμένο πίνακα και μετά κάντε την αποτυχία να κλείνει αντί να διαρρέει.
Οι πελάτες συνδέονται και πιστοποιούνται, και μετά η κίνησή τους βγαίνει από λάθος ζεύξη, επειδή η μόνη προεπιλεγμένη διαδρομή στο μηχάνημα ανήκει στην ίδια την πύλη. Η αντικατάσταση αυτής της προεπιλογής θα έσπαγε τις ενημερώσεις και την πρόσβαση διαχείρισης του μηχανήματος, οπότε η επιλογή πρέπει να είναι στενότερη από «όλη την κίνηση». Η εφαρμόσιμη μορφή είναι ένας κανόνας πολιτικής με βάση την εσωτερική διεύθυνση προέλευσης της πισίνας πελατών, που δείχνει σε έναν δεύτερο πίνακα δρομολόγησης που κατέχει το εναλλακτικό WAN. Από εκεί και πέρα η λίστα ελέγχου αφορά την πληρότητα και τη συμπεριφορά αποτυχίας, όχι τον ίδιο τον κανόνα.
Επιβεβαιώστε ότι η διεύθυνση προέλευσης επιβιώνει ως την απόφαση δρομολόγησης
Ένας κανόνας πολιτικής που ταιριάζει με εύρος προέλευσης ενεργοποιείται μόνο όταν το πακέτο φέρει ακόμη αυτή την προέλευση τη στιγμή της αναζήτησης. Η προωθημένη κίνηση πελατών το κάνει, εφόσον τίποτα ανάντη δεν την έχει ξαναγράψει πριν από τη δρομολόγηση. Η κίνηση που παράγει η ίδια η πύλη δεν το κάνει, και γι’ αυτό ακριβώς η προεπιλεγμένη διαδρομή της πύλης μπορεί να μείνει εκεί που είναι.
Εδώ παραπλανούν οι τοπικές δοκιμές. Ένα curl στην πύλη είναι τοπικά παραγόμενη ροή με τη διεύθυνση της πύλης, οπότε παίρνει τον κύριο πίνακα και δεν αποδεικνύει τίποτα για τη διαδρομή του πελάτη. Δοκιμάστε από συνδεδεμένο πελάτη, ή παράγετε κίνηση με προέλευση που ανήκει πραγματικά στην πισίνα.
Ξεκινήστε γράφοντας τις πραγματικές τιμές: το πρόθεμα της πισίνας, τη διεπαφή σήραγγας που τη μεταφέρει, τη διεύθυνση και το επόμενο άλμα του δεύτερου WAN, και τον αριθμό πίνακα που σκοπεύετε να χρησιμοποιήσετε. Καθαρίστε τους παλιούς κανόνες από οποιαδήποτε προηγούμενη προσπάθεια πριν προσθέσετε νέους, γιατί διπλοί κανόνες σε διαφορετικές προτεραιότητες παράγουν αστοχίες που φαίνονται τυχαίες.
Χτίστε έναν επιλεγμένο πίνακα που είναι πλήρης
Ένας πίνακας δεν είναι προεπιλεγμένη διαδρομή με φίλο. Χρειάζεται αρκετές διαδρομές ώστε κάθε αναζήτηση να λύνεται μέσα του, μαζί με τη συνδεδεμένη διαδρομή για το υποδίκτυο WAN ώστε το επόμενο άλμα να είναι προσβάσιμο. Για πισίνα 10.77.0.0/24 στο tun1, διεύθυνση WAN 203.0.113.20/24 με επόμενο άλμα 203.0.113.1, και πίνακα 600:
ip -4 route replace 203.0.113.0/24 dev usb0 src 203.0.113.20 table 600
ip -4 route replace 10.77.0.0/24 dev tun1 table 600
ip -4 route replace default via 203.0.113.1 dev usb0 table 600
ip -4 rule add priority 1500 from 10.77.0.0/24 lookup 600
Ο κανόνας κάθεται σε προτεραιότητα κάτω από κάθε υπάρχοντα κανόνα σύλληψης όλων, οπότε οι ταιριαστοί πελάτες χτυπούν πρώτα τον πίνακα 600 και όλα τα άλλα πέφτουν στον κύριο πίνακα. Η αναφορά του ip-rule περιγράφει πλήρως το μοντέλο διατεταγμένης αναζήτησης και τη σύνταξη του επιλογέα.
Σκεφτείτε μετά τι δεν περιέχει ο πίνακας. Ένας προορισμός που έχει διαδρομή μόνο στον κύριο πίνακα, όπως ένα υποδίκτυο διαχείρισης προσβάσιμο μέσω eth0, δεν θα βρεθεί στον πίνακα 600 και δεν θα επιστρέψει στον κύριο μόλις υπάρξει εκεί προεπιλεγμένη διαδρομή. Αν αυτές οι διαδρομές μετράνε, προσθέστε τις ρητά στον επιλεγμένο πίνακα, που συνήθως είναι η σωστή απάντηση για πίνακα εξόδου VPN.
Κρατήστε την κίνηση του ίδιου του ακροατή έξω από την πολιτική
Ο ακροατής OpenVPN έχει τη δική του εξωτερική σύνδεση, που μεταφέρεται από όποια ζεύξη τον προσέγγισε ο πελάτης. Αυτή η κίνηση πρέπει να κρατήσει την επιστροφική διαδρομή με την οποία ήρθε, και ένας ευρύς κανόνας που καλύπτει τη δημόσια διεύθυνση του διακομιστή ή ολόκληρη τη διεπαφή σήραγγας μπορεί να τη σύρει στον εναλλακτικό πίνακα. Περιορίστε τον κανόνα στην εσωτερική πισίνα και σε τίποτα άλλο.
Το φιλτράρισμα αντίστροφης διαδρομής αξίζει μια ματιά για τον ίδιο λόγο. Όταν οι απαντήσεις προς τους πελάτες βγαίνουν από το usb0 ενώ το αίτημα ήρθε από άλλη ζεύξη, μια αυστηρή ρύθμιση rp_filter μπορεί να ρίξει πακέτα που η πολιτική δρομολόγησης θεωρεί έγκυρα. Ελέγξτε τις ενεργές τιμές sysctl στις δύο διεπαφές πριν συμπεράνετε ότι ο κανόνας απέτυχε.
Η σειρά μετράει και ως προς οτιδήποτε άλλο στο μηχάνημα. Οι γέφυρες Docker, ένα δεύτερο VPN και τυχόν προϋπάρχοντες κανόνες από image παρόχου προσθέτουν προτεραιότητες, οπότε διαβάστε την πλήρη λίστα κανόνων αντί να υποθέσετε ότι η προτεραιότητα 100 είναι μόνη.
Κάντε την προώθηση και τη μετάφραση να συμφωνούν με τη διαδρομή
Η δρομολόγηση επιλέγει ζεύξη· δεν παρέχει άδεια προώθησης. Ο πυρήνας πρέπει να έχει ενεργή την προώθηση IPv4, και το τείχος προστασίας πρέπει να δέχεται την κατεύθυνση από πελάτη προς WAN και την κίνηση επιστροφής. Ένας σωστός πίνακας με αλυσίδα FORWARD που ρίχνει τη ροή δίνει το ίδιο σύμπτωμα με μια απούσα διαδρομή, γι’ αυτό ελέγχονται και τα δύο στο ίδιο πέρασμα.
Αν το δεύτερο WAN δεν δρομολογεί ιδιωτική πισίνα πίσω σε εσάς, μεταφράστε την προέλευση σε εκείνη την έξοδο. Για διεπαφή με δυναμική διεύθυνση, η συνηθισμένη επιλογή είναι ένας στενός κανόνας masquerade περιορισμένος στην πισίνα και τη διεπαφή:
iptables -t nat -A POSTROUTING -s 10.77.0.0/24 -o usb0 -j MASQUERADE
Εδώ το εύρος μετράει περισσότερο από τον στόχο. Ένας κανόνας masquerade που ταιριάζει με οποιαδήποτε εξερχόμενη διεπαφή θα ξαναγράψει και κίνηση που βγαίνει σωστά από το eth0, και αυτό κρύβει λάθη δρομολόγησης αντί να τα διορθώνει. Η μετάφραση τρέχει μετά την απόφαση δρομολόγησης, οπότε δεν μπορεί ποτέ να επιδιορθώσει πακέτο που στάλθηκε σε λάθος ζεύξη.
Το κόστος της σήραγγας χρειάζεται επίσης προσοχή όταν οι διαδρομές διαφέρουν. Αν οι πελάτες διαπραγματευτούν μεγάλο TCP MSS και το εναλλακτικό WAN έχει χαμηλότερο MTU ή σήραγγα μέσα του, τα μεγάλα τμήματα κολλάνε ενώ τα μικρά δουλεύουν. Το κλείδωμα του MSS στη διαδρομή προώθησης το κάνει προβλέψιμη συμπεριφορά αντί για περιστασιακό κόλλημα.
Αποφασίστε τι συμβαίνει όταν εξαφανιστεί το usb0
Ένας άδειος πίνακας δεν είναι κατάσταση κλεισίματος σε αποτυχία. Αν η ταιριαστή διαδρομή εξαφανιστεί, η αναζήτηση συνεχίζει στον επόμενο κανόνα, φτάνει στον κύριο πίνακα και παίρνει την προεπιλεγμένη του eth0. Η κίνηση που έπρεπε να βγει από το δεύτερο WAN βγαίνει ήσυχα από το πρώτο, κάτι που σε ανάπτυξη με δρομολόγηση πολιτικής είναι συνήθως το αποτέλεσμα που θέλετε λιγότερο.
Όπου αυτή η επιστροφή είναι απαράδεκτη, προσθέστε ρητή τερματική διαδρομή στον πίνακα 600, όπως προεπιλεγμένη blackhole, ή ρίξτε την πισίνα στο τείχος προστασίας όσο η διεπαφή είναι κάτω. Οποιαδήποτε από τις δύο είναι απόφαση που μπορείτε να γράψετε· η σιωπή δεν είναι.
Η επιμονή είναι το τελευταίο στοιχείο. Όποιος κατέχει και τις δύο ζεύξεις, είτε είναι ο διαχειριστής δικτύου, είτε script αποστολέα, είτε ο κύκλος ζωής της σύνδεσης, πρέπει να ξαναφτιάχνει τις διαδρομές και τον κανόνα σε κάθε επανασύνδεση χωρίς να προσθέτει διπλότυπα. Επαληθεύστε με αίτημα από πραγματικό πελάτη και ξεχωριστό αίτημα από την πύλη, επιβεβαιώστε την παρατηρούμενη έξοδο και στα δύο, μετά τραβήξτε το δεύτερο WAN και δείτε ποιο από τα δύο αποτελέσματα που σχεδιάσατε συμβαίνει πραγματικά. Το IPv6 χρειάζεται δικό του πίνακα, κανόνα και μετάφραση· ο κανόνας IPv4 παραπάνω δεν λέει τίποτα γι’ αυτό.