Πέρασα ένα πρωινό με μια σήραγγα που σηκώθηκε καθαρά και μετέφερε κίνηση προς μία ακριβώς κατεύθυνση: το υποκατάστημα έφτανε στον διακομιστή αρχείων στα κεντρικά, και κάθε σύνδεση που ανοιγόταν από τα κεντρικά προς το υποκατάστημα πέθαινε στο πρώτο SYN. Τα SA ήταν ενεργά, οι μετρητές της σήραγγας ανέβαιναν, και η χειραψία δεν ήταν ποτέ το πρόβλημα. Η απάντηση δρομολογούνταν κάπου που η σήραγγα δεν καλύπτει, και αυτή η επιλογή ανήκει στην απομακρυσμένη πλευρά. Ένα VPN τοποθεσίας-σε-τοποθεσία μεταφέρει μόνο τα πακέτα που παραδίδει ένας κόμβος στην πύλη, και κάθε κόμβος κάνει αυτή την επιλογή χωριστά, σε κάθε κατεύθυνση, από τον δικό του πίνακα δρομολόγησης.

Οι δύο κατευθύνσεις δρομολογούνται χωριστά

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

Αυτή η συμφωνία είναι η δεύτερη πύλη. Στο strongSwan οι επιλογείς κίνησης είναι τα leftsubnet και rightsubnet, και ένα πακέτο του οποίου η πηγή ή ο προορισμός πέφτει έξω από το διαπραγματευμένο ζεύγος δεν κρυπτογραφείται, ό,τι κι αν λέει ο πίνακας δρομολόγησης. Ένα πρόθεμα που δρομολογείται στη σήραγγα αλλά λείπει από τους επιλογείς είναι μια ήσυχη μονόδρομη αποτυχία: η διαδρομή φαίνεται σωστή, το πακέτο φεύγει ακόμη καθαρό ή απορρίπτεται, και μόνο το αρχείο καταγραφής του charon διαμαρτύρεται.

Ο απομακρυσμένος κόμβος δεν γνωρίζει τίποτα για τη σήραγγά σας

Μέσα στο απομακρυσμένο LAN η απάντηση είναι ένα συνηθισμένο πακέτο που απευθύνεται στον πελάτη σας. Ο κόμβος προορισμού δεν βλέπει καμία κεφαλίδα IPsec και δεν έχει λόγο να προτιμήσει την πύλη VPN· αναζητά το πρόθεμά σας, δεν βρίσκει τίποτα πιο συγκεκριμένο από την προεπιλεγμένη διαδρομή του και την ακολουθεί. Αν η προεπιλογή δείχνει σε ένα τείχος προστασίας κορμού, το τείχος ή έχει διαδρομή πίσω στη σήραγγα ή δεν έχει. Όταν δεν έχει, παίρνετε μια ήσυχη απόρριψη, ένα ICMP unreachable ή μια απάντηση που φεύγει από τη διεπαφή προς το διαδίκτυο και πεθαίνει.

Μια δεύτερη διεπαφή αρκεί για να σπάσει αυτό ακόμη και όταν υπάρχει διαδρομή. Ένα NAS με σύνδεσμο διαχείρισης σε άλλο VLAN, ένας διακομιστής με εφεδρικό uplink, ένας κανόνας πολιτικής που στέλνει ένα εύρος πηγών σε δεύτερο πίνακα: οποιοδήποτε από αυτά μπορεί να αιχμαλωτίσει την απάντηση. Στο Linux, τα ip rule show και ip route show table all αποκαλύπτουν κανόνες και πίνακες που η προεπιλεγμένη λίστα κρύβει.

Διαβάστε την απόφαση στο μηχάνημα που στέλνει την απάντηση

Ρωτήστε τον πυρήνα πριν αλλάξετε οτιδήποτε, και δώστε του τη διεύθυνση πηγής, γιατί οι κανόνες που εξαρτώνται από την πηγή αλλάζουν την απάντηση.

ip route get 10.10.5.10 from 10.20.30.15
ip rule show
ip route show table all
ss -tn state established "( sport = :445 )"

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

