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

Μια διαδρομή προς την κοινόχρηστη υπηρεσία δεν είναι άδεια μεταξύ ομοτίμων

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

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

Γράψτε την απαίτηση σε μία γραμμή πριν ανοίξετε τερματικό. Φτάστε στο μπλοκ υπηρεσιών και στον κεντρικό υπολογιστή αναπήδησης, μη φτάσετε σε τίποτα άλλο μέσα στο μπλοκ πελατών.

Βρείτε ποιος προωθεί πραγματικά το πακέτο μεταξύ ομοτίμων

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

Το WireGuard ανήκει στην πρώτη ομάδα: δεν έχει διακόπτη μεταξύ ομοτίμων, οπότε ένα πακέτο από 10.8.0.4 προς 10.8.0.5 φτάνει στο wg0, χτυπά το άγκιστρο προώθησης και δρομολογείται ξανά έξω από το wg0 όταν το AllowedIPs καλύπτει και τις δύο διευθύνσεις. Το OpenVPN είναι η δεύτερη ομάδα μόλις οριστεί το client-to-client στη ρύθμιση του διακομιστή, γιατί αυτή η οδηγία παραδίδει το πακέτο μεταξύ συνεδριών στον χώρο χρήστη. Ελέγξτε τη φορτωμένη ρύθμιση για αυτή την οδηγία πριν γράψετε οτιδήποτε. Ένας κανόνας πυρήνα που δεν βλέπει ποτέ κίνηση δεν ξεχωρίζει από έναν κανόνα που δουλεύει, και έτσι μια ανάπτυξη καταλήγει χωρίς καμία απομόνωση.

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

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

Δώστε σε κάθε διεύθυνση ταυτότητα που ανακαλείται μόνη της

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

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

Τοποθετήστε την απαγόρευση εκεί όπου το πακέτο διασχίζει το τούνελ

Σε πύλη που προωθεί κίνηση WireGuard, δύο κανόνες καλύπτουν την περίπτωση: επιτρέψτε το μπλοκ υπηρεσιών και μετά απορρίψτε το υπόλοιπο μπλοκ πελατών. Το ζεύγος διεπαφών μετράει όσο και οι διευθύνσεις, γιατί η αντιστοίχιση μόνο στον προορισμό πιάνει και κίνηση που έρχεται από το LAN. Φορτώστε τους με αυτή τη σειρά ώστε η άδεια να αξιολογηθεί πρώτη.

Με nftables το ζεύγος μπαίνει σε υπάρχοντα πίνακα inet filter, πρώτα άδεια και μετά απόρριψη. Και οι δύο αντιστοιχίσεις καρφώνουν το ζεύγος διεπαφών καθώς και τις διευθύνσεις.

nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.2.0/24 accept
nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.0.0/24 drop

Διαβάστε την αλυσίδα πίσω μετά τη φόρτωση αντί να εμπιστεύεστε την κατάσταση εξόδου, και επιβεβαιώστε ότι και οι δύο κανόνες στέκονται στη σειρά που σκοπεύατε. Προσθέστε αντίστοιχους κανόνες ip6 για τη δεξαμενή IPv6, αλλιώς το ζεύγος v4 είναι διακοσμητικό σε τούνελ διπλής στοίβας. Αν ο διακομιστής έχει ήδη επιτρεπτική πολιτική προώθησης, προσθέστε την απόρριψη αντί να αντικαταστήσετε ολόκληρη την αλυσίδα.

Όταν το client-to-client είναι ενεργό στο OpenVPN, αυτοί οι κανόνες προώθησης δεν ταιριάζουν ποτέ με κίνηση μεταξύ ομοτίμων και η απαγόρευση πρέπει να ζει στους δικούς του ελέγχους του δαίμονα. Κρατήστε τους κανόνες πυρήνα για κίνηση προς τον κεντρικό υπολογιστή, αλλά μην τους μετράτε ως έλεγχο απομόνωσης.

Αποδείξτε την απαγόρευση από πελάτη, όχι από τον διακομιστή

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

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

ping -c 3 -W 2 10.8.0.5
nc -z -w 2 10.8.0.5 22
nft list chain inet filter forward
iptables -vnL FORWARD
ping -6 -c 3 -W 2 fd00:8::5

Ένα απορριφθέν πακέτο και ένας ομότιμος εκτός σύνδεσης μοιάζουν και τα δύο με λήξη χρόνου, οπότε ελέγξτε τους μετρητές πριν βγάλετε συμπέρασμα. Επιβεβαιώστε ότι ο μετρητής του κανόνα απόρριψης αυξάνεται ενώ ο ομότιμος είναι αποδεδειγμένα ενεργός. Επαναλάβετε μέσω IPv6, όπου ένας κανόνας ip6 που λείπει αφήνει την απαγόρευση v4 να φαίνεται αποτελεσματική. Καταγράψτε τα αποδεκτά και απορριφθέντα αποτελέσματα στο εγχειρίδιο με την ημερομηνία, γιατί η επόμενη μετανάστευση θα ξαναβγάλει τον κανόνα.

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