Γιατί ένας πελάτης VPN στο τοπικό δίκτυο του γραφείου χάνει κάθε απάντηση
Ένας φορητός υπολογιστής στο τοπικό δίκτυο του γραφείου και σε σήραγγα στο ίδιο υποδίκτυο απαντά από τη λάθος διεπαφή. Το χαλαρό φιλτράρισμα αντίστροφης διαδρομής εξηγεί τη σιωπή.
Ένας φορητός υπολογιστής κάθεται στο /24 του γραφείου μέσω Ethernet και ταυτόχρονα συνδέεται σε διακομιστή OpenVPN που ζει στο ίδιο /24. Ένας συνάδελφος κάνει ping στη διεύθυνση της σήραγγας· το αίτημα φτάνει καθαρά και τίποτα δεν επιστρέφει. Το αρχείο καταγραφής της σήραγγας είναι καθαρό και η περιήγηση λειτουργεί ακόμη, άρα η σήραγγα είναι ο λάθος ύποπτος. Η επικύρωση προέλευσης IPv4 στο μηχάνημα που λαμβάνει πετάει το πακέτο πριν το διαβάσει οτιδήποτε.
Η απόρριψη συμβαίνει πριν οτιδήποτε διαβάσει το πακέτο
Η επικύρωση προέλευσης κάνει μία ερώτηση για κάθε εισερχόμενο πακέτο: αν αυτός ο κεντρικός υπολογιστής απαντούσε σε εκείνη την προέλευση, θα έβγαινε η απάντηση από τη διεπαφή στην οποία μόλις έφτασε το πακέτο; Όταν η απάντηση είναι όχι, ο πυρήνας πετάει το πακέτο κατά την άφιξη. Ούτε υποδοχή ούτε διαδρομή προώθησης το βλέπει ποτέ, γι’ αυτό μια καταγραφή στη σήραγγα εξακολουθεί να καταγράφει αίτημα που η εφαρμογή δεν λαμβάνει ποτέ.
Ο πελάτης εδώ κρατά 10.66.0.9 στη σήραγγά του, και ο διακομιστής OpenVPN απαντά στη 192.168.80.10 μέσα στο πρόθεμα του γραφείου. Ένας συνάδελφος στη 192.168.80.25 κάνει ping στη διεύθυνση της σήραγγας, οπότε το αίτημα διασχίζει το τοπικό δίκτυο, ο διακομιστής το δρομολογεί στη σήραγγα και φτάνει στη διεπαφή σήραγγας του πελάτη φέροντας διεύθυνση προέλευσης του γραφείου. Στον πίνακα δρομολόγησης εκείνου του μηχανήματος το πρόθεμα του γραφείου ανήκει στη συσκευή Ethernet, όχι στη σήραγγα. Η επικύρωση συγκρίνει τη διεπαφή άφιξης με τη διαδρομή, βρίσκει ασυμφωνία και απορρίπτει το πακέτο, οπότε ο συνάδελφος βλέπει πλήρη απώλεια ενώ και τα δύο άκρα αναφέρουν υγιή σήραγγα.
Η κατοπτρική κατεύθυνση έχει το ίδιο σχήμα: όταν ο πελάτης ξεκινά προς το γραφείο, οι απαντήσεις μπορούν να απορριφθούν στην πλευρά του γραφείου για τον ίδιο ακριβώς λόγο. Μια διόρθωση που επαληθεύεται μόνο προς μία κατεύθυνση τείνει να επιστρέφει ως δεύτερο δελτίο.
Αποδείξτε την ισχύουσα λειτουργία πριν αγγίξετε οποιοδήποτε sysctl
Διαβάστε τις πραγματικές τιμές αντί να εμπιστεύεστε μια προεπιλογή διανομής, γιατί η ρύθμιση ανά διεπαφή είναι μόνο το μισό της απόφασης. Η ισχύουσα λειτουργία είναι η μεγαλύτερη από την τιμή της διεπαφής και την τιμή του all, άρα ένα μηδέν στη διεπαφή της σήραγγας δεν σημαίνει τίποτα όσο το all είναι ένα. Η απόφαση της αυστηρής λειτουργίας είναι απόφαση δρομολόγησης, οπότε εκτελέστε την αναζήτηση που εκτελεί ο πυρήνας και συγκρίνετε την απάντησή της με τη διεπαφή στην οποία έφτασε πράγματι το πακέτο.
tcpdump -ni tun0 icmp and host 192.168.80.25
ip route get 192.168.80.25
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.tun0.rp_filter
Στη συνέχεια επαναλάβετε το ping παρακολουθώντας τον μετρητή σφαλμάτων. Ένας μετρητής που ανεβαίνει δίπλα σε αίτημα που η καταγραφή ήδη δείχνει είναι η υπογραφή αυτής της απόρριψης, όχι μιας διαδρομής που λείπει. Ενεργοποιήστε την καταγραφή αρειανών πακέτων όσο είστε εκεί, ώστε ο πυρήνας να ονομάσει την προέλευση και τη διεπαφή που απέρριψε. Μαζί αποκλείουν τον κρυπτογράφημα, το τείχος προστασίας και ένα iroute που λείπει ως εξηγήσεις.
Γράψτε τη βάση πριν αλλάξετε οτιδήποτε: και τις δύο τιμές, τη συσκευή που επέλεξε η αναζήτηση και τον μετρητή που παρακολουθούσατε. Αυτή η καταγραφή είναι που σας λέει αργότερα αν η αλλαγή έκανε αυτό που νομίζετε.
Τι δέχεται πραγματικά κάθε λειτουργία του rp_filter
Ο πυρήνας εκθέτει τρεις τιμές ανά διεπαφή, και δεν είναι τρεις αποχρώσεις ενός κανόνα. Το μηδέν απενεργοποιεί τον έλεγχο. Το ένα είναι αυστηρό και απαιτεί η προέλευση να δρομολογείται πίσω από τη διεπαφή άφιξης. Το δύο είναι χαλαρό και απαιτεί μόνο να υπάρχει κάποια διαδρομή προς την προέλευση στον πίνακα, όπου κι αν δείχνει.
| Value | Name | Accepts | Still rejects |
|---|---|---|---|
| 0 | off | any source at all | nothing on this check |
| 1 | strict | a source routed back out the arrival interface | a source whose route points elsewhere |
| 2 | loose | a source with any route in the table | a source with no route at all |
Η γραμμή που έχει σημασία εδώ είναι η χαλαρή, και αυτό που εξακολουθεί να απορρίπτει. Μια πλαστή προέλευση που δρομολογείται οπουδήποτε στον πίνακά σας περνά, ενώ μια προέλευση χωρίς καμία διαδρομή απορρίπτεται ακόμη. Σε φορητό υπολογιστή αυτό είναι μια στενή παραχώρηση· σε δρομολογητή που προωθεί κίνηση άλλων είναι ευρεία. Η λειτουργία ανήκει στον κεντρικό υπολογιστή, άρα ο ίδιος αριθμός φέρει διαφορετικό βάρος στα δύο σημεία.
Ποια γραμμή χρειάζεται αυτή η τοπολογία προκύπτει από τον πίνακα και όχι από συνήθεια. Το πακέτο είναι νόμιμο και η προέλευσή του δρομολογείται, άρα η χαλαρή το δέχεται και η αυστηρή όχι. Τίποτα στην υπόθεση δεν απαιτεί μηδέν, και η επιλογή μηδέν θα αφαιρούσε έναν έλεγχο που εδώ δεν κοστίζει τίποτα.
Διαλέξτε τη μικρότερη αλλαγή που αφαιρεί την ασάφεια
Η χαλαρή λειτουργία είναι η μικρότερη αλλαγή που ταιριάζει, και είναι πραγματική μείωση της αυστηρότητας, όχι ακίνδυνος διακόπτης. Καλύτερη επιλογή υπάρχει όποτε το επιτρέπει η τοπολογία: αφαιρέστε την επικάλυψη και η ασάφεια εξαφανίζεται.
Όπου το πρόθεμα του γραφείου χρειάζεται μόνο μέσω Ethernet, αφαιρέστε το από τις διαδρομές που τραβά το προφίλ και η διεύθυνση γίνεται προσβάσιμη από ένα μόνο μονοπάτι. Όταν και τα δύο μονοπάτια πρέπει πραγματικά να συνυπάρχουν, καρφιτσώστε την προέλευση και τη συσκευή με κανόνα πολιτικής αντί να χαλαρώνετε την επικύρωση σε κάθε διεπαφή. Αυτό κρατά αυστηρό φιλτράρισμα για όλα τα άλλα στο μηχάνημα και τεκμηριώνει την εξαίρεση εκεί όπου ο επόμενος μηχανικός θα την αναζητήσει.
Όποιο δρόμο κι αν διαλέξετε, καταγράψτε τον σε ένα drop-in του sysctl και όχι σε ζωντανή εντολή. Ορίστε τα κλειδιά all και default μαζί, ώστε μια επανασύνδεση να μην μπορεί να επαναφέρει ήσυχα την αυστηρή λειτουργία.
# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system
Τι θυσιάζει η χαλαρή λειτουργία, και πού
Η χαλαρή λειτουργία εξακολουθεί να απορρίπτει προέλευση που καμία διαδρομή δεν θα μπορούσε να φτάσει, και σταματά να απορρίπτει πλαστή προέλευση που τυχαίνει να δρομολογείται. Σε φορητό υπολογιστή αυτό είναι μια στενή παραχώρηση. Σε συσκευή που προωθεί κίνηση που δεν της ανήκει, η ίδια επιλογή είναι πολύ ευρύτερη. Άρα η ίδια ρύθμιση φέρει δύο πολύ διαφορετικές σημασίες ανάλογα με το πού εκτελείται.
Το να σβήσετε τον έλεγχο εντελώς σε κεντρικό υπολογιστή που προωθεί κίνηση για άλλους είναι η μία διόρθωση που πρέπει να αποφύγετε. Το μηδέν πετάει την επικύρωση που η χαλαρή λειτουργία κρατά προσεκτικά. Αν ο κεντρικός υπολογιστής προωθεί για άλλους, υποστηρίξτε αντ’ αυτού την επιλογή του κανόνα πολιτικής από την προηγούμενη ενότητα.
Αφήστε ένα σημείωμα που ονομάζει τις δύο διεπαφές, το επικαλυπτόμενο πρόθεμα και τη δοκιμή που τώρα πετυχαίνει. Αυτό είναι χρησιμότερο για τον επόμενο μηχανικό από μια γραμμή που λέει ότι το φιλτράρισμα προσαρμόστηκε.