Στα Windows τα αντίστοιχα είναι το Find-NetRoute -RemoteIPAddress 10.10.5.10 για την απόφαση και το Get-NetRoute για τον πίνακα. Μια διαδρομή που προστέθηκε με το New-NetRoute και φέρει υψηλότερη μετρική από την προεπιλεγμένη χάνει ήσυχα, οπότε διαβάστε τη στήλη μετρικής, όχι την εγγραφή. Μετά επιβεβαιώστε με πακέτα: το tcpdump -ni any "host 10.10.5.10 and tcp port 445" στη διεπαφή του απομακρυσμένου LAN δείχνει το αίτημα, και το ίδιο φίλτρο στην πλευρά της σήραγγας δείχνει αν γύρισε απάντηση. Αίτημα ορατό χωρίς απάντηση σημαίνει ότι η απάντηση δρομολογήθηκε αλλού ή απορρίφθηκε· μια απάντηση στη λάθος διεπαφή σας δίνει τον ένοχο πριν αγγίξετε διαδρομή.

Όταν η πύλη του διακομιστή δεν είναι το τελικό σημείο του VPN

Πολλές τοποθεσίες βάζουν τείχος προστασίας ανάμεσα στους διακομιστές και τον συγκεντρωτή. Αυτό το τείχος προωθεί την απάντηση, άρα χρειάζεται διαδρομή για το πρόθεμα του πελάτη σας προς την πύλη VPN, και πολιτική προώθησης και στις δύο κατευθύνσεις. Οι συσκευές με κατάσταση το χειροτερεύουν: το αίτημα πέρασε το τείχος από κόμβο LAN που επέτρεψε, η απάντηση φτάνει τώρα από άλλη κατεύθυνση, και η εγγραφή παρακολούθησης σύνδεσης δεν ταιριάζει πια, οπότε το πακέτο απορρίπτεται ως άκυρο και όχι ως απαγορευμένο. Γι’ αυτό το αρχείο πολιτικής φαίνεται κενό ενώ η κίνηση εξαφανίζεται.

Η πύλη έχει το δικό της δεύτερο φίλτρο. Το φιλτράρισμα αντίστροφης διαδρομής στο Linux απορρίπτει πακέτα των οποίων η πηγή δεν είναι προσβάσιμη μέσω της διεπαφής από την οποία έφτασαν, και αυτό είναι ακριβώς το σχήμα μιας νόμιμης ασύμμετρης διαδρομής επιστροφής. ο οδηγός προώθησης του strongSwan απαιτεί το net.ipv4.ip_forward και ένα χαλαρότερο net.ipv4.conf.all.rp_filter ακριβώς γι’ αυτόν τον λόγο. Μια αυστηρή τιμή 1 σε οποιαδήποτε πύλη σπάει ήσυχα μια σωστή διαδρομή, και το nstat -az δείχνει τις απορρίψεις αν ξέρετε πού να κοιτάξετε.

SymptomWhere the reply is most likely lost
Gateway ping works, LAN host silentSource address the far host cannot place in its table
SYN arrives, no SYN-ACK, tunnel counters flatNo route to the client prefix on the far host or its gateway
Reply counted on the internet-facing interfaceDefault route or policy rule on the far host
Firewall reports invalid stateAsymmetric path through a stateful device
Worked until a link failed overNew path is asymmetric, or rp_filter now rejects it

Δρομολογήστε ή μεταφράστε, μετά επαληθεύστε και στις δύο κατευθύνσεις

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

iptables -t nat -A POSTROUTING -o eth1 -s 10.20.30.0/24 -j MASQUERADE

Διαλέξτε το συνειδητά: μόλις οι πελάτες εμφανίζονται ως η διεύθυνση της πύλης, οι ACL με βάση την πηγή παύουν να τους ξεχωρίζουν, και το conntrack πρέπει να κρατά την αντιστοίχιση ώστε η απάντηση να ξαναγραφτεί πίσω στη σήραγγα. Αν οι επιλογείς εξακολουθούν να αποκλείουν το πρόθεμα του πελάτη, το NAT δεν αλλάζει τίποτα, γιατί το αίτημα δεν μπήκε ποτέ στη σήραγγα.

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

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